contrib / rerere-train.shon commit t4020: abstract away SHA-1-specific constants (f2fffc1)
   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