[TopGit PATCH 09/11] tg-prev/tg-next: commands to explore dependencies
From: Bert Wesarg <hidden>
Date: 2016-06-15 22:49:44
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted>
---
.gitignore | 4 +++
README | 18 ++++++++++++++++-
contrib/tg-completion.bash | 34 +++++++++++++++++++++++++++++++++
tg-next.sh | 45 ++++++++++++++++++++++++++++++++++++++++++++
tg-prev.sh | 38 +++++++++++++++++++++++++++++++++++++
5 files changed, 138 insertions(+), 1 deletions(-)
create mode 100644 tg-next.sh
create mode 100644 tg-prev.sh
diff --git a/.gitignore b/.gitignore
index 2a4d165..6cfab6e 100644 .gitignore
--- a/.gitignore
+++ b/.gitignore@@ -30,10 +30,14 @@ /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 c5a8ae0..7760218 100644 README
--- a/README
+++ b/README@@ -541,8 +541,24 @@ tg files -i list files based on index instead of branch -w list files based on working tree instead of branch -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 --------------
diff --git a/contrib/tg-completion.bash b/contrib/tg-completion.bash
index ddc7655..e34b66f 100755 contrib/tg-completion.bash
--- a/contrib/tg-completion.bash
+++ b/contrib/tg-completion.bash@@ -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
index 0000000..93dd5b5 tg-next.sh
--- /dev/null
+++ b/tg-next.sh@@ -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
index 0000000..1f1e0c1 tg-prev.sh
--- /dev/null
+++ b/tg-prev.sh@@ -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
--
1.7.1.1067.g5aeb7