Never skip rebase
[stgit] / contrib / stg-gitk
index dd01ef0..e3ddfb1 100755 (executable)
@@ -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 <ydirson@altern.org>
 # Subject to the GNU GPL, version 2.
 
+helptext="Usage: $(basename $0) [--refs] [<branches>|--all] [-- <gitk args>]"
+
 usage()
 {
-    echo "Usage: $(basename $0) [<branches>|--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