From 5e32a80357ee47c9bd463e4c0e7689f741bc50e4 Mon Sep 17 00:00:00 2001 From: alemi Date: Thu, 8 Feb 2024 18:26:26 +0100 Subject: [PATCH] feat: reimplement ls in python so we can get exactly the functionality we need --- ls | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/ls b/ls index 170d5d0..ef382c6 100755 --- a/ls +++ b/ls @@ -1,12 +1,30 @@ -#!/bin/bash +#!/usr/bin/env python -tree /srv/git -I "hooks|objects|info|branches|refs|HEAD|description|config|cgitrc|FETCH_HEAD|packed-refs" +import os +from pathlib import Path -# ls /srv/git -I 'git-shell-commands' +GIT_ROOT = Path(os.environ.get("GIT_ROOT_DIR") or "/srv/git/") -# one above misses repos like '.dotfiles', let's do it by hand -# for f in $(ls /srv/git -a); do -# if [[ $f == *.git ]]; then -# echo $f -# fi -# done +def pre(depth: int, last: bool = False) -> str: + return (': ' * (depth)) + ("'-" if last else '|-') + +def print_dir(dir: str, depth: int): + print(f"{pre(depth)}+ {dir}/") + +def print_repo(repo: str, depth: int, last: bool = False): + print(f"{pre(depth, last=last)} {repo.replace('.git','')}") + +def run_on_all_repos(root: Path, depth: int = 0): + contents = os.listdir(root) + for element in contents: + full_path = root / element + if element.startswith("."): + pass # ignore hidden files + elif element.endswith(".git"): + print_repo(element, depth, last=element==contents[-1]) + 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)