diff options
Diffstat (limited to 'dom/media/webrtc/third_party_build/save_patch_stack.py')
-rw-r--r-- | dom/media/webrtc/third_party_build/save_patch_stack.py | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/dom/media/webrtc/third_party_build/save_patch_stack.py b/dom/media/webrtc/third_party_build/save_patch_stack.py new file mode 100644 index 0000000000..11c007109c --- /dev/null +++ b/dom/media/webrtc/third_party_build/save_patch_stack.py @@ -0,0 +1,142 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +import argparse +import os +import re +import shutil + +from run_operations import run_git, run_hg, run_shell + +# This script saves the mozilla patch stack and no-op commit tracking +# files. This makes our fast-forward process much more resilient by +# saving the intermediate state after each upstream commit is processed. + + +def save_patch_stack( + github_path, + github_branch, + patch_directory, + state_directory, + target_branch_head, + bug_number, +): + # remove the current patch files + files_to_remove = os.listdir(patch_directory) + for file in files_to_remove: + os.remove(os.path.join(patch_directory, file)) + + # find the base of the patch stack + cmd = "git merge-base {} {}".format(github_branch, target_branch_head) + stdout_lines = run_git(cmd, github_path) + merge_base = stdout_lines[0] + + # grab patch stack + cmd = "git format-patch --keep-subject --output-directory {} {}..{}".format( + patch_directory, merge_base, github_branch + ) + run_git(cmd, github_path) + + # remove the commit summary from the file name + patches_to_rename = os.listdir(patch_directory) + for file in patches_to_rename: + shortened_name = re.sub("^(\d\d\d\d)-.*\.patch", "\\1.patch", file) + os.rename( + os.path.join(patch_directory, file), + os.path.join(patch_directory, shortened_name), + ) + + # remove the unhelpful first line of the patch files that only + # causes diff churn. For reasons why we can't skip creating backup + # files during the in-place editing, see: + # https://stackoverflow.com/questions/5694228/sed-in-place-flag-that-works-both-on-mac-bsd-and-linux + run_shell("sed -i'.bak' -e '1d' {}/*.patch".format(patch_directory)) + run_shell("rm {}/*.patch.bak".format(patch_directory)) + + # it is also helpful to save the no-op-cherry-pick-msg files from + # the state directory so that if we're restoring a patch-stack we + # also restore the possibly consumed no-op tracking files. + no_op_files = [ + path + for path in os.listdir(state_directory) + if re.findall(".*no-op-cherry-pick-msg$", path) + ] + for file in no_op_files: + shutil.copy(os.path.join(state_directory, file), patch_directory) + + # get missing files (that should be marked removed) + cmd = "hg status --no-status --deleted {}".format(patch_directory) + stdout_lines = run_hg(cmd) + if len(stdout_lines) != 0: + cmd = "hg rm {}".format(" ".join(stdout_lines)) + run_hg(cmd) + + # get unknown files (that should be marked added) + cmd = "hg status --no-status --unknown {}".format(patch_directory) + stdout_lines = run_hg(cmd) + if len(stdout_lines) != 0: + cmd = "hg add {}".format(" ".join(stdout_lines)) + run_hg(cmd) + + # if any files are marked for add/remove/modify, commit them + cmd = "hg status --added --removed --modified {}".format(patch_directory) + stdout_lines = run_hg(cmd) + if (len(stdout_lines)) != 0: + print("Updating {} files in {}".format(len(stdout_lines), patch_directory)) + if bug_number is None: + run_hg("hg amend") + else: + run_shell( + "hg commit --message 'Bug {} - updated libwebrtc patch stack'".format( + bug_number + ) + ) + + +if __name__ == "__main__": + default_patch_dir = "third_party/libwebrtc/moz-patch-stack" + default_state_dir = ".moz-fast-forward" + + parser = argparse.ArgumentParser( + description="Save moz-libwebrtc github patch stack" + ) + parser.add_argument( + "--repo-path", + required=True, + help="path to libwebrtc repo", + ) + parser.add_argument( + "--branch", + default="mozpatches", + help="moz-libwebrtc branch (defaults to mozpatches)", + ) + parser.add_argument( + "--patch-path", + default=default_patch_dir, + help="path to save patches (defaults to {})".format(default_patch_dir), + ) + parser.add_argument( + "--state-path", + default=default_state_dir, + help="path to state directory (defaults to {})".format(default_state_dir), + ) + parser.add_argument( + "--target-branch-head", + required=True, + help="target branch head for fast-forward, should match MOZ_TARGET_UPSTREAM_BRANCH_HEAD in config_env", + ) + parser.add_argument( + "--separate-commit-bug-number", + type=int, + help="integer Bugzilla number (example: 1800920), if provided will write patch stack as separate commit", + ) + args = parser.parse_args() + + save_patch_stack( + args.repo_path, + args.branch, + os.path.abspath(args.patch_path), + args.state_path, + args.target_branch_head, + args.separate_commit_bug_number, + ) |