threads / patch / 15690

patchAdd contrib/rerere-train script

Subject: [PATCH] Add contrib/rerere-train script

## tl;dr

2 messages between Sep 27, 2008 and Sep 29, 2008. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Nanako Shiraishi· Sep 27, 2008, 11:44 UTC · lore

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>
---
 contrib/rerere-train.sh |   52 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)
 create mode 100755 contrib/rerere-train.sh
Show changes to contrib/rerere-train.sh +52 −0
diff --git a/contrib/rerere-train.sh b/contrib/rerere-train.sh
new file mode 100755
index 0000000..2cfe1b9
--- /dev/null
+++ b/contrib/rerere-train.sh
@@ -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
-- 
1.6.0.2

-- 
Nanako Shiraishi
http://ivory.ap.teacup.com/nanako3/
Johannes Schindelin· Sep 29, 2008, 12:39 UTC · re: Nanako Shiraishi · lore

Re: [PATCH] Add contrib/rerere-train script

Hi,
On Sat, 27 Sep 2008, Nanako Shiraishi wrote:
> 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.

Cute idea. However, I would _love_ to have this as an option to git-rerere, which would work in memory only.

This is how I would do it (if I had enough time to play with Git):
- teach merge_recursive_options not to write anything to the working 
  directory (should be relatively easy, as many parts of merge-recursive.c 
  already have no_wd/update_wd/!o->call_depth checks for that),
- refactor handle_file() in rerere.c to provide an in-memory-only version,
- teach rerere to call merge_recursive() with the in-memory-only option, 
  and then call the in-memory version of the handle_file() function for 
  all unmerged paths, using the resolutions from the given merge commit.
- then teach this new function to take an arbitrary commit range (but only 
  handling the two-parent merges within it).

Ciao, Dscho

← back to recent threads