summaryrefslogtreecommitdiffstats
path: root/gfx/angle/vendor_from_git.py
blob: 8414350efe9c65fb5f5765b466e4d81a4aa3cf4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#! /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", "{}~1..{}".format(merge_base, merge_base), stdout=subprocess.PIPE
    ).stdout
    cherries = run_checked(
        "git", "log", merge_base + "..", stdout=subprocess.PIPE
    ).stdout

    with open(log_path, "wb") as f:
        f.write(cherries)
        f.write(b"\nCherries picked")
        f.write(b"\n" + (b"=" * 80))
        f.write(b"\nMerge 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())