The bundle-skew probe was runGit's only caller. With the probe on execGit (timeout, process-tree reap, GIT_NO_LAZY_FETCH), runGit is dead: an untimed, untracked spawn nothing should reach for again. Its spawn-failure path goes with it. describeGitSpawnFailure and the GIT_UNUSABLE marker had exactly one producer, runGit, and the only runGit caller swallowed every error, so the hermes:updates:check handler's git-unusable branch could not fire; nothing in the renderer reads it.
59 lines
2.1 KiB
TypeScript
59 lines
2.1 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
|
|
import { test } from 'vitest'
|
|
|
|
import { selectRunnableBinary } from './select-runnable-binary'
|
|
|
|
const yes = () => true
|
|
const no = () => false
|
|
|
|
test.each([
|
|
{
|
|
// The reported machine: Intel-only /usr/local/bin/git ahead on PATH of a
|
|
// working /usr/bin/git — it exists, so existence-only selection commits to
|
|
// it, and it fails at spawn with errno -86 (Bad CPU type in executable).
|
|
name: 'an existing but unlaunchable earlier candidate is skipped for a later one that runs',
|
|
candidates: ['/usr/local/bin/git', '/usr/bin/git'],
|
|
binaryRuns: (p: string) => p === '/usr/bin/git',
|
|
expected: '/usr/bin/git'
|
|
},
|
|
{
|
|
name: 'the first candidate wins when it both exists and runs',
|
|
candidates: ['/opt/homebrew/bin/gh', '/usr/local/bin/gh'],
|
|
binaryRuns: yes,
|
|
expected: '/opt/homebrew/bin/gh'
|
|
},
|
|
{
|
|
// Preserves pre-probe behaviour where the probe itself cannot run
|
|
// (locked-down execution policy, AV interposing on spawn) instead of
|
|
// skipping a binary that would have worked.
|
|
name: 'when no candidate runs, fall back to the first that exists',
|
|
candidates: ['/usr/local/bin/git', '/usr/bin/git'],
|
|
binaryRuns: no,
|
|
expected: '/usr/local/bin/git'
|
|
}
|
|
])('$name', ({ candidates, binaryRuns, expected }) => {
|
|
assert.equal(selectRunnableBinary({ candidates, fileExists: yes, binaryRuns }), expected)
|
|
})
|
|
|
|
test('missing candidates are never probed, and nothing existing yields null for the caller fallback', () => {
|
|
// Probing a non-existent path would cost a failed spawn per candidate.
|
|
const probed: string[] = []
|
|
|
|
const result = selectRunnableBinary({
|
|
candidates: ['/opt/homebrew/bin/gh', '/usr/local/bin/gh', '/usr/bin/gh'],
|
|
fileExists: (p: string) => p === '/usr/bin/gh',
|
|
binaryRuns: (p: string) => {
|
|
probed.push(p)
|
|
|
|
return true
|
|
}
|
|
})
|
|
|
|
assert.equal(result, '/usr/bin/gh')
|
|
assert.deepEqual(probed, ['/usr/bin/gh'])
|
|
|
|
assert.equal(selectRunnableBinary({ candidates: ['/opt/homebrew/bin/gh'], fileExists: no, binaryRuns: no }), null)
|
|
assert.equal(selectRunnableBinary({ candidates: [], fileExists: yes, binaryRuns: yes }), null)
|
|
})
|