#! /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())