Add contrib/rerere-train script
authorNanako Shiraishi <nanako3@lavabit.com>
Sat, 27 Sep 2008 11:44:15 +0000 (20:44 +0900)
committerShawn O. Pearce <spearce@spearce.org>
Mon, 29 Sep 2008 16:15:41 +0000 (09:15 -0700)
This script takes a range of commits (e.g. maint..next) as its arguments,
recreates merge commits in the range to prime rr-cache database.

Signed-off-by: Nanako Shiraishi <nanako3@lavabit.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
contrib/rerere-train.sh [new file with mode: 0755]

diff --git a/contrib/rerere-train.sh b/contrib/rerere-train.sh
new file mode 100755 (executable)
index 0000000..2cfe1b9
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/sh
+# Copyright (c) 2008, Nanako Shiraishi
+# Prime rerere database from existing merge commits
+
+me=rerere-train
+USAGE="$me rev-list-args"
+
+SUBDIRECTORY_OK=Yes
+OPTIONS_SPEC=
+. git-sh-setup
+require_work_tree
+cd_to_toplevel
+
+# Remember original branch
+branch=$(git symbolic-ref -q HEAD) ||
+original_HEAD=$(git rev-parse --verify HEAD) || {
+       echo >&2 "Not on any branch and no commit yet?"
+       exit 1
+}
+
+mkdir -p "$GIT_DIR/rr-cache" || exit
+
+git rev-list --parents "$@" |
+while read commit parent1 other_parents
+do
+       if test -z "$other_parents"
+       then
+               # Skip non-merges
+               continue
+       fi
+       git checkout -q "$parent1^0"
+       if git merge $other_parents >/dev/null 2>&1
+       then
+               # Cleanly merges
+               continue
+       fi
+       if test -s "$GIT_DIR/MERGE_RR"
+       then
+               git show -s --pretty=format:"Learning from %h %s" "$commit"
+               git rerere
+               git checkout -q $commit -- .
+               git rerere
+       fi
+       git reset -q --hard
+done
+
+if test -z "$branch"
+then
+       git checkout "$original_HEAD"
+else
+       git checkout "${branch#refs/heads/}"
+fi