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 # Might nuke untracked files... 95done 96 97if test -z "$branch" 98then 99 git checkout "$original_HEAD" 100else 101 git checkout "${branch#refs/heads/}" 102fi 103