Skip to content

Commit

Permalink
update release/hijack_pr.py
Browse files Browse the repository at this point in the history
  • Loading branch information
mpenkov committed Aug 22, 2022
1 parent 99e43c4 commit 2350e92
Showing 1 changed file with 54 additions and 26 deletions.
80 changes: 54 additions & 26 deletions release/hijack_pr.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,54 +18,82 @@
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
import sys

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()

0 comments on commit 2350e92

Please sign in to comment.