diff --git a/docs/readme/README.ko.md b/docs/readme/README.ko.md index 697eca84d0e9..918d126137e0 100644 --- a/docs/readme/README.ko.md +++ b/docs/readme/README.ko.md @@ -230,7 +230,7 @@ yay -S stably-orca-bin 데스크톱 앱과 페어링해 휴대폰에서 에이전트를 모니터링하고 조종하세요. - **iOS:** [App Store에서 다운로드](https://apps.apple.com/us/app/orca-ide/id6766130217) 또는 [TestFlight 참여](https://testflight.apple.com/join/YjeGMQBA) -- **Android:** [APK 0.0.43 다운로드](https://github.com/stablyai/orca/releases/download/mobile-android-v0.0.43/app-release.apk) +- **Android:** [APK 0.0.43 다운로드](https://github.com/stablyai/orca/releases/download/mobile-android-v0.0.43/app-release.apk) · [설치 가이드](https://www.onorca.dev/docs/android-apk) --- diff --git a/src/main/git/worktree-shared-directories.test.ts b/src/main/git/worktree-shared-directories.test.ts index 97671c88fa63..ddcd123e87ed 100644 --- a/src/main/git/worktree-shared-directories.test.ts +++ b/src/main/git/worktree-shared-directories.test.ts @@ -1,8 +1,8 @@ import { execFileSync } from 'node:child_process' import { lstatSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' -import { devNull, tmpdir } from 'node:os' +import { tmpdir } from 'node:os' import { join } from 'node:path' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { clearConfiguredWorktreeSharedDirectoriesCacheForTests, getConfiguredWorktreeSharedDirectories, @@ -16,14 +16,25 @@ import { import { assertWorktreeCleanForRemoval } from './worktree' import { getStatus } from './status' +// Isolate git config with real empty files. os.devNull resolves to a +// Windows device path Git rejects as a config path ("fatal: unable to +// access '//./nul': Invalid argument") — every git call in this file +// failed on Windows while CI's Linux/macOS runners accepted /dev/null +// and stayed green (#15409). +const configDir = mkdtempSync(join(tmpdir(), 'orca-git-config-')) +const emptyGlobalConfig = join(configDir, 'global.gitconfig') +const emptySystemConfig = join(configDir, 'system.gitconfig') +writeFileSync(emptyGlobalConfig, '') +writeFileSync(emptySystemConfig, '') + const git = (args: string[], cwd: string): void => { execFileSync('git', args, { cwd, stdio: 'ignore', env: { ...process.env, - GIT_CONFIG_GLOBAL: devNull, - GIT_CONFIG_SYSTEM: devNull + GIT_CONFIG_GLOBAL: emptyGlobalConfig, + GIT_CONFIG_SYSTEM: emptySystemConfig } }) } @@ -50,8 +61,12 @@ describe('resolveWorktreeSharedDirectories', () => { }) afterEach(() => { - warn.mockRestore() - rmSync(repo, { recursive: true, force: true }) + warn?.mockRestore?.() + if (repo) rmSync(repo, { recursive: true, force: true }) + }) + + afterAll(() => { + rmSync(configDir, { recursive: true, force: true }) }) it('returns gitignored directories listed under worktree.sharedDirectories', async () => {