1#!/bin/sh
2# Copyright (c) 2008, Nanako Shiraishi
3# Prime rerere database from existing merge commits
4
5me=rerere-train
6USAGE=$(cat <<-EOF
7usage: $me [--overwrite] <rev-list-args>
8
9    -h, --help            show the help
10    -o, --overwrite       overwrite any existing rerere cache
11EOF
12)
13
14SUBDIRECTORY_OK=Yes
15
16overwrite=0
17
18while test $# -gt 0
19do
20	opt="$1"
21	case "$opt" in
22	-h|--help)
23		echo "$USAGE"
24		exit 0
25		;;
26	-o|--overwrite)
27		overwrite=1
28		shift
29		break
30		;;
31	--)
32		shift
33		break
34		;;
35	*)
36		break
37		;;
38	esac
39done
40
41# Overwrite or help options are not valid except as first arg
42for opt in "$@"
43do
44	case "$opt" in
45	-h|--help)
46		echo "$USAGE"
47		exit 0
48		;;
49	-o|--overwrite)
50		echo "$USAGE"
51		exit 0
52		;;
53	esac
54done
55
56. "$(git --exec-path)/git-sh-setup"
57require_work_tree
58cd_to_toplevel
59
60# Remember original branch
61branch=$(git symbolic-ref -q HEAD) ||
62original_HEAD=$(git rev-parse --verify HEAD) || {
63	echo >&2 "Not on any branch and no commit yet?"
64	exit 1
65}
66
67mkdir -p "$GIT_DIR/rr-cache" || exit
68
69git rev-list --parents "$@" |
70while read commit parent1 other_parents
71do
72	if test -z "$other_parents"
73	then
74		# Skip non-merges
75		continue
76	fi
77	git checkout -q "$parent1^0"
78	if git merge $other_parents >/dev/null 2>&1
79	then
80		# Cleanly merges
81		continue
82	fi
83	if test $overwrite = 1
84	then
85		git rerere forget .
86	fi
87	if test -s "$GIT_DIR/MERGE_RR"
88	then
89		git show -s --pretty=format:"Learning from %h %s" "$commit"
90		git rerere
91		git checkout -q $commit -- .
92		git rerere
93	fi
94	git reset -q --hard
95done
96
97if test -z "$branch"
98then
99	git checkout "$original_HEAD"
100else
101	git checkout "${branch#refs/heads/}"
102fi
103