X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/cdd071ff33c6197a7c860b44be04c0614c4a0dab..00be16b0cde8e6c6cf23f0c3e530f85a4d4fbd90:/contrib/stg-gitk diff --git a/contrib/stg-gitk b/contrib/stg-gitk index dd01ef0..e3ddfb1 100755 --- a/contrib/stg-gitk +++ b/contrib/stg-gitk @@ -7,50 +7,66 @@ set -e # patch logs. # LIMITATIONS: -# - asking gitk to "update" won't detect any new ref # - no support for spaces in branch names # Copyright (c) 2007 Yann Dirson # Subject to the GNU GPL, version 2. +helptext="Usage: $(basename $0) [--refs] [|--all] [-- ]" + usage() { - echo "Usage: $(basename $0) [|--all]" + echo >&2 "$helptext" exit 1 } allbranches=0 -case "$1" in ---all) allbranches=1; shift ;; ---*) usage ;; -*) break ;; -esac +refsonly=0 +branches='' +while [ "$#" -gt 0 ]; do + case "$1" in + --refs) refsonly=1 ;; + --all) allbranches=1 ;; + --help) echo "$helptext"; exit 0 ;; + --) shift; break ;; + --*) usage ;; + *) branches="$branches $1" ;; + esac + shift +done +# Now any remaining stuff in $@ are additional options for gitk -if [ $allbranches = 1 ] && [ "$#" -gt 0 ]; then +if [ $allbranches = 1 ] && [ "$branches" != "" ]; then usage fi -GIT_DIR=$(git-rev-parse --git-dir) +GIT_DIR=$(git rev-parse --git-dir) GIT_DIR_SPKIPLEN=$(printf "$GIT_DIR/X" | wc -c) refdirs='' if [ $allbranches = 1 ]; then refdirs="$GIT_DIR/refs" else - if [ "$#" = 0 ]; then - set -- "$(stg branch)" + # default to current branch + if [ "$branches" == "" ]; then + branches="$(stg branch)" + fi + if [ "$branches" == "" ]; then + echo >&2 "ERROR: cannot find current branch." + exit 1 fi - for b in "$@"; do + # expand patches for each named branch + for b in $branches; do if [ -e "$GIT_DIR/refs/patches/$b" ]; then # StGIT branch: show all patches refdirs="$refdirs $GIT_DIR/refs/heads/$b $GIT_DIR/refs/patches/$b" elif [ -e "$GIT_DIR/refs/heads/$b" ]; then # other GIT branch refdirs="$refdirs $GIT_DIR/refs/heads/$b" - elif [ $(git-for-each-ref "refs/$b" | wc -l) != 0 ]; then + elif [ $(git for-each-ref "refs/$b" | wc -l) != 0 ]; then # other ref - refdirs="$refdirs $(git-for-each-ref --format="$GIT_DIR/%(refname)" "refs/$b")" + refdirs="$refdirs $(git for-each-ref --format="$GIT_DIR/%(refname)" "refs/$b")" else echo >&2 "ERROR: no such ref '$b'" usage @@ -58,4 +74,22 @@ else done fi -gitk $(find $refdirs -type f -not -name '*.log' | cut -c${GIT_DIR_SPKIPLEN}- ) +printrefs() +{ + find $refdirs -type f -not -name '*.log' | cut -c${GIT_DIR_SPKIPLEN}- +} + +if [ $refsonly = 1 ]; then + printrefs +elif grep -q -- --argscmd $(which gitk); then + # This gitk supports --argscmd. + # Let's use a hack to pass --all, which was consumed during command-line parsing + if [ $allbranches = 1 ]; then + gitk --argscmd="$0 --refs --all" "$@" + else + gitk --argscmd="$0 --refs $branches" "$@" + fi +else + # This gitk does not support --argscmd, just compute refs onces + gitk $(printrefs) "$@" +fi