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)