mirror of
https://github.com/stablyai/orca.git
synced 2026-09-30 16:02:56 +00:00
Every changed-path gate asked git for `--merge-base "$BASE_SHA" "$HEAD_SHA"`, which needs the event payload's base SHA to be in the local graph. That is the only reason two jobs cloned all 8127 refs' history. On a pull_request checkout HEAD is already the merge commit, so its first parent is the base side and no merge base has to be computed. config/scripts/git-pull-request-diff-base.mjs resolved that for the two Node gates; the workflow's inline gates now use the same helper through a small CLI rather than open-coding it. code_paths gates all 22 jobs, so its checkout is charged to the start of every one of them: measured 20.7s to 1.6s, keeping blob:none because its sparse tree is ~7 files and leaves no blobs to refetch. Static analysis drops the filter instead, since populating all 30,226 files makes blob:none force a second promisor fetch: 23s to ~11s. Verified on a real merge ref. At depth 50 the old and new forms produce identical changed-file sets. At depth 2 the new form still works and the old one fails with `fatal: bad object`, which is the failure a stale base would have caused once the checkout stopped being complete. Also drops the dead resolveBase + merge-base prelude in the changed-code gate, whose result resolvePullRequestDiffBase already discarded on every PR.
37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
import { execFileSync } from 'node:child_process'
|
|
import process from 'node:process'
|
|
import { pathToFileURL } from 'node:url'
|
|
|
|
export function selectPullRequestDiffBase(requestedBase, headParents, eventName) {
|
|
if (eventName === 'pull_request' && headParents.length >= 2) {
|
|
return headParents[0]
|
|
}
|
|
return requestedBase
|
|
}
|
|
|
|
export function resolvePullRequestDiffBase(
|
|
root,
|
|
requestedBase,
|
|
eventName = process.env.GITHUB_EVENT_NAME
|
|
) {
|
|
const [, ...headParents] = execFileSync('git', ['rev-list', '--parents', '-n', '1', 'HEAD'], {
|
|
cwd: root,
|
|
encoding: 'utf8'
|
|
})
|
|
.trim()
|
|
.split(/\s+/)
|
|
return selectPullRequestDiffBase(requestedBase, headParents, eventName)
|
|
}
|
|
|
|
// Why a CLI: the workflow's inline gates used `git diff --merge-base "$BASE_SHA" "$HEAD_SHA"`,
|
|
// which needs the payload base to be reachable and so forced a full-history checkout. Printing
|
|
// the resolved base lets those steps diff against `HEAD^1` with the same logic the Node gates
|
|
// already use, instead of each one open-coding it.
|
|
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
const resolved = resolvePullRequestDiffBase(process.cwd(), process.argv[2])
|
|
if (!resolved) {
|
|
throw new Error('No diff base: pass the pull request base SHA, or run on a merge ref.')
|
|
}
|
|
process.stdout.write(`${resolved}\n`)
|
|
}
|