fix(release): fetch remote commit before self-upgrade
This commit is contained in:
@@ -77,12 +77,25 @@ export class GitWorkspaceManager {
|
|||||||
sourceMode === 'BRANCH'
|
sourceMode === 'BRANCH'
|
||||||
? [`refs/remotes/origin/${ref}^{commit}`, `refs/heads/${ref}^{commit}`]
|
? [`refs/remotes/origin/${ref}^{commit}`, `refs/heads/${ref}^{commit}`]
|
||||||
: [`${ref}^{commit}`];
|
: [`${ref}^{commit}`];
|
||||||
for (const candidate of candidates) {
|
const resolveCandidates = async (): Promise<string | undefined> => {
|
||||||
const result = await runGit(['rev-parse', '--verify', candidate], this.repoRoot, this.baseEnv);
|
for (const candidate of candidates) {
|
||||||
const commitSha = result.output.trim().split('\n')[0];
|
const result = await runGit(['rev-parse', '--verify', candidate], this.repoRoot, this.baseEnv);
|
||||||
if (result.ok && /^[0-9a-f]{40}$/i.test(commitSha)) {
|
const commitSha = result.output.trim().split('\n')[0];
|
||||||
return commitSha;
|
if (result.ok && /^[0-9a-f]{40}$/i.test(commitSha)) {
|
||||||
|
return commitSha;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
const localCommit = await resolveCandidates();
|
||||||
|
if (localCommit) return localCommit;
|
||||||
|
if (sourceMode === 'COMMIT') {
|
||||||
|
const fetched = await runGit(['fetch', '--all', '--tags'], this.repoRoot, this.baseEnv);
|
||||||
|
if (!fetched.ok) {
|
||||||
|
throw new Error(fetched.output || 'Failed to fetch git commits.');
|
||||||
|
}
|
||||||
|
const fetchedCommit = await resolveCandidates();
|
||||||
|
if (fetchedCommit) return fetchedCommit;
|
||||||
}
|
}
|
||||||
throw new Error(`${sourceMode === 'BRANCH' ? 'Branch' : 'Commit'} not found.`);
|
throw new Error(`${sourceMode === 'BRANCH' ? 'Branch' : 'Commit'} not found.`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,23 @@ describe('GitWorkspaceManager source resolution', () => {
|
|||||||
expect(await manager.resolveCommit('BRANCH', 'main')).toBe(secondCommit);
|
expect(await manager.resolveCommit('BRANCH', 'main')).toBe(secondCommit);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fetches a remote commit that is not present in the controller checkout yet', async () => {
|
||||||
|
const fixture = createRepositoryFixture();
|
||||||
|
const manager = new GitWorkspaceManager({
|
||||||
|
repoRoot: fixture.checkout,
|
||||||
|
worktreeRoot: fixture.worktrees,
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(fixture.source, 'version.txt'), 'remote-only\n');
|
||||||
|
git(fixture.source, 'add', 'version.txt');
|
||||||
|
git(fixture.source, 'commit', '-m', 'remote only');
|
||||||
|
const remoteCommit = git(fixture.source, 'rev-parse', 'HEAD');
|
||||||
|
git(fixture.source, 'push', 'origin', 'main');
|
||||||
|
expect(() => git(fixture.checkout, 'cat-file', '-e', `${remoteCommit}^{commit}`)).toThrow();
|
||||||
|
|
||||||
|
await expect(manager.resolveCommit('COMMIT', remoteCommit)).resolves.toBe(remoteCommit);
|
||||||
|
});
|
||||||
|
|
||||||
it('rejects option-like and range refs', async () => {
|
it('rejects option-like and range refs', async () => {
|
||||||
const fixture = createRepositoryFixture();
|
const fixture = createRepositoryFixture();
|
||||||
const manager = new GitWorkspaceManager({
|
const manager = new GitWorkspaceManager({
|
||||||
|
|||||||
Reference in New Issue
Block a user