summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean Delvare <jdelvare@suse.de>2014-03-04 21:09:27 +0100
committerJean Delvare <jdelvare@suse.de>2014-03-04 21:09:27 +0100
commit1ce592cbeaa592d550d77daee219d306041d4739 (patch)
tree409610be57c3beea7e395d633f90af8b830b1bdb
parent88899892aceb55b8098d745db19cdd077391ca4c (diff)
downloadquilt-1ce592cbeaa592d550d77daee219d306041d4739.tar.gz
diff: Workaround bash bug
Old versions of bash (at least version 3.2.51) don't properly handle prefix stripping together with quoting when evaluating an array. So strip the prefix before adding each file to opt_files. It's faster anyway. Same thing when diffing against a snapshot, strip the snapshot directory prefix from file names before evaluating the quoted files array. This fixes a regression introduced in: commit b0baeeb6b61132af92fd75df5f912554d295dee1 Author: Jean Delvare <jdelvare@suse.de> Date: Fri Mar 25 18:48:49 2011 +0100 diff, refresh: Accept file names with spaces (Only affecting the versions of bash which have the aforementioned bug.) This also fixes a bug when called from a subdirectory and a file passed as an argument starts with "./". Extend the test suite to test both cases, so that such bugs can't sneak in in the future.
-rw-r--r--quilt/diff.in10
-rw-r--r--test/subdir.test19
-rw-r--r--test/three.test18
3 files changed, 43 insertions, 4 deletions
diff --git a/quilt/diff.in b/quilt/diff.in
index 548cb94..dc021f0 100644
--- a/quilt/diff.in
+++ b/quilt/diff.in
@@ -219,7 +219,7 @@ done
QUILT_DIFF_OPTS="$QUILT_DIFF_OPTS $opt_format"
-opt_files=( $(for file in "$@"; do echo "$SUBDIR$file" ; done) )
+opt_files=( $(for file in "$@"; do echo "$SUBDIR${file#./}" ; done) )
if [ $[0$opt_combine + 0$opt_snapshot + 0$opt_relative] -gt 1 ]
then
@@ -259,8 +259,10 @@ if [ -n "$opt_snapshot" -a ${#opt_files[@]} -eq 0 ]
then
# Add all files in the snapshot into the file list (they may all
# have changed).
- files=( $(find $QUILT_PC/$snap_subdir -type f | sort) )
- printf "%s\n" "${files[@]#$QUILT_PC/$snap_subdir/}" >&4
+ files=( $(find $QUILT_PC/$snap_subdir -type f \
+ | sed -e "s/^$(quote_bre $QUILT_PC/$snap_subdir/)//" \
+ | sort) )
+ printf "%s\n" "${files[@]}" >&4
unset files
# Also look at all patches that are currently applied.
opt_combine=1
@@ -298,7 +300,7 @@ do
for file in $(files_in_patch_ordered "$patch")
do
if [ ${#opt_files[@]} -gt 0 ] && \
- ! in_array "$file" "${opt_files[@]#./}"
+ ! in_array "$file" "${opt_files[@]}"
then
continue
fi
diff --git a/test/subdir.test b/test/subdir.test
index 7310616..7fb28e1 100644
--- a/test/subdir.test
+++ b/test/subdir.test
@@ -58,5 +58,24 @@
> @@ -1 +0,0 @@
> -yet another file
+ # Test diff called with multiple file names, from a subdirectory
+ $ quilt diff --no-index -p ab file file2 no
+ > --- a/subdir/file
+ > +++ b/subdir/file
+ > @@ -1 +1 @@
+ > -old file
+ > +new contents
+ > --- /dev/null
+ > +++ b/subdir/file2
+ > @@ -0,0 +1 @@
+ > +another file
+
+ # Test diff called with "./" file name prefix, from a subdirectory
+ $ quilt diff --no-index -p ab ./file3 ./no
+ > --- a/subdir/file3
+ > +++ /dev/null
+ > @@ -1 +0,0 @@
+ > -yet another file
+
$ quilt refresh
> Refreshed patch %{_P}test.patch
diff --git a/test/three.test b/test/three.test
index 204b1c1..7abc835 100644
--- a/test/three.test
+++ b/test/three.test
@@ -61,6 +61,24 @@
$ quilt refresh
> Refreshed patch %{P}patch2.diff
+ # Test diff called with multiple file names
+ $ quilt diff -p0 f g
+ > Index: g
+ > ===================================================================
+ > --- /dev/null
+ > +++ g
+ > @@ -0,0 +1 @@
+ > +g
+
+ # Test that diff strips the "./" prefix
+ $ quilt diff -p0 ./f ./g
+ > Index: g
+ > ===================================================================
+ > --- /dev/null
+ > +++ g
+ > @@ -0,0 +1 @@
+ > +g
+
$ quilt pop
> Removing patch patches/patch2.diff
> Removing g