Merge fixes up to GIT 1.0.4
[gitweb.git] / git-status.sh
index 44398d760c4b212bfebbbe09c4bb11d2068ad49d..50ccd24efb707d615e560dfbd38abec5b2b25b20 100755 (executable)
@@ -2,7 +2,16 @@
 #
 # Copyright (c) 2005 Linus Torvalds
 #
-. git-sh-setup || die "Not a git archive"
+
+USAGE=''
+SUBDIRECTORY_OK='Yes'
+
+. git-sh-setup
+
+if [ "$#" != "0" ]
+then
+  usage
+fi
 
 report () {
   header="#
@@ -11,9 +20,9 @@ report () {
 #
 "
   trailer=""
-  while read oldmode mode oldsha sha status name newname
+  while read status name newname
   do
-    echo -n "$header"
+    printf '%s' "$header"
     header=""
     trailer="#
 "
@@ -27,7 +36,7 @@ report () {
     U ) echo "#        unmerged: $name";;
     esac
   done
-  echo -n "$trailer"
+  printf '%s' "$trailer"
   [ "$header" ]
 }
 
@@ -41,8 +50,11 @@ git-update-index -q --unmerged --refresh || exit
 
 if GIT_DIR="$GIT_DIR" git-rev-parse --verify HEAD >/dev/null 2>&1
 then
-       git-diff-index -M --cached HEAD |
-       sed 's/^://' |
+       git-diff-index -M --cached --name-status --diff-filter=MDTCRA HEAD |
+       sed -e '
+               s/\\/\\\\/g
+               s/ /\\ /g
+       ' |
        report "Updated but not checked in" "will commit"
 
        committable="$?"
@@ -51,31 +63,49 @@ else
 # Initial commit
 #'
        git-ls-files |
-       sed 's/^/o o o o A /' |
+       sed -e '
+               s/\\/\\\\/g
+               s/ /\\ /g
+               s/^/A /
+       ' |
        report "Updated but not checked in" "will commit"
 
        committable="$?"
 fi
 
-git-diff-files |
-sed 's/^://' |
+git-diff-files  --name-status |
+sed -e '
+       s/\\/\\\\/g
+       s/ /\\ /g
+' |
 report "Changed but not updated" "use git-update-index to mark for commit"
 
-if grep -v '^#' "$GIT_DIR/info/exclude" >/dev/null 2>&1
+
+if test -f "$GIT_DIR/info/exclude"
 then
-       git-ls-files --others \
-           --exclude-from="$GIT_DIR/info/exclude" \
-           --exclude-per-directory=.gitignore |
-       sed -e '
-       1i\
-#\
-# Ignored files:\
-#   (use "git add" to add to commit)\
-#
-       s/^/#   /
-       $a\
-#'
-fi
+    git-ls-files -z --others \
+       --exclude-from="$GIT_DIR/info/exclude" \
+        --exclude-per-directory=.gitignore
+else
+    git-ls-files -z --others \
+        --exclude-per-directory=.gitignore
+fi |
+perl -e '$/ = "\0";
+       my $shown = 0;
+       while (<>) {
+               chomp;
+               s|\\|\\\\|g;
+               s|\t|\\t|g;
+               s|\n|\\n|g;
+               s/^/#   /;
+               if (!$shown) {
+                       print "#\n# Untracked files:\n";
+                       print "#   (use \"git add\" to add to commit)\n#\n";
+                       $shown = 1;
+               }
+               print "$_\n";
+       }
+'
 
 case "$committable" in
 0)