# [PATCH] Add contrib/rerere-train script

2 messages from 2008-09-27 to 2008-09-29. Participants: Nanako Shiraishi, Johannes Schindelin.
Thread: https://gitlist.dev/t/15690

## Nanako Shiraishi, 2008-09-27 11:44

Subject: [PATCH] Add contrib/rerere-train script
Message-ID: <20080927204415.6117@nanako3.lavabit.com>
URL: https://gitlist.dev/e/20080927204415.6117%40nanako3.lavabit.com

```
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

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, 2008-09-29 12:39

Subject: Re: [PATCH] Add contrib/rerere-train script
Message-ID: <alpine.DEB.1.00.0809291430050.16478@pacific.mpi-cbg.de.mpi-cbg.de>
URL: https://gitlist.dev/e/alpine.DEB.1.00.0809291430050.16478%40pacific.mpi-cbg.de.mpi-cbg.de
In-Reply-To: <20080927204415.6117@nanako3.lavabit.com>

```
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

```
