X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topgit.git;a=blobdiff_plain;f=tg.sh;h=2961106f735402d695043f31b32ffdef298566b3;hp=0eec4d4dc3158bbc40645da742323c08beb62236;hb=4c43b712e5a10dd632bfc2bf38c01af66da84e41;hpb=11c70d59e524a64a44f810ce0da437a9e18a004c diff --git a/tg.sh b/tg.sh index 0eec4d4..2961106 100644 --- a/tg.sh +++ b/tg.sh @@ -20,13 +20,13 @@ die() # setup_hook NAME setup_hook() { - hook_call="\"\$(tg --hooks-path)\"/$1 \"\$@\"" + hook_call="\"\$($tg --hooks-path)\"/$1 \"\$@\"" if [ -f "$git_dir/hooks/$1" ] && fgrep -q "$hook_call" "$git_dir/hooks/$1"; then # Another job well done! return fi - # Prepare incanation + # Prepare incantation if [ -x "$git_dir/hooks/$1" ]; then hook_call="$hook_call"' || exit $?' else @@ -77,7 +77,7 @@ measure_branch() # Whether B1 is a superset of B2. branch_contains() { - [ -z "$(git rev-list ^"$1" "$2")" ] + [ -z "$(git rev-list ^"$1" "$2" --)" ] } # ref_exists REF @@ -87,6 +87,13 @@ ref_exists() git rev-parse --verify "$@" >/dev/null 2>&1 } +# has_remote BRANCH +# Whether BRANCH has a remote equivalent (accepts top-bases/ too) +has_remote() +{ + [ -n "$base_remote" ] && ref_exists "remotes/$base_remote/$1" +} + # recurse_deps CMD NAME [BRANCHPATH...] # Recursively eval CMD on all dependencies of NAME. # CMD can refer to $_name for queried branch name, @@ -106,9 +113,8 @@ recurse_deps() _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. - _remotebase="refs/remotes/$base_remote/top-bases/$_name" - if [ -n "$base_remote" ] && ref_exists "$_remotebase"; then - echo "$_remotebase" >>"$_depsfile" + if has_remote "top-bases/$_name"; then + echo "refs/remotes/$base_remote/top-bases/$_name" >>"$_depsfile" fi git cat-file blob "$_name:.topdeps" >>"$_depsfile" @@ -147,7 +153,7 @@ branch_needs_update() { _dep_base_update= if [ -n "$_dep_is_tgish" ]; then - if [ -n "$base_remote" ] && ref_exists "refs/remotes/$base_remote/$_dep"; then + if has_remote "$_dep"; then branch_contains "$_dep" "refs/remotes/$base_remote/$_dep" || _dep_base_update=% fi # This can possibly override the remote check result; @@ -216,10 +222,14 @@ do_help() sep="|" done - echo "TopGit v0.2 - A different patch queue manager" - echo "Usage: tg ($cmds|help) ..." - elif [ -r "@sharedir@/tg-$1.txt" ] ; then - cat "@sharedir@/tg-$1.txt" + echo "TopGit v0.5 - A different patch queue manager" + echo "Usage: tg [-r REMOTE] ($cmds|help) ..." + elif [ -r "@cmddir@"/tg-$1 ] ; then + @cmddir@/tg-$1 -h || : + echo + if [ -r "@sharedir@/tg-$1.txt" ] ; then + cat "@sharedir@/tg-$1.txt" + fi else echo "`basename $0`: no help for $1" 1>&2 fi @@ -231,7 +241,10 @@ do_help() set -e git_dir="$(git rev-parse --git-dir)" root_dir="$(git rev-parse --show-cdup)"; root_dir="${root_dir:-.}" +# Make sure root_dir doesn't end with a trailing slash. +root_dir="${root_dir%/}" base_remote="$(git config topgit.remote 2>/dev/null)" || : +tg="tg" # make sure merging the .top* files will always behave sanely setup_ours setup_hook "pre-commit" @@ -245,6 +258,11 @@ setup_hook "pre-commit" # this is set by hooks. [ -z "$tg__include" ] || return 0 +if [ "$1" = "-r" ]; then + shift; base_remote="$1"; shift + tg="$tg -r $base_remote" +fi + cmd="$1" [ -n "$cmd" ] || die "He took a duck in the face at two hundred and fifty knots" shift