test(electron): unblock desktop/git tests on git 2.36 + stubbed electron

- git init --bare now takes -b main (7 sites): bare HEAD defaulted to a
  dangling master ref, so clone checked out nothing and `push origin main`
  couldn't resolve the refspec (surfaced as ENOENT + engine-crash).
- git-ipc.test.ts mocks electron: the file only tests pure helpers but
  imports via ipc-handlers, whose `import { ipcMain } from 'electron'`
  throws when electron's postinstall left path.txt missing.

Production code unchanged; worktree-merge.ts still requires git 2.36 for
--format=%(path) — addressed separately.
This commit is contained in:
Fini 2026-04-20 01:22:28 +08:00
parent aa755f13e0
commit cd25bd0cf9
3 changed files with 14 additions and 8 deletions

View file

@ -972,7 +972,7 @@ describe('git-engine', () => {
const aDir = join(temp.dir, 'a');
const bDir = join(temp.dir, 'b');
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
await execFileAsync('git', ['clone', remoteDir, aDir]);
await execFileAsync('git', ['-C', aDir, 'checkout', '-b', 'main']);
await fsp.writeFile(join(aDir, 'design.op'), '{"version":"1.0.0","children":[{"id":"r1"}]}');
@ -1106,7 +1106,7 @@ describe('git-engine', () => {
const remoteDir = join(temp.dir, 'remote.git');
const cloneDir = join(temp.dir, 'clone');
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
await execFileAsync('git', ['clone', remoteDir, cloneDir]);
await execFileAsync('git', ['-C', cloneDir, 'checkout', '-b', 'main']);
await fsp.writeFile(
@ -1804,7 +1804,7 @@ describe('git-engine', () => {
const aDir = join(temp.dir, 'a');
const bDir = join(temp.dir, 'b');
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
await execFileAsync('git', ['clone', remoteDir, aDir]);
await execFileAsync('git', ['-C', aDir, 'checkout', '-b', 'main']);
await fsp.writeFile(

View file

@ -1,5 +1,11 @@
// apps/desktop/git/__tests__/git-ipc.test.ts
import { describe, it, expect } from 'vitest';
import { describe, it, expect, vi } from 'vitest';
// The `electron` npm package's `index.js` resolves the binary path at import
// time and throws when its postinstall didn't run (path.txt missing). This
// file only exercises pure helpers, so we stub electron's ipc surface.
vi.mock('electron', () => ({ ipcMain: { handle: () => undefined } }));
import { GitError } from '../error';
import { serializeGitError, GIT_ERROR_MARKER } from '../ipc-handlers';

View file

@ -48,7 +48,7 @@ describe('git-sys real (gated on system git)', () => {
const cloneDir = join(temp.dir, 'clone');
// Set up: bare remote, source repo with one commit, push source → remote.
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
await fsp.mkdir(sourceDir, { recursive: true });
await execFileAsync('git', ['init', '-b', 'main', sourceDir]);
await fsp.writeFile(join(sourceDir, 'README.md'), '# test\n');
@ -74,7 +74,7 @@ describe('git-sys real (gated on system git)', () => {
const aDir = join(temp.dir, 'a');
const bDir = join(temp.dir, 'b');
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
// a: clone, commit, push
await execFileAsync('git', ['clone', remoteDir, aDir]);
await execFileAsync('git', ['-C', aDir, 'checkout', '-b', 'main']);
@ -114,7 +114,7 @@ describe('git-sys real (gated on system git)', () => {
const remoteDir = join(temp.dir, 'remote.git');
const cloneDir = join(temp.dir, 'clone');
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
await execFileAsync('git', ['clone', remoteDir, cloneDir]);
await execFileAsync('git', ['-C', cloneDir, 'checkout', '-b', 'main']);
await fsp.writeFile(join(cloneDir, 'a.txt'), 'a');
@ -143,7 +143,7 @@ describe('git-sys real (gated on system git)', () => {
const aDir = join(temp.dir, 'a');
const bDir = join(temp.dir, 'b');
await execFileAsync('git', ['init', '--bare', remoteDir]);
await execFileAsync('git', ['init', '--bare', '-b', 'main', remoteDir]);
// a: seed remote with one commit
await execFileAsync('git', ['clone', remoteDir, aDir]);
await execFileAsync('git', ['-C', aDir, 'checkout', '-b', 'main']);