git-merge-one-file-scripton commit [PATCH] Teach diff-tree about commit objects (c1fdf2a)
   1#!/bin/sh
   2#
   3# This is the git merge script, called with
   4#
   5#   $1 - original file SHA1 (or empty)
   6#   $2 - file in branch1 SHA1 (or empty)
   7#   $3 - file in branch2 SHA1 (or empty)
   8#   $4 - pathname in repository
   9#
  10#
  11# Handle some trivial cases.. The _really_ trivial cases have
  12# been handled already by read-tree, but that one doesn't
  13# do any merges that migth change the tree layout
  14#
  15
  16# if the directory is newly added in a branch, it might not exist
  17# in the current tree
  18dir=$(dirname "$4")
  19mkdir -p "$dir"
  20
  21case "${1:-.}${2:-.}${3:-.}" in
  22#
  23# deleted in both, or deleted in one and unchanged in the other
  24#
  25"$1.." | "$1.$1" | "$1$1.")
  26        rm -f -- "$4"
  27        update-cache --remove -- "$4"
  28        exit 0
  29        ;;
  30
  31#
  32# added in one, or added identically in both
  33#
  34".$2." | "..$3" | ".$2$2")
  35        mv $(unpack-file "${2:-$3}") $4
  36        update-cache --add -- $4
  37        exit 0
  38        ;;
  39
  40#
  41# Modified in both, but differently ;(
  42#
  43"$1$2$3")
  44        echo "Auto-merging $4"
  45        orig=$(unpack-file $1)
  46        src1=$(unpack-file $2)
  47        src2=$(unpack-file $3)
  48        merge "$src2" "$orig" "$src1"
  49        if [ $? -ne 0 ]; then
  50                echo Leaving conflict merge in $src2
  51                exit 1
  52        fi
  53        cp "$src2" "$4" && update-cache --add -- "$4" && exit 0
  54        ;;
  55
  56*)
  57        echo "Not handling case $1 -> $2 -> $3"
  58        ;;
  59esac
  60exit 1