diff: do not chomp hunk-header in the middle of a character
[gitweb.git] / git-filter-branch.sh
index 674a25d27e50b421e516e8ca6e1190d04e323e9c..ebf05ca600739fcb8103dcebc6b9172eebfdacca 100755 (executable)
@@ -66,17 +66,17 @@ set_ident () {
                        h
                        s/^'$lid' \([^<]*\) <[^>]*> .*$/\1/
                        s/'\''/'\''\'\'\''/g
-                       s/.*/export GIT_'$uid'_NAME='\''&'\''/p
+                       s/.*/GIT_'$uid'_NAME='\''&'\''; export GIT_'$uid'_NAME/p
 
                        g
                        s/^'$lid' [^<]* <\([^>]*\)> .*$/\1/
                        s/'\''/'\''\'\'\''/g
-                       s/.*/export GIT_'$uid'_EMAIL='\''&'\''/p
+                       s/.*/GIT_'$uid'_EMAIL='\''&'\''; export GIT_'$uid'_EMAIL/p
 
                        g
                        s/^'$lid' [^<]* <[^>]*> \(.*\)$/\1/
                        s/'\''/'\''\'\'\''/g
-                       s/.*/export GIT_'$uid'_DATE='\''&'\''/p
+                       s/.*/GIT_'$uid'_DATE='\''&'\''; export GIT_'$uid'_DATE/p
 
                        q
                }
@@ -84,7 +84,7 @@ set_ident () {
 
        LANG=C LC_ALL=C sed -ne "$pick_id_script"
        # Ensure non-empty id name.
-       echo "[ -n \"\$GIT_${uid}_NAME\" ] || export GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\""
+       echo "case \"\$GIT_${uid}_NAME\" in \"\") GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\" && export GIT_${uid}_NAME;; esac"
 }
 
 USAGE="[--env-filter <command>] [--tree-filter <command>] \
@@ -206,32 +206,18 @@ done < "$tempdir"/backup-refs
 ORIG_GIT_DIR="$GIT_DIR"
 ORIG_GIT_WORK_TREE="$GIT_WORK_TREE"
 ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE"
-export GIT_DIR GIT_WORK_TREE=.
+GIT_WORK_TREE=.
+export GIT_DIR GIT_WORK_TREE
 
-# These refs should be updated if their heads were rewritten
-
-git rev-parse --revs-only --symbolic "$@" |
-while read ref
-do
-       # normalize ref
-       case "$ref" in
-       HEAD)
-               ref="$(git symbolic-ref "$ref")"
-       ;;
-       refs/*)
-       ;;
-       *)
-               ref="$(git for-each-ref --format='%(refname)' |
-                       grep /"$ref")"
-       esac
-
-       git check-ref-format "$ref" && echo "$ref"
-done > "$tempdir"/heads
+# The refs should be updated if their heads were rewritten
+git rev-parse --no-flags --revs-only --symbolic-full-name "$@" |
+sed -e '/^^/d' >"$tempdir"/heads
 
 test -s "$tempdir"/heads ||
        die "Which ref do you want to rewrite?"
 
-export GIT_INDEX_FILE="$(pwd)/../index"
+GIT_INDEX_FILE="$(pwd)/../index"
+export GIT_INDEX_FILE
 git read-tree || die "Could not seed the index"
 
 ret=0
@@ -267,7 +253,8 @@ while read commit parents; do
                git read-tree -i -m $commit:"$filter_subdir"
        esac || die "Could not initialize the index"
 
-       export GIT_COMMIT=$commit
+       GIT_COMMIT=$commit
+       export GIT_COMMIT
        git cat-file commit "$commit" >../commit ||
                die "Cannot read commit $commit"
 
@@ -287,7 +274,7 @@ while read commit parents; do
                eval "$filter_tree" < /dev/null ||
                        die "tree filter failed: $filter_tree"
 
-               git diff-index -r $commit | cut -f 2- | tr '\n' '\0' | \
+               git diff-index -r $commit | cut -f 2- | tr '\012' '\000' | \
                        xargs -0 git update-index --add --replace --remove
                git ls-files -z --others | \
                        xargs -0 git update-index --add --replace --remove
@@ -339,7 +326,6 @@ done < "$tempdir"/heads
 
 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
-count=0
 echo
 while read ref
 do
@@ -377,7 +363,6 @@ do
        ;;
        esac
        git update-ref -m "filter-branch: backup" "$orig_namespace$ref" $sha1
-       count=$(($count+1))
 done < "$tempdir"/heads
 
 # TODO: This should possibly go, with the semantics that all positive given
@@ -401,7 +386,8 @@ if [ "$filter_tag_name" ]; then
 
                [ -f "../map/$sha1" ] || continue
                new_sha1="$(cat "../map/$sha1")"
-               export GIT_COMMIT="$sha1"
+               GIT_COMMIT="$sha1"
+               export GIT_COMMIT
                new_ref="$(echo "$ref" | eval "$filter_tag_name")" ||
                        die "tag name filter failed: $filter_tag_name"
 
@@ -419,9 +405,6 @@ fi
 
 cd ../..
 rm -rf "$tempdir"
-echo
-test $count -gt 0 && echo "These refs were rewritten:"
-git show-ref | grep ^"$orig_namespace"
 
 unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE
 test -z "$ORIG_GIT_DIR" || GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR