| #!/bin/sh |
| set -e |
| |
| # stg-gitk - helper script to graphically display an StGIT stack |
| |
| # Displays given branches and stacks, without getting disturbed by |
| # patch logs. |
| |
| # LIMITATIONS: |
| # - 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 >&2 "$helptext" |
| exit 1 |
| } |
| |
| allbranches=0 |
| 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 ] && [ "$branches" != "" ]; then |
| usage |
| fi |
| |
| 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 |
| # default to current branch |
| if [ "$branches" == "" ]; then |
| branches="$(stg branch)" |
| fi |
| if [ "$branches" == "" ]; then |
| echo >&2 "ERROR: cannot find current branch." |
| exit 1 |
| fi |
| |
| # 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 |
| # other ref |
| refdirs="$refdirs $(git-for-each-ref --format="$GIT_DIR/%(refname)" "refs/$b")" |
| else |
| echo >&2 "ERROR: no such ref '$b'" |
| usage |
| fi |
| done |
| fi |
| |
| 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 |