summaryrefslogtreecommitdiffstats
path: root/gfx/angle/vendor_from_git.py
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/vendor_from_git.py')
-rw-r--r--gfx/angle/vendor_from_git.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/gfx/angle/vendor_from_git.py b/gfx/angle/vendor_from_git.py
new file mode 100644
index 0000000000..35fdfd244b
--- /dev/null
+++ b/gfx/angle/vendor_from_git.py
@@ -0,0 +1,112 @@
+#! /usr/bin/env python3
+# 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/.
+
+assert __name__ != "__main__"
+
+"""
+Any time we vendor[1] from an external git repo, we want to keep a record of the csets
+we're pulling from.
+
+This script leaves a record of the merge-base reference tip and cherry-picks that we pull
+into Gecko. (such as gfx/angle/cherry_picks.txt)
+"""
+
+from pathlib import *
+import subprocess
+import sys
+
+# --
+
+
+def print_now(*args):
+ print(*args)
+ sys.stdout.flush()
+
+
+def run_checked(*args, **kwargs):
+ print(" ", args)
+ sys.stdout.flush()
+ return subprocess.run(args, check=True, **kwargs)
+
+
+# --
+
+
+def record_cherry_picks(dir_in_gecko, merge_base_origin):
+ # merge_base_origin is not always 'origin'!
+ base_merge_base_from = Path(dir_in_gecko, "MERGE_BASE").read_text().split("\n")[0]
+ merge_base_from = merge_base_origin + "/" + base_merge_base_from
+
+ assert "/" in merge_base_from, "Please specify a reference tip from a remote."
+ log_path = Path(dir_in_gecko, "cherry_picks.txt")
+ print_now("Logging cherry picks to {}.".format(log_path))
+
+ merge_base = (
+ run_checked(
+ "git", "merge-base", "HEAD", merge_base_from, stdout=subprocess.PIPE
+ )
+ .stdout.decode()
+ .strip()
+ )
+ merge_base_readable = (
+ run_checked(
+ "git",
+ "show",
+ "-s",
+ "--format=commit %H %cd",
+ merge_base,
+ stdout=subprocess.PIPE,
+ )
+ .stdout.decode()
+ .strip()
+ )
+
+ mb_info = run_checked(
+ "git",
+ "log",
+ "--format=medium",
+ "--no-decorate",
+ "--no-abbrev-commit",
+ "{}~1..{}".format(merge_base, merge_base),
+ stdout=subprocess.PIPE,
+ ).stdout
+ cherries = run_checked(
+ "git",
+ "log",
+ "--format=medium",
+ "--no-decorate",
+ "--no-abbrev-commit",
+ merge_base + "..",
+ stdout=subprocess.PIPE,
+ ).stdout
+
+ with open(log_path, "wb") as f:
+ f.write(cherries)
+ f.write(b"\nAbove: cherries picked")
+ f.write(b"\n" + (b"=" * 80))
+ f.write(b"\nBelow: merge base from: " + merge_base_from.encode())
+ f.write(b"\n\n")
+ f.write(mb_info)
+
+ # The below supports only a single commit-alert task. If/when we add another task, this
+ # will need to be improved.
+ print_now("Updating moz.yaml")
+ moz_yaml_file = Path(dir_in_gecko, "moz.yaml")
+ with open(moz_yaml_file, "r") as f:
+ moz_yaml_contents = f.readlines()
+ with open(moz_yaml_file, "wb") as f:
+ for line in moz_yaml_contents:
+
+ def prefix():
+ return line[0 : line.index(": ") + 2].encode()
+
+ if "branch: " in line:
+ f.write(prefix() + base_merge_base_from.encode() + b"\n")
+ elif "release: " in line:
+ f.write(prefix() + merge_base_readable.encode() + b"\n")
+ elif "revision: " in line:
+ f.write(prefix() + merge_base.encode() + b"\n")
+ else:
+ f.write(line.encode())