diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2017-08-04 17:32:36 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2017-08-04 17:32:36 +1200 |
commit | 50aaa96b078e6dbc47c21355d34ef1da83ab20a8 (patch) | |
tree | 00b6eb4e1ea499b499f314ab0cc28ebd80746e74 /watch-git-tags | |
download | watch-vcs-tags-50aaa96b078e6dbc47c21355d34ef1da83ab20a8.tar.gz watch-vcs-tags-50aaa96b078e6dbc47c21355d34ef1da83ab20a8.zip |
Initial version with Makefile and README
Diffstat (limited to 'watch-git-tags')
-rwxr-xr-x | watch-git-tags | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/watch-git-tags b/watch-git-tags new file mode 100755 index 0000000..ccccd00 --- /dev/null +++ b/watch-git-tags @@ -0,0 +1,72 @@ +#!/bin/sh +self=watch-git-tags + +# List sorted local tags +lt() { + git tag -l | + LC_COLLATE=C sort +} + +# List sorted remote tags +rt() { + git ls-remote -qt | + awk '!/\^\{\}$/{print substr($2,11)}' | + LC_COLLATE=C sort +} + +# Create a temporary directory with name in $td, and handle POSIX-ish traps to +# remove it when the script exits; requires mktemp(1) (not POSIX) +td=$(mktemp -d) || exit +cleanup() { + [ -n "$td" ] || return + rm -fr -- "$td" +} +for sig in EXIT HUP INT TERM ; do + # shellcheck disable=SC2064 + trap "cleanup $sig" "$sig" +done + +# Use current directory if no other arguments +[ "$#" -gt 0 ] || set -- . + +# Iterate through each repo in a subshell in parallel +for repo ; do ( + + # Make a temporary directory with a hash in its name for uniqueness + df=$(printf %s "$repo" | sed s:/:_:g) + cs=$(printf %s "$repo" | cksum) + sd=$td/$df.${cs%% *} + mkdir -- "$sd" || exit + + # Step in and write repo path to file + cd -- "$sd" || exit + printf '%s\n' "$repo" > path || exit + + # Write local and remote tags to files + ( + cd -- "$repo" || exit + lt "$repo" > "$sd"/a || exit + rt "$repo" > "$sd"/b + ) || + exit + + # Write new tags to file + LC_COLLATE=C comm -13 -- [ab] > new + +) & done + +# Wait for each of those to finish +wait + +# Iterate through the temp dirs in order +for dir in "$td"/* ; do ( + cd -- "$dir" || exit 0 + + # Look for non-zero "new" files (at least one new tag) + [ -s new ] || exit 0 + + # Print repository path and new tags + sed '1!s/^/\t/' -- path new + exit 1 + +) ; done |