contrib/diffall: eliminate use of tar
[gitweb.git] / contrib / diffall / git-diffall
index 9bbd27f4a5db3352dc97d50e011615650ac0e533..f981ac1bd373ac12f0f66f4ec41b30a5e85f689f 100755 (executable)
@@ -36,20 +36,19 @@ fi
 
 start_dir=$(pwd)
 
-# needed to access tar utility
+# All the file paths returned by the diff command are relative to the root
+# of the working copy. So if the script is called from a subdirectory, it
+# must switch to the root of working copy before trying to use those paths.
 cdup=$(git rev-parse --show-cdup) &&
 cd "$cdup" || {
        echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
        exit 1
 }
 
-# mktemp is not available on all platforms (missing from msysgit)
-# Use a hard-coded tmp dir if it is not available
-tmp="$(mktemp -d -t tmp.XXXXXX 2>/dev/null)" || {
-       tmp=/tmp/git-diffall-tmp.$$
-       mkdir "$tmp" || exit 1
-}
-
+# set up temp dir
+tmp=$(perl -e 'use File::Temp qw(tempdir);
+       $t=tempdir("/tmp/git-diffall.XXXXX") or exit(1);
+       print $t') || exit 1
 trap 'rm -rf "$tmp" 2>/dev/null' EXIT
 
 left=
@@ -203,10 +202,14 @@ then
                fi
        done < "$tmp/filelist"
 else
-       # Mac users have gnutar rather than tar
-       (tar --ignore-failed-read -c -T "$tmp/filelist" | (cd "$tmp/$right_dir" && tar -x)) || {
-               gnutar --ignore-failed-read -c -T "$tmp/filelist" | (cd "$tmp/$right_dir" && gnutar -x)
-       }
+       while read name
+       do
+               if test -e "$name"
+               then
+                       mkdir -p "$tmp/$right_dir/$(dirname "$name")"
+                       cp "$name" "$tmp/$right_dir/$name"
+               fi
+       done < "$tmp/filelist"
 fi
 
 # Populate the tmp/left_dir directory with the files to be compared