summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/third_party_build/restore_patch_stack.py
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/third_party_build/restore_patch_stack.py')
-rw-r--r--dom/media/webrtc/third_party_build/restore_patch_stack.py131
1 files changed, 131 insertions, 0 deletions
diff --git a/dom/media/webrtc/third_party_build/restore_patch_stack.py b/dom/media/webrtc/third_party_build/restore_patch_stack.py
new file mode 100644
index 0000000000..cc25623881
--- /dev/null
+++ b/dom/media/webrtc/third_party_build/restore_patch_stack.py
@@ -0,0 +1,131 @@
+# 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
+import sys
+
+from fetch_github_repo import fetch_repo
+from run_operations import get_last_line, run_git, run_hg, run_shell
+
+# This script restores the mozilla patch stack and no-op commit tracking
+# files. In the case of repo corruption or a mistake made during
+# various rebase conflict resolution operations, the patch-stack can be
+# restored rather than requiring the user to restart the fast-forward
+# process from the beginning.
+
+
+def restore_patch_stack(
+ github_path,
+ github_branch,
+ patch_directory,
+ state_directory,
+ tar_name,
+ clone_protocol,
+):
+ # make sure the repo is clean before beginning
+ stdout_lines = run_hg("hg status third_party/libwebrtc")
+ if len(stdout_lines) != 0:
+ print("There are modified or untracked files under third_party/libwebrtc")
+ print("Please cleanup the repo under third_party/libwebrtc before running")
+ print(os.path.basename(__file__))
+ sys.exit(1)
+
+ # first, refetch the repo (hopefully utilizing the tarfile for speed) so
+ # the patches apply cleanly
+ print("fetch repo")
+ fetch_repo(
+ github_path, clone_protocol, True, os.path.join(state_directory, tar_name)
+ )
+
+ # remove any stale no-op-cherry-pick-msg files in state_directory
+ print("clear no-op-cherry-pick-msg files")
+ run_shell("rm {}/*.no-op-cherry-pick-msg || true".format(state_directory))
+
+ # lookup latest vendored commit from third_party/libwebrtc/README.moz-ff-commit
+ print(
+ "lookup latest vendored commit from third_party/libwebrtc/README.moz-ff-commit"
+ )
+ file = os.path.abspath("third_party/libwebrtc/README.moz-ff-commit")
+ last_vendored_commit = get_last_line(file)
+
+ # checkout the previous vendored commit with proper branch name
+ print(
+ "checkout the previous vendored commit ({}) with proper branch name".format(
+ last_vendored_commit
+ )
+ )
+ cmd = "git checkout -b {} {}".format(github_branch, last_vendored_commit)
+ run_git(cmd, github_path)
+
+ # restore the patches to moz-libwebrtc repo, use run_shell instead of
+ # run_hg to allow filepath wildcard
+ print("Restoring patch stack")
+ run_shell("cd {} && git am {}/*.patch".format(github_path, patch_directory))
+
+ # it is also helpful to restore the no-op-cherry-pick-msg files to
+ # 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(patch_directory)
+ if re.findall(".*no-op-cherry-pick-msg$", path)
+ ]
+ for file in no_op_files:
+ shutil.copy(os.path.join(patch_directory, file), state_directory)
+
+ print("Please run the following command to verify the state of the patch-stack:")
+ print(" bash dom/media/webrtc/third_party_build/verify_vendoring.sh")
+
+
+if __name__ == "__main__":
+ default_patch_dir = "third_party/libwebrtc/moz-patch-stack"
+ default_state_dir = ".moz-fast-forward"
+ default_tar_name = "moz-libwebrtc.tar.gz"
+
+ parser = argparse.ArgumentParser(
+ description="Restore 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(
+ "--tar-name",
+ default=default_tar_name,
+ help="name of tar file (defaults to {})".format(default_tar_name),
+ )
+ parser.add_argument(
+ "--state-path",
+ default=default_state_dir,
+ help="path to state directory (defaults to {})".format(default_state_dir),
+ )
+ parser.add_argument(
+ "--clone-protocol",
+ choices=["https", "ssh"],
+ default="https",
+ help="Use either https or ssh to clone the git repo (ignored if tar file exists)",
+ )
+ args = parser.parse_args()
+
+ restore_patch_stack(
+ args.repo_path,
+ args.branch,
+ os.path.abspath(args.patch_path),
+ args.state_path,
+ args.tar_name,
+ args.clone_protocol,
+ )