diff options
Diffstat (limited to 'root/scripts')
| -rw-r--r-- | root/scripts/sync-monorepo-public.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/root/scripts/sync-monorepo-public.py b/root/scripts/sync-monorepo-public.py new file mode 100644 index 0000000..fe1592f --- /dev/null +++ b/root/scripts/sync-monorepo-public.py @@ -0,0 +1,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) |
