diff --git a/tools/gtree b/tools/gtree index 2f3677634..5a1642f34 100755 --- a/tools/gtree +++ b/tools/gtree @@ -1,17 +1,59 @@ #!/usr/bin/env bash -# gtree [REGEX] - list [a matched subset of] git files as an indented tree. -# Because the other tools suck more. Only lists files, not directories. -# REGEX is a case-insensitive grep regexp matching the relative file paths. -# -# gtree -# gtree yaml -# gtree '(^|/)((bsd)?m|sh)ake' +# List git files as an indented tree (because the other tools suck). -REGEX="${1:-.}" +set -e + +usage() { + cat <&2 echo "Error: unknown option $1" + exit 1 + fi + ;; + esac +done +#if [[ $HELP = 1 || ${#ARGS} -eq 0 ]]; then usage; exit; fi +if [[ $HELP = 1 ]]; then usage; exit; fi + +REGEX="${ARGS[0]:-.}" +ROOT=$(pwd) # list git-tracked files -# keep only the paths matching REGEX +# keep only the paths matching REGEX, if provided # convert paths list to an indented tree -git ls-files | \ - grep -iE "$REGEX" | \ - sed -e 's/\//:/g' -e 's/^/account /' | hledger -f- accounts -t +# keep only the directories, if -d provided +git ls-files \ + | grep -iE "$REGEX" \ + | sed -e 's%/%/:%g' -e "s%^%account $ROOT/:%" | hledger -f- accounts -t \ + | grep -E "$(if [[ $D = 1 ]]; then echo '/$'; else echo '.'; fi)"