aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--root/nix/_treefmt.nix4
-rw-r--r--root/nix/devshell.nix4
-rw-r--r--root/scripts/sync-monorepo-public.py60
3 files changed, 68 insertions, 0 deletions
diff --git a/root/nix/_treefmt.nix b/root/nix/_treefmt.nix
index ea07aaa..bf67429 100644
--- a/root/nix/_treefmt.nix
+++ b/root/nix/_treefmt.nix
@@ -9,6 +9,10 @@ let
"private/*"
# keep-sorted end
];
+
+ programs = {
+ ruff-format.enable = true;
+ };
};
in
treefmt-nix.lib.mkWrapper pkgs conf
diff --git a/root/nix/devshell.nix b/root/nix/devshell.nix
index 6c1dc29..98131e4 100644
--- a/root/nix/devshell.nix
+++ b/root/nix/devshell.nix
@@ -20,7 +20,11 @@
inputsFrom = [ self.devShells."${system}".common ];
packages = [
+ # keep-sorted start
+ (pkgs.python3.withPackages (ps: [ ps.git-filter-repo ]))
+ pkgs.ty
treefmt
+ # keep-sorted end
];
shellHook = ''
export TREEFMT_WORKING_DIR="$("${pkgs.git}/bin/git" rev-parse --show-toplevel)"
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)