X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topgit.git;a=blobdiff_plain;f=tg.sh;h=1f259e3a03d60dad30bac2a34253cd9a78a1d7ca;hp=7c6c09f2eaa709933dc4631495c7b440556882db;hb=98835e384debb0683178f469dde93be265e03b1a;hpb=d0fd65c3d26419ec9f21310c7aaea73610b058d8 diff --git a/tg.sh b/tg.sh index 7c6c09f..1f259e3 100644 --- a/tg.sh +++ b/tg.sh @@ -3,7 +3,7 @@ # (c) Petr Baudis 2008 # GPLv2 -TG_VERSION=0.6 +TG_VERSION=0.8 ## Auxiliary functions @@ -99,7 +99,7 @@ measure_branch() # Whether B1 is a superset of B2. branch_contains() { - [ -z "$(git rev-list ^"$1" "$2" --)" ] + [ -z "$(git rev-list --max-count=1 ^"$1" "$2" --)" ] } # ref_exists REF @@ -116,6 +116,16 @@ has_remote() [ -n "$base_remote" ] && ref_exists "remotes/$base_remote/$1" } +branch_annihilated() +{ + _name="$1"; + + # use the merge base in case the base is ahead. + mb="$(git merge-base "refs/top-bases/$_name" "$_name")"; + + test "$(git rev-parse "$mb^{tree}")" = "$(git rev-parse "$_name^{tree}")"; +} + # recurse_deps CMD NAME [BRANCHPATH...] # Recursively eval CMD on all dependencies of NAME. # CMD can refer to $_name for queried branch name, @@ -126,6 +136,7 @@ has_remote() # of the whole function. # If recurse_deps() hits missing dependencies, it will append # them to space-separated $missing_deps list and skip them. +# remote dependencies are processed if no_remotes is unset. recurse_deps() { _cmd="$1"; shift @@ -133,12 +144,17 @@ recurse_deps() _depchain="$*" _depsfile="$(mktemp -t tg-depsfile.XXXXXX)" - # Check also our base against remote base. Checking our head - # against remote head has to be done in the helper. - if has_remote "top-bases/$_name"; then + # If no_remotes is unset check also our base against remote base. + # Checking our head against remote head has to be done in the helper. + if test -z "$no_remotes" && has_remote "top-bases/$_name"; then echo "refs/remotes/$base_remote/top-bases/$_name" >>"$_depsfile" fi - git cat-file blob "$_name:.topdeps" >>"$_depsfile" + + # if the branch was annihilated, there exists no .topdeps file + if ! branch_annihilated "$_name"; then + #TODO: handle nonexisting .topdeps? + git cat-file blob "$_name:.topdeps" >>"$_depsfile"; + fi; _ret=0 while read _dep; do @@ -211,7 +227,7 @@ needs_update() # branch_empty NAME branch_empty() { - [ -z "$(git diff-tree "refs/top-bases/$1" "$1" | fgrep -v " .top")" ] + [ -z "$(git diff-tree "refs/top-bases/$1" "$1" -- | fgrep -v " .top")" ] } # switch_to_base NAME [SEED] @@ -253,7 +269,8 @@ do_help() echo "TopGit v$TG_VERSION - A different patch queue manager" echo "Usage: tg [-r REMOTE] ($cmds|help) ..." elif [ -r "@cmddir@"/tg-$1 ] ; then - @cmddir@/tg-$1 -h || : + setup_pager + @cmddir@/tg-$1 -h 2>&1 || : echo if [ -r "@sharedir@/tg-$1.txt" ] ; then cat "@sharedir@/tg-$1.txt" @@ -325,8 +342,9 @@ setup_hook "pre-commit" ## Dispatch # We were sourced from another script for our utility functions; -# this is set by hooks. -[ -z "$tg__include" ] || return 0 +# this is set by hooks. Skip the rest of the file. A simple return doesn't +# work as expected in every shell. See http://bugs.debian.org/516188 +if [ -z "$tg__include" ]; then if [ "$1" = "-r" ]; then shift @@ -359,4 +377,6 @@ help|--help|-h) . "@cmddir@"/tg-$cmd;; esac +fi + # vim:noet