Hi, The egrep regex should not escape the '{' and '}', and also add a check for ' \t' so that we do not pickup stuff like '+----', etc. Fix typo in assignment. Check if file exists in new tree before adding/removing (might add support for this lowlevel to increase speed?). Fix typo in line removing temp files.
Signed-off-by: Martin Schlemmer <[EMAIL PROTECTED]> gitapply.sh: 47b9346d2679b1bf34220fe4502f15c7d0737b0c --- 47b9346d2679b1bf34220fe4502f15c7d0737b0c/gitapply.sh +++ uncommitted/gitapply.sh @@ -19,15 +19,22 @@ # just handle it all ourselves. patch -p1 -N <$patchfifo & -tee $patchfifo | egrep '^[+-]\{3\}' | { +exits_in_cache() { + for x in $(ls-tree "$1"); do + [ "$x" = "$2" ] && return 0 + done + return 1 +} + +tee $patchfifo | egrep '^[+-]{3}[ \t]' | { victim= origmode= while read sign file attrs; do - echo $sign $file $attrs ... >&2 +# echo $sign $file $attrs ... >&2 case $sign in "---") - victim=file + victim=$file mode=$(echo $attrs | sed 's/.*mode:[0-7]*\([0-7]\{3\}\).*/\1/') origmode= [ "$mode" != "$attrs" ] && origmode=$mode @@ -35,14 +42,19 @@ "+++") if [ "$file" = "/dev/null" ]; then torm=$(echo "$victim" | sed 's/[^\/]*\///') #-p1 - echo -ne "rm\0$torm\0" + tree=$(echo $attrs | sed 's/.*tree:\([0-9a-f]\{40\}\).*/\1/') + exits_in_cache "$tree" "$torm" && echo -ne "rm\0$torm\0" continue elif [ "$victim" = "/dev/null" ]; then - echo -ne "add\0$file\0" + toadd=$(echo "$file" | sed 's/[^\/]*\///') #-p1 + tree=$(echo "$file" | sed -e 's/\([^\/]*\)\/.*/\1/') + exits_in_cache "$tree" "$toadd" || echo -ne "add\0$toadd\0" fi mode=$(echo $attrs | sed 's/.*mode:[0-7]*\([0-7]\{3\}\).*/\1/') if [ "$mode" ] && [ "$mode" != "$attrs" ] && [ "$origmode" != "$mode" ]; then - echo -ne "cm\0$mode\0$file\0" + tochmod=$(echo "$file" | sed 's/[^\/]*\///') #-p1 + # need a space else numbers gets converted + echo -ne "cm\0 $mode\0$tochmod\0" fi ;; *) @@ -74,4 +86,4 @@ done ' padding -rm $pathfifo $todo $gonefile +rm $patchfifo $todo $gonefile -- Martin Schlemmer
gitapply.sh: 47b9346d2679b1bf34220fe4502f15c7d0737b0c --- 47b9346d2679b1bf34220fe4502f15c7d0737b0c/gitapply.sh +++ uncommitted/gitapply.sh @@ -19,15 +19,22 @@ # just handle it all ourselves. patch -p1 -N <$patchfifo & -tee $patchfifo | egrep '^[+-]\{3\}' | { +exits_in_cache() { + for x in $(ls-tree "$1"); do + [ "$x" = "$2" ] && return 0 + done + return 1 +} + +tee $patchfifo | egrep '^[+-]{3}[ \t]' | { victim= origmode= while read sign file attrs; do - echo $sign $file $attrs ... >&2 +# echo $sign $file $attrs ... >&2 case $sign in "---") - victim=file + victim=$file mode=$(echo $attrs | sed 's/.*mode:[0-7]*\([0-7]\{3\}\).*/\1/') origmode= [ "$mode" != "$attrs" ] && origmode=$mode @@ -35,14 +42,19 @@ "+++") if [ "$file" = "/dev/null" ]; then torm=$(echo "$victim" | sed 's/[^\/]*\///') #-p1 - echo -ne "rm\0$torm\0" + tree=$(echo $attrs | sed 's/.*tree:\([0-9a-f]\{40\}\).*/\1/') + exits_in_cache "$tree" "$torm" && echo -ne "rm\0$torm\0" continue elif [ "$victim" = "/dev/null" ]; then - echo -ne "add\0$file\0" + toadd=$(echo "$file" | sed 's/[^\/]*\///') #-p1 + tree=$(echo "$file" | sed -e 's/\([^\/]*\)\/.*/\1/') + exits_in_cache "$tree" "$toadd" || echo -ne "add\0$toadd\0" fi mode=$(echo $attrs | sed 's/.*mode:[0-7]*\([0-7]\{3\}\).*/\1/') if [ "$mode" ] && [ "$mode" != "$attrs" ] && [ "$origmode" != "$mode" ]; then - echo -ne "cm\0$mode\0$file\0" + tochmod=$(echo "$file" | sed 's/[^\/]*\///') #-p1 + # need a space else numbers gets converted + echo -ne "cm\0 $mode\0$tochmod\0" fi ;; *) @@ -74,4 +86,4 @@ done ' padding -rm $pathfifo $todo $gonefile +rm $patchfifo $todo $gonefile
signature.asc
Description: This is a digitally signed message part