From 7db9992e8169e243fca955acb967a2bf0a111ebd Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Tue, 26 Jul 2022 16:32:57 +0100 Subject: [PATCH 1/5] Add a 'merge-back' command to the release script --- scripts-dev/release.py | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/scripts-dev/release.py b/scripts-dev/release.py index 5bfd750118dc..74601f236824 100755 --- a/scripts-dev/release.py +++ b/scripts-dev/release.py @@ -32,6 +32,7 @@ import commonmark import git from click.exceptions import ClickException +from git import GitCommandError, Repo from github import Github from packaging import version @@ -78,6 +79,8 @@ def cli() -> None: # Optional: generate some nice links for the announcement + ./scripts-dev/release.py merge-back + ./scripts-dev/release.py announce If the env var GH_TOKEN (or GITHUB_TOKEN) is set, or passed into the @@ -441,6 +444,71 @@ def upload() -> None: ) +def _merge_into(repo: Repo, source: str, target: str) -> None: + """ + Merges branch `source` into branch `target`. + Pulls both before merging and pushes the result. + """ + + # Update our branches and switch to the target branch + for branch in [source, target]: + click.echo(f"Switching to {branch} and pulling...") + repo.heads[branch].checkout() + # Pull so we're up to date + repo.remote().pull() + + assert repo.active_branch.name == target + + try: + # TODO This seemed easier than using GitPython directly + click.echo(f"Merging {source}") + repo.git.merge(source) + except GitCommandError as exc: + # If a merge conflict occurs, give some context and try to + # make it easy to abort if necessary. + click.echo(exc) + if not click.confirm( + f"Likely merge conflict whilst merging ({source} → {target}). " + f"Have you resolved it?" + ): + repo.git.merge("--abort") + return + + # Push result. + click.echo("Pushing") + repo.remote().push() + + +@cli.command() +def merge_back() -> None: + """Merge the release branch back into the appropriate branches. + All branches will be automatically pulled from the remote and the results + will be pushed to the remote.""" + + repo = get_repo_and_check_clean_checkout() + branch_name = repo.active_branch.name + + if not branch_name.startswith("release-v"): + raise RuntimeError("Not on a release branch. This does not seem sensible.") + + # Pull so we're up to date + repo.remote().pull() + + current_version = get_package_version() + + if current_version.is_prerelease: + # Release candidate + if click.confirm(f"Merge {branch_name} → develop?", default=True): + _merge_into(repo, branch_name, "develop") + else: + # Full release + if click.confirm(f"Merge {branch_name} → master?", default=True): + _merge_into(repo, branch_name, "master") + + if click.confirm("Merge master → develop?", default=True): + _merge_into(repo, "master", "develop") + + @cli.command() def announce() -> None: """Generate markdown to announce the release.""" From 28e7f435a7ae7417e6763e58e54881dac226dc18 Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Tue, 26 Jul 2022 16:34:39 +0100 Subject: [PATCH 2/5] Newsfile Signed-off-by: Olivier Wilkinson (reivilibre) --- changelog.d/13393.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/13393.misc diff --git a/changelog.d/13393.misc b/changelog.d/13393.misc new file mode 100644 index 000000000000..be2b0153ea13 --- /dev/null +++ b/changelog.d/13393.misc @@ -0,0 +1 @@ +Add a `merge-back` command to the release script, which automates merging the correct branches after a release. \ No newline at end of file From c0ce83909dc81f1fefccbf520be414c73ea0c2c7 Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Wed, 27 Jul 2022 11:18:16 +0100 Subject: [PATCH 3/5] =?UTF-8?q?repo=20=E2=86=92=20synapse=5Frepo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts-dev/release.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts-dev/release.py b/scripts-dev/release.py index 74601f236824..eb18eb1815a4 100755 --- a/scripts-dev/release.py +++ b/scripts-dev/release.py @@ -485,28 +485,28 @@ def merge_back() -> None: All branches will be automatically pulled from the remote and the results will be pushed to the remote.""" - repo = get_repo_and_check_clean_checkout() - branch_name = repo.active_branch.name + synapse_repo = get_repo_and_check_clean_checkout() + branch_name = synapse_repo.active_branch.name if not branch_name.startswith("release-v"): raise RuntimeError("Not on a release branch. This does not seem sensible.") # Pull so we're up to date - repo.remote().pull() + synapse_repo.remote().pull() current_version = get_package_version() if current_version.is_prerelease: # Release candidate if click.confirm(f"Merge {branch_name} → develop?", default=True): - _merge_into(repo, branch_name, "develop") + _merge_into(synapse_repo, branch_name, "develop") else: # Full release if click.confirm(f"Merge {branch_name} → master?", default=True): - _merge_into(repo, branch_name, "master") + _merge_into(synapse_repo, branch_name, "master") if click.confirm("Merge master → develop?", default=True): - _merge_into(repo, "master", "develop") + _merge_into(synapse_repo, "master", "develop") @cli.command() From 82111b9eb1d8ddd37dcd3d3d5226eca87f2ff6ac Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Wed, 27 Jul 2022 11:20:59 +0100 Subject: [PATCH 4/5] Also merge SyTest branches on full release --- scripts-dev/release.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts-dev/release.py b/scripts-dev/release.py index eb18eb1815a4..740a4b6510d3 100755 --- a/scripts-dev/release.py +++ b/scripts-dev/release.py @@ -502,12 +502,20 @@ def merge_back() -> None: _merge_into(synapse_repo, branch_name, "develop") else: # Full release + sytest_repo = get_repo_and_check_clean_checkout("../sytest", "sytest") + if click.confirm(f"Merge {branch_name} → master?", default=True): _merge_into(synapse_repo, branch_name, "master") if click.confirm("Merge master → develop?", default=True): _merge_into(synapse_repo, "master", "develop") + if click.confirm(f"On SyTest, merge {branch_name} → master?", default=True): + _merge_into(sytest_repo, branch_name, "master") + + if click.confirm("On SyTest, merge master → develop?", default=True): + _merge_into(sytest_repo, "master", "develop") + @cli.command() def announce() -> None: From 33546c3bd8993efe9126114ccf3daf0ae890f06b Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Tue, 2 Aug 2022 16:26:28 +0100 Subject: [PATCH 5/5] Ellipses for actions --- scripts-dev/release.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts-dev/release.py b/scripts-dev/release.py index 740a4b6510d3..46220c4dd31e 100755 --- a/scripts-dev/release.py +++ b/scripts-dev/release.py @@ -461,7 +461,7 @@ def _merge_into(repo: Repo, source: str, target: str) -> None: try: # TODO This seemed easier than using GitPython directly - click.echo(f"Merging {source}") + click.echo(f"Merging {source}...") repo.git.merge(source) except GitCommandError as exc: # If a merge conflict occurs, give some context and try to @@ -475,7 +475,7 @@ def _merge_into(repo: Repo, source: str, target: str) -> None: return # Push result. - click.echo("Pushing") + click.echo("Pushing...") repo.remote().push()