#!/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)