aboutsummaryrefslogtreecommitdiff
path: root/root/scripts/sync-monorepo-public.py
blob: e5d11f37c28a5126dd16ee4895aaf5d8af8666c5 (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
import os
import re
import shutil
import subprocess
import typing

import git_filter_repo

TRAILER_KEY = b"monorepo-revid:"
TRAILER_LINE_RE = re.compile(rb"^[A-Za-z0-9-]+:\s")
REMOTE_URL = "ssh://git@indra/~/monorepo-public"


def commit_callback(commit: git_filter_repo.Commit, metadata: object) -> None:
    if not commit.message:
        return

    assert isinstance(commit.message, bytes), (
        f"commit.message was not bytes but was {type(commit.message)}"
    )
    assert TRAILER_KEY not in commit.message, (
        f"found monorepo-revid trailer header in:\n\n{commit.message}"
    )

    lines = commit.message.splitlines()

    assert isinstance(commit.original_id, bytes), (
        f"commit.original_id was not bytes but was {type(commit.original_id)}"
    )

    trailer = TRAILER_KEY + b" " + commit.original_id
    in_trailer_block = (
        bool(lines) and len(lines) > 1 and TRAILER_LINE_RE.match(lines[-1]) is not None
    )
    if not in_trailer_block and lines and lines[-1] != b"":
        lines.append(b"")

    lines.append(trailer)

    commit.message = b"\n".join(lines) + b"\n"


def main(src: str, dst: str) -> None:
    subprocess.run(["git", "clone", "--no-local", "--", src, dst], check=True)
    os.chdir(dst)
    git_filter_repo.RepoFilter(
        git_filter_repo.FilteringOptions.parse_args(
            ["--path", "private/", "--invert-paths"]
        ),
        commit_callback=commit_callback,
    ).run()
    subprocess.run(["git", "remote", "add", "origin", REMOTE_URL], check=True)
    subprocess.run(["git", "push", "--force", "--all", "origin"], check=True)


if __name__ == "__main__":
    src = os.getcwd()
    dst = "/tmp/monorepo-public-sync"
    shutil.rmtree(dst, ignore_errors=True)
    main(src, dst)