chiark / gitweb /
stg-gitk: allow passing args to gitk; add --help.
[stgit] / contrib / stg-gitk
1 #!/bin/sh
2 set -e
3
4 # stg-gitk - helper script to graphically display an StGIT stack
5
6 # Displays given branches and stacks, without getting disturbed by
7 # patch logs.
8
9 # LIMITATIONS:
10 # - no support for spaces in branch names
11
12 # Copyright (c) 2007 Yann Dirson <ydirson@altern.org>
13 # Subject to the GNU GPL, version 2.
14
15 helptext="Usage: $(basename $0) [--refs] [<branches>|--all] [-- <gitk args>]"
16
17 usage()
18 {
19     echo >&2 "$helptext"
20     exit 1
21 }
22
23 allbranches=0
24 refsonly=0
25 branches=''
26 while [ "$#" -gt 0 ]; do
27     case "$1" in
28         --refs) refsonly=1 ;;
29         --all) allbranches=1 ;;
30         --help) echo "$helptext"; exit 0 ;;
31         --) shift; break ;;
32         --*) usage ;;
33         *) branches="$branches $1" ;;
34     esac
35     shift
36 done
37 # Now any remaining stuff in $@ are additional options for gitk
38
39 if [ $allbranches = 1 ] && [ "$branches" != "" ]; then
40     usage
41 fi
42
43 GIT_DIR=$(git-rev-parse --git-dir)
44 GIT_DIR_SPKIPLEN=$(printf "$GIT_DIR/X" | wc -c)
45
46 refdirs=''
47 if [ $allbranches = 1 ]; then
48     refdirs="$GIT_DIR/refs"
49 else
50     # default to current branch
51     if [ "$branches" == "" ]; then
52         branches="$(stg branch)"
53     fi
54     if [ "$branches" == "" ]; then
55         echo >&2 "ERROR: cannot find current branch."
56         exit 1
57     fi
58
59     # expand patches for each named branch
60     for b in $branches; do
61         if [ -e "$GIT_DIR/refs/patches/$b" ]; then
62             # StGIT branch: show all patches
63             refdirs="$refdirs $GIT_DIR/refs/heads/$b $GIT_DIR/refs/patches/$b"
64         elif [ -e "$GIT_DIR/refs/heads/$b" ]; then
65             # other GIT branch
66             refdirs="$refdirs $GIT_DIR/refs/heads/$b"
67         elif [ $(git-for-each-ref "refs/$b" | wc -l) != 0 ]; then
68             # other ref
69             refdirs="$refdirs $(git-for-each-ref --format="$GIT_DIR/%(refname)" "refs/$b")"
70         else
71             echo >&2 "ERROR: no such ref '$b'"
72             usage
73         fi
74     done
75 fi
76
77 printrefs()
78 {
79     find $refdirs -type f -not -name '*.log' | cut -c${GIT_DIR_SPKIPLEN}-
80 }
81
82 if [ $refsonly = 1 ]; then
83     printrefs
84 elif grep -q -- --argscmd $(which gitk); then
85     # This gitk supports --argscmd.
86     # Let's use a hack to pass --all, which was consumed during command-line parsing
87     if [ $allbranches = 1 ]; then
88         gitk --argscmd="$0 --refs --all" "$@"
89     else
90         gitk --argscmd="$0 --refs $branches" "$@"
91     fi
92 else
93     # This gitk does not support --argscmd, just compute refs onces
94     gitk $(printrefs) "$@"
95 fi