gitshell/ls

40 lines
1.2 KiB
Python
Executable file

#!/usr/bin/env python
import os
import subprocess
from pathlib import Path
GIT_ROOT = Path(os.environ.get("GIT_ROOT_DIR") or "/srv/git/")
def pre(depth: int, last: bool = False) -> str:
return (': ' * (depth)) + ("'-" if last else '|-')
def is_public(repo: Path) -> bool:
cmd = ["git", "config", "-f", f"{repo}/config", "cgit.ignore"]
proc = subprocess.run(cmd, stdout=subprocess.PIPE)
if proc.stdout.decode().strip() == "1":
return False
return True
def print_dir(dir: str, depth: int):
print(f"{pre(depth)}+ {dir}/")
def print_repo(repo: str, depth: int, last: bool = False, public: bool = False):
print(f"{pre(depth, last=last)} {repo.replace('.git','')} {'' if public else '[h]'}")
def run_on_all_repos(root: Path, depth: int = 0):
contents = sorted(os.listdir(root))
for element in contents:
full_path = root / element
if element.startswith("."):
pass # ignore hidden files
elif element.endswith(".git"):
public = is_public(full_path)
last = element == contents[-1]
print_repo(element, depth, last=last, public=public)
elif os.path.isdir(root / element):
print_dir(element, depth)
run_on_all_repos(root / element, depth=depth+1)
if __name__ == "__main__":
run_on_all_repos(GIT_ROOT)