#!/usr/bin/env python3 import os import subprocess from pathlib import Path GIT_ROOT = Path(os.environ.get("GIT_ROOT_DIR") or "/srv/git/") def is_mirror(repo_path): cmd = ["git", "config", "-f", f"{repo_path}/config", "remote.origin.mirror"] proc = subprocess.run(cmd, stdout=subprocess.PIPE) if proc.stdout.decode().strip() == "true": return True return False def get_direction(repo_path): cmd = ["git", "config", "-f", f"{repo_path}/config", "remote.origin.direction"] proc = subprocess.run(cmd, stdout=subprocess.PIPE) return proc.stdout.decode().strip() def fetch_all(repo_path): print(f"[<] Fetching {repo_path}") subprocess.run(["git", "fetch", "--all"], cwd=repo_path) if os.path.isfile(f"{repo_path}/hooks/post-receive"): subprocess.run([f"{repo_path}/hooks/post-receive"]) def push_all(repo_path): print(f"[>] Pushing {repo_path}") subprocess.run(["git", "push", "origin"], cwd=repo_path) #subprocess.run([f"{GIT_ROOT}.hooks/post-update"], cwd=GIT_ROOT+repo) def run_on_all_repos(root: Path): for element in os.listdir(root): full_path = root / element if element.startswith("."): pass # ignore hidden files elif element.endswith(".git"): if is_mirror(full_path): direction = get_direction(full_path) if direction == "up": push_all(full_path) if direction == "down": fetch_all(full_path) elif os.path.isdir(root / element): run_on_all_repos(root / element) if __name__ == "__main__": run_on_all_repos(GIT_ROOT)