| #!/bin/sh | 
 | # Copyright (c) 2008, Nanako Shiraishi | 
 | # Prime rerere database from existing merge commits | 
 |  | 
 | me=rerere-train | 
 | USAGE=$(cat <<-EOF | 
 | usage: $me [--overwrite] <rev-list-args> | 
 |  | 
 |     -h, --help            show the help | 
 |     -o, --overwrite       overwrite any existing rerere cache | 
 | EOF | 
 | ) | 
 |  | 
 | SUBDIRECTORY_OK=Yes | 
 |  | 
 | overwrite=0 | 
 |  | 
 | while test $# -gt 0 | 
 | do | 
 | 	opt="$1" | 
 | 	case "$opt" in | 
 | 	-h|--help) | 
 | 		echo "$USAGE" | 
 | 		exit 0 | 
 | 		;; | 
 | 	-o|--overwrite) | 
 | 		overwrite=1 | 
 | 		shift | 
 | 		break | 
 | 		;; | 
 | 	--) | 
 | 		shift | 
 | 		break | 
 | 		;; | 
 | 	*) | 
 | 		break | 
 | 		;; | 
 | 	esac | 
 | done | 
 |  | 
 | # Overwrite or help options are not valid except as first arg | 
 | for opt in "$@" | 
 | do | 
 | 	case "$opt" in | 
 | 	-h|--help) | 
 | 		echo "$USAGE" | 
 | 		exit 0 | 
 | 		;; | 
 | 	-o|--overwrite) | 
 | 		echo "$USAGE" | 
 | 		exit 0 | 
 | 		;; | 
 | 	esac | 
 | done | 
 |  | 
 | . "$(git --exec-path)/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 $overwrite = 1 | 
 | 	then | 
 | 		git rerere forget . | 
 | 	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 |