summaryrefslogtreecommitdiff
path: root/bin/common
diff options
context:
space:
mode:
authorRaymaekers Luca <raymaekers.luca@gmail.com>2024-06-23 14:12:17 +0200
committerRaymaekers Luca <raymaekers.luca@gmail.com>2024-06-23 14:12:17 +0200
commit8986d060f2f308ba768758ef9c3077f00f3d6b2a (patch)
tree1dcbbd479f498693de0180ecae85bf532d74a8d1 /bin/common
parentd466dcc80e77463fa035fc85ced0c253e38cbac2 (diff)
checkpoint
Diffstat (limited to 'bin/common')
-rwxr-xr-xbin/common/gt138
1 files changed, 74 insertions, 64 deletions
diff --git a/bin/common/gt b/bin/common/gt
index ceb58a8..b86ccc6 100755
--- a/bin/common/gt
+++ b/bin/common/gt
@@ -4,14 +4,14 @@
# dependencies:
# - git
-# - $EDITOR: -e
+# - $EDITOR: -e
repos=$HOME/sync/share/git-track.txt
# prevent file not found errors
touch "$repos"
help() {
- >&2 cat <<EOF
+ cat >&2 <<EOF
usage: gt [OPTION]
-a PATH add repo
-s update and show status of each repo
@@ -25,97 +25,107 @@ EOF
# fetch repository prettily, outputs nothing if failed
fetch() {
# fetch with one-line printing of progress
- git fetch --progress 2>/dev/null | while read -r line
- # \r\033[0K : clear current line
- do >&2 printf '\r\033[0K%s' "$line"
- done
+ git fetch --progress 2>/dev/null | while read -r line; do # \r\033[0K : clear current line
+ printf >&2 '\r\033[0K%s' "$line"
+ done
}
# Print repositories prettily
# This function function prints animations (eg. clearing the line)
# to stderr and the final status line is outputted to stdout.
status() {
- while read -r repo
- do
- repo_pretty="$(printf '%s' "$repo" | sed "s@$HOME@~@" )"
+ while read -r repo; do
+ repo_pretty="$(printf '%s' "$repo" | sed "s@$HOME@~@")"
- # absolute path
- cd "$repo"
+ if [ ! -d "$repo" ]; then
+ printf '%s missing\n' "$repo_pretty"
+ continue
+ fi
- # replace line with status
- >&2 printf '\r\033[0K'
+ # absolute path
+ cd "$repo"
- status="$(git status --porcelain 2> /dev/null | awk '{print $1}' | uniq | tr -d '\n')"
- remote="$(git branch -v 2>/dev/null |
- sed '/^*/!d;s/ahead/↑/;s/behind/↓/;s/[^↓↑]*//g')"
+ # replace line with status
+ printf >&2 '\r\033[0K'
- printf '%s %s %s\n' "$repo_pretty" "$status" "$remote"
- done < "$repos"
+ status="$(git status --porcelain 2>/dev/null |
+ awk '{print $1}' |
+ sort | uniq | tr -s '?' |
+ tr -d '\n')"
+ remote="$(git branch -v 2>/dev/null |
+ sed '/^*/!d;s/ahead/↑/;s/behind/↓/;s/[^↓↑]*//g')"
+
+ printf '%s %s %s\n' "$repo_pretty" "$status" "$remote"
+ done <"$repos"
}
# run git command in each repo
# $1: command
repos_cmd() {
- while read -r repo
- do
- repo_pretty="$(printf '%s' "$repo" | sed "s@$HOME@~@" )"
- printf ''\''%s'\'' in %s' "$1" "$repo_pretty"
- (
- cd "$repo"
- git "$1" > /dev/null 2>&1
- [ $? -gt 0 ] && s="x" || s="o"
- printf '\r\033[0K%s: %s\n' "$repo_pretty" "$s"
- )
- done < "$repos"
+ while read -r repo; do
+ repo_pretty="$(printf '%s' "$repo" | sed "s@$HOME@~@")"
+ printf ''\''%s'\'' in %s' "$1" "$repo_pretty"
+ (
+ cd "$repo"
+ git "$1" >/dev/null 2>&1
+ [ $? -gt 0 ] && s="x" || s="o"
+ printf '\r\033[0K%s: %s\n' "$repo_pretty" "$s"
+ )
+ done <"$repos"
}
# no options
-if [ -z "$1" ]
-then
- help
- exit 1
+if [ -z "$1" ]; then
+ help
+ exit 1
fi
-while getopts ":a:c:f:lshe" opt
-do
+while getopts ":a:c:f:lshe" opt; do
case "$opt" in
- a)
- cd "$OPTARG" || exit 1
- r="$(git rev-parse --show-toplevel)"
- [ "$r" ] || exit 2
-
- if grep "$r" "$repos" > /dev/null 2>&1
- then
- >&2 printf 'added already.\n'
- exit 2
- fi
-
- printf '%s\n' "$r" >> "$repos"
-
- >&2 printf 'added.\n' ;;
- c) f_command=1; f_arg="$OPTARG" ;;
- s) f_status=1 ;;
- l) cat "$repos" ;;
- e) $EDITOR "$repos" ;;
- f) repos="$OPTARG" ;;
- h) help ;;
- :) >&2 printf -- '-%s requires argument\n' "$OPTARG"; exit 1 ;;
- ?) >&2 printf -- 'Invalid option: -%s\n' "$OPTARG"; exit 1 ;;
+ a)
+ cd "$OPTARG" || exit 1
+ r="$(git rev-parse --show-toplevel)"
+ [ "$r" ] || exit 2
+
+ if grep "$r" "$repos" >/dev/null 2>&1; then
+ printf >&2 'added already.\n'
+ exit 2
+ fi
+
+ printf '%s\n' "$r" >>"$repos"
+
+ printf >&2 'added.\n'
+ ;;
+ c)
+ f_command=1
+ f_arg="$OPTARG"
+ ;;
+ s) f_status=1 ;;
+ l) cat "$repos" ;;
+ e) $EDITOR "$repos" ;;
+ f) repos="$OPTARG" ;;
+ h) help ;;
+ :)
+ printf >&2 -- '-%s requires argument\n' "$OPTARG"
+ exit 1
+ ;;
+ ?)
+ printf >&2 -- 'Invalid option: -%s\n' "$OPTARG"
+ exit 1
+ ;;
esac
done
# commands hereafter must happen in order
-[ "$(wc -l < "$repos")" -gt 0 ] || exit 0
+[ "$(wc -l <"$repos")" -gt 0 ] || exit 0
-if [ "$f_command" ]
-then
+if [ "$f_command" ]; then
repos_cmd "$f_arg"
-fi
+fi
-if [ "$f_status" ]
-then
- status
+if [ "$f_status" ]; then
+ status
fi
# eval "herbe $(status | sed 's/"/\"/g;s/.*/"&"/' | tr '\n' ' ')"