From 2350e9259b066126a9687cf6e04cb644f387a38a Mon Sep 17 00:00:00 2001 From: Michael Penkov Date: Mon, 22 Aug 2022 15:37:06 +0900 Subject: [PATCH] update release/hijack_pr.py --- release/hijack_pr.py | 80 ++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/release/hijack_pr.py b/release/hijack_pr.py index d109836d49..fb326fff7c 100755 --- a/release/hijack_pr.py +++ b/release/hijack_pr.py @@ -18,6 +18,14 @@ The above commands would check out the code for the PR, make changes to them, and push them back. Obviously, this requires the PR to be writable, but most gensim PRs are. If they aren't, then leave it up to the PR author to make the required changes. + +Sometimes, we'll make upstream changes that we want to merge into existing PRs. +This is particularly useful when some nagging build problem is affecting multiple PRs. +We can achieve this with: + + $ release/hijack_pr.py merge-upstream-into 1234 + +This hijacks the PR and merges upstream/develop into it. """ import json import subprocess @@ -25,47 +33,67 @@ import smart_open + def check_output(command): return subprocess.check_output(command).strip().decode('utf-8') -if sys.argv[1] == "push": +def push(): command = "git rev-parse --abbrev-ref HEAD@{upstream}".split() remote, remote_branch = check_output(command).split('/') current_branch = check_output(['git', 'branch', '--show-current']) - check_output(['git', 'push', remote, f'{current_branch}:{remote_branch}']) + subprocess.check_call(['git', 'push', remote, f'{current_branch}:{remote_branch}']) # # Cleanup to prevent remotes and branches from piling up # - check_output(['git', 'branch', '--delete', current_branch]) - check_output(['git', 'remote', 'remove', remote]) - sys.exit(0) + subprocess.check_call(['git', 'checkout', 'develop']) + subprocess.check_call(['git', 'branch', '--delete', current_branch]) + subprocess.check_call(['git', 'remote', 'remove', remote]) + + +def hijack(prid): + url = f"https://api.github.com/repos/RaRe-Technologies/gensim/pulls/{prid}" + with smart_open.open(url) as fin: + prinfo = json.load(fin) + + user = prinfo['head']['user']['login'] + ssh_url = prinfo['head']['repo']['ssh_url'] -prid = int(sys.argv[1]) -url = f"https://api.github.com/repos/RaRe-Technologies/gensim/pulls/{prid}" -with smart_open.open(url) as fin: - prinfo = json.load(fin) + remotes = check_output(['git', 'remote']).split('\n') + if user not in remotes: + subprocess.check_call(['git', 'remote', 'add', user, ssh_url]) -user = prinfo['head']['user']['login'] -ssh_url = prinfo['head']['repo']['ssh_url'] + subprocess.check_call(['git', 'fetch', user]) -remotes = check_output(['git', 'remote']).split('\n') -if user not in remotes: - subprocess.check_call(['git', 'remote', 'add', user, ssh_url]) + ref = prinfo['head']['ref'] + subprocess.check_call(['git', 'checkout', f'{user}/{ref}']) + + # + # Prefix the local branch name with the user to avoid naming clashes with + # existing branches, e.g. develop + # + subprocess.check_call(['git', 'switch', '-c', f'{user}_{ref}']) + + # + # Set the upstream so we can push back to it more easily + # + subprocess.check_call(['git', 'branch', '--set-upstream-to', f'{user}/{ref}']) -subprocess.check_call(['git', 'fetch', user]) -ref = prinfo['head']['ref'] -subprocess.check_call(['git', 'checkout', f'{user}/{ref}']) +def main(): + if sys.argv[1] == "push": + push() + elif sys.argv[1] == 'merge-upstream-into': + prid = int(sys.argv[2]) + hijack(prid) + subprocess.check_call(['git', 'fetch', 'upstream']) + subprocess.check_call(['git', 'merge', 'upstream/develop', '--no-edit']) + push() + else: + prid = int(sys.argv[1]) + hijack(prid) -# -# Prefix the local branch name with the user to avoid naming clashes with -# existing branches, e.g. develop -# -subprocess.check_call(['git', 'switch', '-c', f'{user}_{ref}']) -# -# Set the upstream so we can push back to it more easily -# -subprocess.check_call(['git', 'branch', '--set-upstream-to', f'{user}/{ref}']) +if __name__ == '__main__': + main()