Source

git / git-merge-one-file.sh

Linus Torvalds 839a7a0 

Petr Baudis ec73962 


Linus Torvalds 839a7a0 
Linus Torvalds e3b4be7 


Linus Torvalds 839a7a0 
Pavel Roskin 82e5a82 
Junio C Hamano ee28152 

Linus Torvalds 839a7a0 
Linus Torvalds e3b4be7 
Junio C Hamano 5be6007 
Petr Baudis ec73962 
James Bottomley 0a9ea85 
Jonathan Nieder ae5bdda 





Jeff King 6aaeca9 




Jonathan Nieder ae5bdda 





Linus Torvalds e3b4be7 
Linus Torvalds 839a7a0 
Linus Torvalds 98a96b0 
Linus Torvalds 839a7a0 
Linus Torvalds 98a96b0 
Linus Torvalds cdcb0ed 

Junio C Hamano ed93b44 



Junio C Hamano 561b0fb 


Linus Torvalds cdcb0ed 
Petr Baudis 0b124bb 
Junio C Hamano 397c766 
Mark Wooding f327dbc 
Junio C Hamano aacc15e 
Junio C Hamano 5be6007 
Petr Baudis ec73962 

Linus Torvalds 839a7a0 
Junio C Hamano ee28152 
Linus Torvalds 839a7a0 
Junio C Hamano ed93b44 

Junio C Hamano 561b0fb 

Junio C Hamano ed93b44 

Linus Torvalds 98a96b0 
Junio C Hamano 29dc133 

Junio C Hamano ed93b44 

Junio C Hamano 29dc133 
Junio C Hamano 561b0fb 
Junio C Hamano 5be6007 
Petr Baudis ec73962 

James Bottomley e2b6a9d 
Junio C Hamano f7d24bb 
James Bottomley e2b6a9d 
Junio C Hamano ee28152 
James Bottomley e2b6a9d 
Junio C Hamano ee28152 

James Bottomley e2b6a9d 

Linus Torvalds 98a96b0 
Junio C Hamano 5be6007 

Petr Baudis ec73962 

Linus Torvalds e3b4be7 
Junio C Hamano ee28152 
Linus Torvalds e3b4be7 
Junio C Hamano f7d24bb 
Junio C Hamano 54dd99a 





Junio C Hamano ff72af0 



Junio C Hamano 54dd99a 

Junio C Hamano cb93c19 
Junio C Hamano f7d24bb 


Junio C Hamano 5be6007 
Junio C Hamano cb93c19 
Junio C Hamano f7d24bb 
Junio C Hamano fd66dbf 
Junio C Hamano 09ce4bb 
Junio C Hamano fd66dbf 




Junio C Hamano f7d24bb 

Alex Riesen 31f883d 
Junio C Hamano f7d24bb 


Petr Baudis ec73962 
Junio C Hamano b539c5e 


Junio C Hamano 5be6007 
James Bottomley e2b6a9d 
Alex Riesen 718135e 



Junio C Hamano b539c5e 


Jeff King 6aaeca9 
Junio C Hamano b539c5e 
Petr Baudis 8544a6f 
James Bottomley e2b6a9d 
Alex Riesen 718135e 



Linus Torvalds 2a68a86 
James Bottomley e2b6a9d 
Junio C Hamano f7d24bb 


Petr Baudis 8544a6f 
James Bottomley e2b6a9d 
Alex Riesen 718135e 
James Bottomley 0a9ea85 

Junio C Hamano 5be6007 
Petr Baudis ec73962 

Linus Torvalds e3b4be7 
Petr Baudis ec73962 

Linus Torvalds e3b4be7 
#!/bin/sh
#
# Copyright (c) Linus Torvalds, 2005
#
# This is the git per-file merge script, called with
#
#   $1 - original file SHA1 (or empty)
#   $2 - file in branch1 SHA1 (or empty)
#   $3 - file in branch2 SHA1 (or empty)
#   $4 - pathname in repository
#   $5 - original file mode (or empty)
#   $6 - file in branch1 mode (or empty)
#   $7 - file in branch2 mode (or empty)
#
# Handle some trivial cases.. The _really_ trivial cases have
# been handled already by git read-tree, but that one doesn't
# do any merges that might change the tree layout.

USAGE='<orig blob> <our blob> <their blob> <path>'
USAGE="$USAGE <orig mode> <our mode> <their mode>"
LONG_USAGE="Usage: git merge-one-file $USAGE

Blob ids and modes should be empty for missing files."

SUBDIRECTORY_OK=Yes
. git-sh-setup
cd_to_toplevel
require_work_tree

if ! test "$#" -eq 7
then
	echo "$LONG_USAGE"
	exit 1
fi

case "${1:-.}${2:-.}${3:-.}" in
#
# Deleted in both or deleted in one and unchanged in the other
#
"$1.." | "$1.$1" | "$1$1.")
	if [ "$2" ]; then
		echo "Removing $4"
	else
		# read-tree checked that index matches HEAD already,
		# so we know we do not have this path tracked.
		# there may be an unrelated working tree file here,
		# which we should just leave unmolested.  Make sure
		# we do not have it in the index, though.
		exec git update-index --remove -- "$4"
	fi
	if test -f "$4"; then
		rm -f -- "$4" &&
		rmdir -p "$(expr "z$4" : 'z\(.*\)/')" 2>/dev/null || :
	fi &&
		exec git update-index --remove -- "$4"
	;;

#
# Added in one.
#
".$2.")
	# the other side did not add and we added so there is nothing
	# to be done, except making the path merged.
	exec git update-index --add --cacheinfo "$6" "$2" "$4"
	;;
"..$3")
	echo "Adding $4"
	if test -f "$4"
	then
		echo "ERROR: untracked $4 is overwritten by the merge."
		exit 1
	fi
	git update-index --add --cacheinfo "$7" "$3" "$4" &&
		exec git checkout-index -u -f -- "$4"
	;;

#
# Added in both, identically (check for same permissions).
#
".$3$2")
	if [ "$6" != "$7" ]; then
		echo "ERROR: File $4 added identically in both branches,"
		echo "ERROR: but permissions conflict $6->$7."
		exit 1
	fi
	echo "Adding $4"
	git update-index --add --cacheinfo "$6" "$2" "$4" &&
		exec git checkout-index -u -f -- "$4"
	;;

#
# Modified in both, but differently.
#
"$1$2$3" | ".$2$3")

	case ",$6,$7," in
	*,120000,*)
		echo "ERROR: $4: Not merging symbolic link changes."
		exit 1
		;;
	*,160000,*)
		echo "ERROR: $4: Not merging conflicting submodule changes."
		exit 1
		;;
	esac

	src2=`git-unpack-file $3`
	case "$1" in
	'')
		echo "Added $4 in both, but differently."
		# This extracts OUR file in $orig, and uses git apply to
		# remove lines that are unique to ours.
		orig=`git-unpack-file $2`
		sz0=`wc -c <"$orig"`
		@@DIFF@@ -u -La/$orig -Lb/$orig $orig $src2 | git apply --no-add
		sz1=`wc -c <"$orig"`

		# If we do not have enough common material, it is not
		# worth trying two-file merge using common subsections.
		expr "$sz0" \< "$sz1" \* 2 >/dev/null || : >$orig
		;;
	*)
		echo "Auto-merging $4"
		orig=`git-unpack-file $1`
		;;
	esac

	# Be careful for funny filename such as "-L" in "$4", which
	# would confuse "merge" greatly.
	src1=`git-unpack-file $2`
	git merge-file "$src1" "$orig" "$src2"
	ret=$?
	msg=
	if [ $ret -ne 0 ]; then
		msg='content conflict'
	fi

	# Create the working tree file, using "our tree" version from the
	# index, and then store the result of the merge.
	git checkout-index -f --stage=2 -- "$4" && cat "$src1" >"$4" || exit 1
	rm -f -- "$orig" "$src1" "$src2"

	if [ "$6" != "$7" ]; then
		if [ -n "$msg" ]; then
			msg="$msg, "
		fi
		msg="${msg}permissions conflict: $5->$6,$7"
		ret=1
	fi
	if [ "$1" = '' ]; then
		ret=1
	fi

	if [ $ret -ne 0 ]; then
		echo "ERROR: $msg in $4"
		exit 1
	fi
	exec git update-index -- "$4"
	;;

*)
	echo "ERROR: $4: Not handling case $1 -> $2 -> $3"
	;;
esac
exit 1