From: Junio C Hamano Date: Thu, 26 May 2005 09:31:05 +0000 (-0700) Subject: [PATCH] Add git-external-diff-script X-Git-Tag: v0.99~445 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=4ba406a75ca80e335acfddf77f8d119af6d34d9e;p=git.git [PATCH] Add git-external-diff-script This is a demonstration of GIT_EXTERNAL_DIFF mechanism, and a testbed for tweaking and enhancing what the built-in diff should do. This script is designed to output exactly the same output as what the built-in diff driver produces when used as the GIT_EXTERNAL_DIFF command. I've run this and updated built-in diff on the entire history of linux-2.6 git repository, and JG's udev.git repository which has interesting symlink cases to make sure it is equivalent to the built-in diff driver. Signed-off-by: Junio C Hamano Signed-off-by: Linus Torvalds --- diff --git a/git-external-diff-script b/git-external-diff-script new file mode 100644 index 000000000..0d34b670b --- /dev/null +++ b/git-external-diff-script @@ -0,0 +1,67 @@ +#!/bin/sh +# Copyright (C) 2005 Junio C Hamano +# +# This script is designed to emulate what the built-in diff driver +# does when set as GIT_EXTERNAL_SCRIPT. + +case "$#" in +1) + echo "* Unmerged path $1" + exit 0 ;; +*) + name1="$1" tmp1="$2" hex1="$3" mode1="$4" tmp2="$5" hex2="$6" mode2="$7" + case "$#" in + 7) + name2="$name1" ;; + 9) + name2="$8" xfrm_msg="$9" ;; + esac ;; +esac + +show_create () { + name_="$1" tmp_="$2" hex_="$3" mode_="$4" + echo "diff --git a/$name_ b/$name_" + echo "new file mode $mode_" + diff ${GIT_DIFF_OPTS-'-pu'} -L /dev/null -L "b/$name_" /dev/null "$tmp_" +} + +show_delete () { + name_="$1" tmp_="$2" hex_="$3" mode_="$4" + echo "diff --git a/$name_ b/$name_" + echo "deleted file mode $mode_" + diff ${GIT_DIFF_OPTS-'-pu'} -L "a/$name_" -L /dev/null "$tmp_" /dev/null +} + +case "$mode1" in +120*) type1=l ;; +100*) type1=f ;; +.) show_create "$name2" "$tmp2" "$hex2" "$mode2" + exit 0 ;; +esac +case "$mode2" in +120*) type2=l ;; +100*) type2=f ;; +.) show_delete "$name1" "$tmp1" "$hex1" "$mode1" + exit 0 ;; +esac + +if test "$type1" != "$type2" +then + show_delete "$name1" "$tmp1" "$hex1" "$mode1" + show_create "$name2" "$tmp2" "$hex2" "$mode2" + exit 0 +fi + +echo diff --git "a/$name1" "b/$name2" +if test "$mode1" != "$mode2" +then + echo "old mode $mode1" + echo "new mode $mode2" + if test "$xfrm_msg" != "" + then + echo -n $xfrm_msg + fi +fi +diff ${GIT_DIFF_OPTS-'-pu'} -L "a/$name1" -L "b/$name2" "$tmp1" "$tmp2" +exit 0 +