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@plato/~/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)
|