Adds a command 'tg graft <command>' that evaluates <command> with a special GIT_GRAFT_FILE: the parent of each patch head is its patch base, and the parents of the patch base are the dependencies of the patch. Try, for example, 'tg graft "gitk --all"'. Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- Mainly sending this so someone can turn it into a useful feature, and maybe build a few subcommands on top of it (that might call gitk or 'git log --graph', for example). The one big issue with the resulting history is that the commit messages at the tip aren't very interesting and may even be completely irrelevant (for a base merge). I don't see a good solution for that. Makefile | 2 +- tg-graft.sh | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletions(-) create mode 100755 tg-graft.sh diff --git a/Makefile b/Makefile index 6eade1e..57745c0 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ sharedir = $(PREFIX)/share/topgit hooksdir = $(cmddir)/hooks -commands_in = tg-create.sh tg-delete.sh tg-export.sh tg-info.sh tg-patch.sh tg-summary.sh tg-update.sh +commands_in = tg-create.sh tg-delete.sh tg-export.sh tg-info.sh tg-patch.sh tg-summary.sh tg-update.sh tg-graft.sh hooks_in = hooks/pre-commit.sh commands_out = $(patsubst %.sh,%,$(commands_in)) diff --git a/tg-graft.sh b/tg-graft.sh new file mode 100755 index 0000000..b6d0458 --- /dev/null +++ b/tg-graft.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# TopGit - A different patch queue manager +# (c) Petr Baudis <pasky@xxxxxxx> 2008 +# GPLv2 + +if [ -z "$1" -o -n "$2" ]; then + echo "Usage: tg graft <command>" >&2 + exit 1 +fi + +mkdir -p "$git_dir"/info + +grafts_file="$(mktemp)" + +if [ -f "$git_dir"/info/grafts ]; then + cp "$git_dir"/info/grafts "$grafts_file" +fi + +mapdir="$(mktemp -d)" + +git for-each-ref refs/top-bases | + while read rev name ref; do + name="${ref#refs/top-bases/}" + tip=$(git rev-parse "$name") + base=$(git rev-parse "$ref") + if [ "$tip" != "$base" ]; then + echo $base >> "$mapdir"/$tip + fi + git cat-file blob "$name:.topdeps" | + while read dep; do + if git rev-parse --verify "$dep" >/dev/null 2>&1; then + rev=$(git rev-parse "$dep") + [ $rev != $base ] && echo $rev >> "$mapdir"/$base + fi + done + done + +for sha in $(cd "$mapdir" && ls); do + echo $sha $(cat "$mapdir"/$sha | sort -u) >> "$grafts_file" +done + +rm -rf "$mapdir" + +export GIT_GRAFT_FILE="$grafts_file" +eval "$1" + +rm "$grafts_file" -- 1.6.0.rc2.53.gfa6b9 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html