diff --git a/.github/update-release-branch.py b/.github/update-release-branch.py index 351ce8bcf..1de2bb18e 100644 --- a/.github/update-release-branch.py +++ b/.github/update-release-branch.py @@ -239,24 +239,55 @@ def main(): # Create the new branch and push it to the remote print('Creating branch ' + new_branch_name) - run_git('checkout', '-b', new_branch_name, ORIGIN + '/' + args.source_branch) if args.perform_v2_to_v1_backport: + # If we're performing a backport, start from the v1 branch + print(f'Creating {new_branch_name} from the {ORIGIN}/v1 branch') + run_git('checkout', '-b', new_branch_name, f'{ORIGIN}/v1') + + # Revert the commit that we made as part of the last release that updated the version number and + # changelog to refer to 1.x.x variants. This avoids merge conflicts in the changelog and + # package.json files when we merge in the v2 branch. + # This commit will not exist the first time we release the v1 branch from the v2 branch, so we + # use `git log --grep` to conditionally revert the commit. + print('Reverting the 1.x.x version number and changelog updates from the last release to avoid conflicts') + v1_update_commits = run_git('log', '--grep', '^Update version and changelog for v', '--format=%H').split() + + if len(v1_update_commits) > 0: + print(f' Reverting {v1_update_commits[0]}') + # Only revert the newest commit as older ones will already have been reverted in previous + # releases. + run_git('revert', v1_update_commits[0], '--no-edit') + + # Also revert the "Update checked-in dependencies" commit created by Actions. + update_dependencies_commit = run_git('log', '--grep', '^Update checked-in dependencies', '--format=%H').split()[0] + print(f' Reverting {update_dependencies_commit}') + run_git('revert', update_dependencies_commit, '--no-edit') + + else: + print(' Nothing to revert.') + + print(f'Merging {ORIGIN}/{args.source_branch} into the release prep branch') + run_git('merge', f'{ORIGIN}/{args.source_branch}', '--no-edit') + # Migrate the package version number from a v2 version number to a v1 version number print(f'Setting version number to {version}') subprocess.run(['npm', 'version', version, '--no-git-tag-version']) - run_git('reset', 'HEAD~1') run_git('add', 'package.json', 'package-lock.json') # Migrate the changelog notes from v2 version numbers to v1 version numbers print('Migrating changelog notes from v2 to v1') - subprocess.run(['sed', '-i', 's/## 2./## 1./g', 'CHANGELOG.md']) + subprocess.run(['sed', '-i', 's/## 2\./## 1\./g', 'CHANGELOG.md']) # Amend the commit generated by `npm version` to update the CHANGELOG run_git('add', 'CHANGELOG.md') - run_git('commit', '--amend', '-m', f'Update version and changelog for v{version}') + run_git('commit', '-m', f'Update version and changelog for v{version}') else: - # We don't need to do this for a v1 release, since the changelog has already been updated in the v2 branch. + # If we're performing a standard release, there won't be any new commits on the target branch, + # as these will have already been merged back into the source branch. Therefore we can just + # start from the source branch. + run_git('checkout', '-b', new_branch_name, f'{ORIGIN}/{args.source_branch}') + print('Updating changelog') update_changelog(version)