From b06bc3cdea4d45a6e3fdbe0d7e44d5bbacadf8be Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Fri, 20 Apr 2018 13:06:41 -0700 Subject: [PATCH] Add support for PR cherry picks Signed-off-by: Joffrey F --- script/release/release.py | 5 +++++ script/release/release/repository.py | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/script/release/release.py b/script/release/release.py index 06dfdad9a..a38b2aa7d 100755 --- a/script/release/release.py +++ b/script/release/release.py @@ -30,6 +30,11 @@ from release.utils import update_run_sh_version def create_initial_branch(repository, release, base, bintray_user): release_branch = repository.create_release_branch(release, base) + if base: + print('Detected patch version.') + cherries = input('Indicate PR#s to cherry-pick then press Enter:\n') + repository.cherry_pick_prs(release_branch, cherries.split()) + return create_bump_commit(repository, release_branch, bintray_user) diff --git a/script/release/release/repository.py b/script/release/release/repository.py index e0c581bd5..4fcb2712a 100644 --- a/script/release/release/repository.py +++ b/script/release/release/repository.py @@ -2,7 +2,9 @@ from __future__ import absolute_import from __future__ import unicode_literals import os +import tempfile +import requests from git import GitCommandError from git import Repo from github import Github @@ -111,7 +113,7 @@ class Repository(object): if not release.draft: print( 'The release at {} is no longer a draft. If you TRULY intend ' - 'to remove it, please do so manually.' + 'to remove it, please do so manually.'.format(release.url) ) continue release.delete_release() @@ -171,6 +173,26 @@ class Repository(object): with open(os.path.join(REPO_ROOT, 'compose', 'GITSHA'), 'w') as f: f.write(self.git_repo.head.commit.hexsha[:7]) + def cherry_pick_prs(self, release_branch, ids): + if not ids: + return + release_branch.checkout() + for i in ids: + try: + i = int(i) + except ValueError as e: + raise ScriptError('Invalid PR id: {}'.format(e)) + print('Retrieving PR#{}'.format(i)) + pr = self.gh_repo.get_pull(i) + patch_data = requests.get(pr.patch_url).text + self.apply_patch(patch_data) + + def apply_patch(self, patch_data): + with tempfile.NamedTemporaryFile(mode='w', prefix='_compose_cherry', encoding='utf-8') as f: + f.write(patch_data) + f.flush() + self.git_repo.git.am('--3way', f.name) + def get_contributors(pr_data): commits = pr_data.get_commits()