rebase-branch-from-old: few improvments

- Enhance the documentation
- Allow to revert cherry-pick
- coding style

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1094>
This commit is contained in:
Stéphane Cerveau 2021-09-30 12:33:35 +02:00 committed by GStreamer Marge Bot
parent 551239c618
commit 7256ddb74a
2 changed files with 39 additions and 17 deletions

View file

@ -19,11 +19,12 @@ URL = "https://gitlab.freedesktop.org/"
PARSER = argparse.ArgumentParser( PARSER = argparse.ArgumentParser(
description="`Rebase` a branch from an old GStreamer module onto the monorepo" description="`Rebase` a branch from an old GStreamer module onto the monorepo"
) )
PARSER.add_argument("repo", help="The repo with the old module to use.") PARSER.add_argument("repo", help="The repo with the old module to use. ie https://gitlab.freedesktop.org/user/gst-plugins-bad.git or /home/me/gst-build/subprojects/gst-plugins-bad")
PARSER.add_argument("branch", help="The branch to rebase.") PARSER.add_argument("branch", help="The branch to rebase.")
log_depth = [] # type: T.List[str] log_depth = [] # type: T.List[str]
@contextmanager @contextmanager
def nested(name=''): def nested(name=''):
global log_depth global log_depth
@ -33,18 +34,23 @@ def nested(name=''):
finally: finally:
log_depth.pop() log_depth.pop()
def bold(text: str): def bold(text: str):
return f"\033[1m{text}\033[0m" return f"\033[1m{text}\033[0m"
def green(text: str): def green(text: str):
return f"\033[1;32m{text}\033[0m" return f"\033[1;32m{text}\033[0m"
def red(text: str): def red(text: str):
return f"\033[1;31m{text}\033[0m" return f"\033[1;31m{text}\033[0m"
def yellow(text: str): def yellow(text: str):
return f"\033[1;33m{text}\033[0m" return f"\033[1;33m{text}\033[0m"
def fprint(msg, nested=True): def fprint(msg, nested=True):
if log_depth: if log_depth:
prepend = log_depth[-1] + ' | ' if nested else '' prepend = log_depth[-1] + ' | ' if nested else ''
@ -128,13 +134,18 @@ class GstCherryPicker:
self.git("rebase", f"{module}/master", self.git("rebase", f"{module}/master",
interaction_message=f"Failed rebasing {remote_name}/{self.branch} on {module}/master with:\n" interaction_message=f"Failed rebasing {remote_name}/{self.branch} on {module}/master with:\n"
f" `$ git rebase {module}/master`") f" `$ git rebase {module}/master`")
self.cherry_pick(tmpbranchname) ret = self.cherry_pick(tmpbranchname)
except: except Exception as e:
self.git("rebase", "--abort", can_fail=True) self.git("rebase", "--abort", can_fail=True)
self.git("checkout", prevbranch) self.git("checkout", prevbranch)
self.git("branch", "-D", tmpbranchname) self.git("branch", "-D", tmpbranchname)
raise raise
fprint(f"{green(' OK')}\n", nested=False) if ret:
fprint(f"{green(' OK')}\n", nested=False)
else:
self.git("checkout", prevbranch)
self.git("branch", "-D", tmpbranchname)
fprint(f"{red(' ERROR')}\n", nested=False)
def cherry_pick(self, branch): def cherry_pick(self, branch):
shas = self.git('log', '--format=format:%H', f'{self.module}/master..').strip() shas = self.git('log', '--format=format:%H', f'{self.module}/master..').strip()
@ -144,13 +155,17 @@ class GstCherryPicker:
for sha in reversed(shas.split()): for sha in reversed(shas.split()):
fprint(f' - Cherry picking: {bold(sha)}\n') fprint(f' - Cherry picking: {bold(sha)}\n')
self.git("cherry-pick", sha, try:
interaction_message=f"cherry-picking {sha} onto {branch} with:\n " self.git("cherry-pick", sha,
f" `$ git cherry-pick {sha}`" interaction_message=f"cherry-picking {sha} onto {branch} with:\n "
) f" `$ git cherry-pick {sha}`",
revert_operation=["cherry-pick", "--abort"])
except Exception as e:
fprint(f' - Cherry picking failed: {bold(sha)}\n')
return False
return True
def git(self, *args, can_fail=False, interaction_message=None, call=False, revert_operation=None):
def git(self, *args, can_fail=False, interaction_message=None, call=False):
retry = True retry = True
while retry: while retry:
retry = False retry = False
@ -160,7 +175,7 @@ class GstCherryPicker:
return subprocess.check_output(["git"] + list(args), return subprocess.check_output(["git"] + list(args),
stdin=subprocess.DEVNULL, stdin=subprocess.DEVNULL,
stderr=subprocess.STDOUT).decode() stderr=subprocess.STDOUT).decode()
except: except Exception as e:
if not can_fail: if not can_fail:
fprint(f"\n\n{bold(red('ERROR'))}: `git {' '.join(args)}` failed" + "\n", nested=False) fprint(f"\n\n{bold(red('ERROR'))}: `git {' '.join(args)}` failed" + "\n", nested=False)
raise raise
@ -181,7 +196,7 @@ class GstCherryPicker:
f"You should then exit with the following codes:\n\n" f"You should then exit with the following codes:\n\n"
f" - {bold('`exit 0`')}: once you have fixed the problem and we can keep moving the \n" f" - {bold('`exit 0`')}: once you have fixed the problem and we can keep moving the \n"
f" - {bold('`exit 1`')}: {bold('retry')}: once you have let the repo in a state where cherry-picking the commit should be to retried\n" f" - {bold('`exit 1`')}: {bold('retry')}: once you have let the repo in a state where cherry-picking the commit should be to retried\n"
f" - {bold('`exit 3`')}: stop the script and abandon moving your MRs\n" f" - {bold('`exit 2`')}: stop the script and abandon rebasing your branch\n"
"\n```\n", nested=False) "\n```\n", nested=False)
try: try:
if os.name == 'nt': if os.name == 'nt':
@ -195,9 +210,11 @@ class GstCherryPicker:
if e.returncode == 1: if e.returncode == 1:
retry = True retry = True
continue continue
elif e.returncode == 3: elif e.returncode == 2:
sys.exit(3) if revert_operation:
except: self.git(*revert_operation, can_fail=True)
raise
except Exception as e:
# Result of subshell does not really matter # Result of subshell does not really matter
pass pass
@ -217,4 +234,3 @@ def main():
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View file

@ -66,6 +66,8 @@ GITLAB_API_TOKEN=zytXYboB5yi3uggRpBM6 ./scripts/move_mrs_to_monorepo.py
Don't worry - the script will prompt you for input along the way before it does anything. Don't worry - the script will prompt you for input along the way before it does anything.
### Must I use the script? Can't I just open a new MR? ### Must I use the script? Can't I just open a new MR?
The script will move existing discussions and comments. This is particularly useful for MRs that have been reviewed already and have open discussion items. This makes sure we don't accidentally merge something even though there were outstanding issues, which we wouldn't know if you just filed a new MR and closed the old Merge Request. The script will move existing discussions and comments. This is particularly useful for MRs that have been reviewed already and have open discussion items. This makes sure we don't accidentally merge something even though there were outstanding issues, which we wouldn't know if you just filed a new MR and closed the old Merge Request.
@ -84,7 +86,11 @@ You can do this via the GitLab user interface by editing the issue and then chan
We provide a [scripts/rebase-branch-from-old-module.py](https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/scripts/rebase-branch-from-old-module.py) script in the `gstreamer` repository that you should use to rebase branches from the old GStreamer module repositories onto the main `gstreamer` repository. We provide a [scripts/rebase-branch-from-old-module.py](https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/scripts/rebase-branch-from-old-module.py) script in the `gstreamer` repository that you should use to rebase branches from the old GStreamer module repositories onto the main `gstreamer` repository.
This script will only modify your local gstreamer mono repository checkout and not upload anything to GitLab or create any Merge Requests of course. You don't even need a GitLab account to run it. This script will only modify your local gstreamer mono repository checkout and not upload anything to GitLab or create any Merge Requests of course. You don't even need a GitLab account to run it. You can use the script as following:
```
./scripts/rebase-branch-from-old-module.py https://gitlab.freedesktop.org/user/gst-plugins-bad my_wip_dev_branch
```
## I use or distribute the release tarballs - how will this affect me? ## I use or distribute the release tarballs - how will this affect me?