Skip to content

Commit ec6c6cb

Browse files
authored
fix(git-node): do not assume release commit will conflict (#871)
1 parent 82527ad commit ec6c6cb

File tree

1 file changed

+36
-19
lines changed

1 file changed

+36
-19
lines changed

lib/promote_release.js

+36-19
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,34 @@ export default class ReleasePromotion extends Session {
144144
cli.warn(`Aborting release promotion for version ${version}`);
145145
throw new Error('Aborted');
146146
}
147-
await this.cherryPickToDefaultBranch();
148-
149-
// Update `node_version.h`
150-
await forceRunAsync('git', ['checkout', 'HEAD', '--', 'src/node_version.h'],
151-
{ ignoreFailure: false });
147+
const appliedCleanly = await this.cherryPickToDefaultBranch();
148+
149+
// Ensure `node_version.h`'s `NODE_VERSION_IS_RELEASE` bit is not updated
150+
await forceRunAsync('git', ['checkout',
151+
appliedCleanly
152+
? 'HEAD^' // In the absence of conflict, the top of the remote branch is the commit before.
153+
: 'HEAD', // In case of conflict, HEAD is still the top of the remove branch.
154+
'--', 'src/node_version.h'],
155+
{ ignoreFailure: false });
152156

153-
// There will be remaining cherry-pick conflicts the Releaser will
154-
// need to resolve, so confirm they've been resolved before
155-
// proceeding with next steps.
156-
cli.separator();
157-
cli.info('Resolve the conflicts and commit the result');
158-
cli.separator();
159-
const didResolveConflicts = await cli.prompt(
160-
'Finished resolving cherry-pick conflicts?', { defaultAnswer: true });
161-
if (!didResolveConflicts) {
162-
cli.warn(`Aborting release promotion for version ${version}`);
163-
throw new Error('Aborted');
157+
if (appliedCleanly) {
158+
// There were no conflicts, we have to amend the commit to revert the
159+
// `node_version.h` changes.
160+
await forceRunAsync('git', ['commit', ...this.gpgSign, '--amend', '--no-edit', '-n'],
161+
{ ignoreFailure: false });
162+
} else {
163+
// There will be remaining cherry-pick conflicts the Releaser will
164+
// need to resolve, so confirm they've been resolved before
165+
// proceeding with next steps.
166+
cli.separator();
167+
cli.info('Resolve the conflicts and commit the result');
168+
cli.separator();
169+
const didResolveConflicts = await cli.prompt(
170+
'Finished resolving cherry-pick conflicts?', { defaultAnswer: true });
171+
if (!didResolveConflicts) {
172+
cli.warn(`Aborting release promotion for version ${version}`);
173+
throw new Error('Aborted');
174+
}
164175
}
165176

166177
if (existsSync('.git/CHERRY_PICK_HEAD')) {
@@ -469,8 +480,14 @@ export default class ReleasePromotion extends Session {
469480

470481
await this.tryResetBranch();
471482

472-
// There will be conflicts, we do not want to treat this as a failure.
473-
await forceRunAsync('git', ['cherry-pick', ...this.gpgSign, releaseCommitSha],
474-
{ ignoreFailure: true });
483+
// There might be conflicts, we do not want to treat this as a hard failure,
484+
// but we want to retain that information.
485+
try {
486+
await forceRunAsync('git', ['cherry-pick', ...this.gpgSign, releaseCommitSha],
487+
{ ignoreFailure: false });
488+
return true;
489+
} catch {
490+
return false;
491+
}
475492
}
476493
}

0 commit comments

Comments
 (0)