102 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/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
 |