git-merge-one-file-scripton commit Merge my and Petr's git-merge-one-file-script modifications (566487c)
   1#!/bin/sh
   2#
   3# Copyright (c) Linus Torvalds, 2005
   4#
   5# This is the git per-file merge script, called with
   6#
   7#   $1 - original file SHA1 (or empty)
   8#   $2 - file in branch1 SHA1 (or empty)
   9#   $3 - file in branch2 SHA1 (or empty)
  10#   $4 - pathname in repository
  11#   $5 - orignal file mode (or empty)
  12#   $6 - file in branch1 mode (or empty)
  13#   $7 - file in branch2 mode (or empty)
  14#
  15# Handle some trivial cases.. The _really_ trivial cases have
  16# been handled already by git-read-tree, but that one doesn't
  17# do any merges that might change the tree layout.
  18
  19case "${1:-.}${2:-.}${3:-.}" in
  20#
  21# Deleted in both.
  22#
  23"$1..")
  24        echo "WARNING: $4 is removed in both branches."
  25        echo "WARNING: This is a potential rename conflict."
  26        rm -f -- "$4" &&
  27                exec git-update-cache --remove -- "$4"
  28        ;;
  29
  30#
  31# Deleted in one and unchanged in the other.
  32#
  33"$1.$1" | "$1$1.")
  34        echo "Removing $4"
  35        exec rm -f -- "$4" &&
  36                git-update-cache --remove -- "$4"
  37        ;;
  38
  39#
  40# Added in one.
  41#
  42".$2." | "..$3" )
  43        case "$6$7" in *7??) mode=+x;; *) mode=-x;; esac
  44        echo "Adding $4 with perm $mode."
  45        exec git-cat-file blob "$2$3" >"$4" &&
  46                chmod $mode -- "$4" &&
  47                git-update-cache --add -- "$4"
  48        ;;
  49
  50#
  51# Added in both (check for same permissions).
  52#
  53".$3$2")
  54        if [ "$6" != "$7" ]; then
  55                echo "ERROR: File $4 added identically in both branches,"
  56                echo "ERROR: but permissions conflict $6->$7."
  57                exit 1
  58        fi
  59        case "$6" in *7??) mode=+x;; *) mode=-x;; esac
  60        echo "Adding $4 with perm $mode"
  61        exec git-cat-file blob "$2" >"$4" &&
  62                chmod $mode -- "$4" &&
  63                git-update-cache --add -- "$4"
  64        ;;
  65
  66#
  67# Modified in both, but differently.
  68#
  69"$1$2$3")
  70        echo "Auto-merging $4."
  71        orig=`git-unpack-file $1`
  72        src1=`git-unpack-file $2`
  73        src2=`git-unpack-file $3`
  74
  75        merge -p "$src1" "$orig" "$src2" > "$4"
  76        ret=$?
  77        rm -f -- "$orig" "$src1" "$src2"
  78
  79        if [ "$6" != "$7" ]; then
  80                echo "ERROR: Permissions conflict: $5->$6,$7."
  81                ret=1
  82        fi
  83        case "$6" in *7??) mode=+x;; *) mode=-x;; esac
  84        chmod "$mode" "$4"
  85
  86        if [ $ret -ne 0 ]; then
  87                # Reset the index to the first branch, making
  88                # git-diff-file useful
  89                git-update-cache --add --cacheinfo "$6" "$2" "$4"
  90                echo "ERROR: Merge conflict in $4."
  91                exit 1
  92        fi
  93        exec git-update-cache --add -- "$4"
  94        ;;
  95
  96*)
  97        echo "ERROR: $4: Not handling case $1 -> $2 -> $3"
  98        ;;
  99esac
 100exit 1