tg-prev/tg-next: commands to explore dependencies
authorBert Wesarg <bert.wesarg@googlemail.com>
Fri, 8 Oct 2010 07:32:36 +0000 (8 09:32 +0200)
committerBert Wesarg <bert.wesarg@googlemail.com>
Mon, 8 Nov 2010 07:27:29 +0000 (8 08:27 +0100)
Two new commands to explore the dependencies of TopGit branches:

  a) tg prev [-i | -w] [NAME]
     outputs the dependencies of NAME

  b) tg next [-i | -w] [NAME]
     outputs branches which depends on NAME

Obviously, quilt next was the inspiration.

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
.gitignore
README
contrib/tg-completion.bash
tg-next.sh [new file with mode: 0644]
tg-prev.sh [new file with mode: 0644]

index 2a4d165..6cfab6e 100644 (file)
 /tg-info.txt
 /tg-mail
 /tg-mail.txt
+/tg-next
+/tg-next.txt
 /tg-log
 /tg-log.txt
 /tg-patch
 /tg-patch.txt
+/tg-prev
+/tg-prev.txt
 /tg-push
 /tg-push.txt
 /tg-remote
diff --git a/README b/README
index b9b93ef..ed8d358 100644 (file)
--- a/README
+++ b/README
@@ -539,8 +539,24 @@ tg log
        Note: if you have merged changes from a different repository, this
        command might not list all interesting commits.
 
-TODO: tg rename
+tg prev
+~~~~~~~
+       Outputs the direct dependencies for the current or named patch.
 
+       Options:
+         -i            show dependencies based on index instead of branch
+         -w            show dependencies based on working tree instead of branch
+
+tg next
+~~~~~~~
+       Outputs all patches which directly depend on the current or
+       named patch.
+
+       Options:
+         -i            show dependencies based on index instead of branch
+         -w            show dependencies based on working tree instead of branch
+
+TODO: tg rename
 
 IMPLEMENTATION
 --------------
index ddc7655..e34b66f 100755 (executable)
@@ -453,6 +453,38 @@ _tg_update ()
        esac
 }
 
+_tg_next ()
+{
+       local cur="${COMP_WORDS[COMP_CWORD]}"
+
+       case "$cur" in
+       -*)
+               __tgcomp "
+                       -i
+                       -w
+               "
+               ;;
+       *)
+               __tgcomp "$(__tg_heads)"
+       esac
+}
+
+_tg_prev ()
+{
+       local cur="${COMP_WORDS[COMP_CWORD]}"
+
+       case "$cur" in
+       -*)
+               __tgcomp "
+                       -i
+                       -w
+               "
+               ;;
+       *)
+               __tgcomp "$(__tg_topics)"
+       esac
+}
+
 ### }}}
 ### {{{ tg completion
 
@@ -500,7 +532,9 @@ _tg ()
        info)        _tg_info ;;
        log)         _tg_log ;;
        mail)        _tg_mail ;;
+       next)        _tg_next ;;
        patch)       _tg_patch ;;
+       prev)        _tg_prev ;;
        push)        _tg_push ;;
        remote)      _tg_remote ;;
        summary)     _tg_summary ;;
diff --git a/tg-next.sh b/tg-next.sh
new file mode 100644 (file)
index 0000000..93dd5b5
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/sh
+# TopGit - A different patch queue manager
+# (c) Petr Baudis <pasky@suse.cz>  2008
+# (c) Bert Wesarg <Bert.Wesarg@googlemail.com>  2009
+# GPLv2
+
+name=
+head_from=
+
+
+## Parse options
+
+while [ -n "$1" ]; do
+       arg="$1"; shift
+       case "$arg" in
+       -i|-w)
+               [ -z "$head_from" ] || die "-i and -w are mutually exclusive"
+               head_from="$arg";;
+       -*)
+               echo "Usage: tg next [-i | -w] [NAME]" >&2
+               exit 1;;
+       *)
+               [ -z "$name" ] || die "name already specified ($name)"
+               name="$arg";;
+       esac
+done
+
+head="$(git rev-parse --abbrev-ref=loose HEAD)"
+[ -n "$name" ] ||
+       name="$head"
+
+git for-each-ref --format='%(refname)' refs/top-bases |
+       while read ref; do
+               parent="${ref#refs/top-bases/}"
+
+               from=$head_from
+               # select .topdeps source for HEAD branch
+               [ "x$parent" = "x$head" ] ||
+                       from=
+
+               cat_file "$parent:.topdeps" $from | fgrep -qx "$name" ||
+                       continue
+
+               echo "$parent"
+       done
diff --git a/tg-prev.sh b/tg-prev.sh
new file mode 100644 (file)
index 0000000..1f1e0c1
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+# TopGit - A different patch queue manager
+# (c) Petr Baudis <pasky@suse.cz>  2008
+# (c) Bert Wesarg <Bert.Wesarg@googlemail.com>  2009
+# GPLv2
+
+name=
+head_from=
+
+
+## Parse options
+
+while [ -n "$1" ]; do
+       arg="$1"; shift
+       case "$arg" in
+       -i|-w)
+               [ -z "$head_from" ] || die "-i and -w are mutually exclusive"
+               head_from="$arg";;
+       -*)
+               echo "Usage: tg next [-i | -w] [NAME]" >&2
+               exit 1;;
+       *)
+               [ -z "$name" ] || die "name already specified ($name)"
+               name="$arg";;
+       esac
+done
+
+head="$(git rev-parse --abbrev-ref=loose HEAD)"
+[ -n "$name" ] ||
+       name="$head"
+base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" ||
+       die "not a TopGit-controlled branch"
+
+# select .topdeps source for HEAD branch
+[ "x$name" = "x$head" ] ||
+       head_from=
+
+cat_file "$name:.topdeps" $head_from