src-git (1303B)
1 #!/bin/sh 2 3 disp() { 4 tr '\n' '\0' | xargs -0 -I '{}' printf "\x1b[2K%-25s %.60s\r" "$1" '{}' 5 } 6 7 for dir in ~/.usr/src/*; do 8 [ -d "$dir"/.git ] || continue 9 10 if git -C "$dir" symbolic-ref -q HEAD >/dev/null; then 11 [ "$1" = "-u" ] && git -C "$dir" remote -v update 2>&1 | disp "$(basename $dir)" 12 branch="$(git -C "$dir" rev-parse --abbrev-ref HEAD)" 13 if [ "$branch" = "HEAD" ]; then 14 echo "No branch or tag found for $pkg" 15 exit 1 16 fi 17 if remote="$(git -C "$dir" rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null)"; then 18 commits="$(git -C "$dir" rev-list --left-only --count "$remote...@")" 19 if [ "$commits" != 0 ]; then 20 /usr/bin/printf "\x1b[2K%-25s %15s ++ %s\n" "$(basename $dir)" "$branch" "$commits" 21 fi 22 fi 23 else 24 tag="$(git -C "$dir" describe --exact-match --tags)" 25 [ "$1" = "-u" ] && git -C "$dir" fetch -v --tags 2>&1 | disp "$(basename $dir)" 26 remote_tag="$(git -C "$dir" for-each-ref --sort=creatordate --format '%(refname)' refs/tags | cut -d/ -f3 | tail -1)" 27 if [ "${tag#v}" != "${remote_tag#v}" ]; then 28 /usr/bin/printf "\x1b[2K%-25s %15s -> %s\n" "$(basename $dir)" "$tag" "$remote_tag" 29 fi 30 fi 31 done