summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--quilt/push.in24
-rw-r--r--test/duplicate-patch-in-series.test37
2 files changed, 61 insertions, 0 deletions
diff --git a/quilt/push.in b/quilt/push.in
index fde9472..e00573d 100644
--- a/quilt/push.in
+++ b/quilt/push.in
@@ -276,6 +276,24 @@ list_patches()
fi
}
+check_duplicate_patches()
+{
+ local IFS=$'\n'
+ local -a duplicates
+ local patch
+
+ duplicates=($((applied_patches ; printf $'%s\n' "${patches[@]}") \
+ | awk '{ if (lines[$0]++ == 1) print }'))
+ [ ${#duplicates[@]} -ge 1 ] || return 0
+
+ for patch in "${duplicates[@]}"
+ do
+ printf $"Patch %s is already applied; check your series file\n" \
+ "$(print_patch "$patch")"
+ done
+ return 1
+}
+
options=`getopt -o fqvam::h --long fuzz:,merge::,leave-rejects,color:: -- "$@"`
if [ $? -ne 0 ]
@@ -381,6 +399,12 @@ then
fi
patches=$(list_patches)
+
+# In theory, these patches can't be already applied. However in the case
+# of a generated or manually tweaked series file, this could happen and
+# cause havoc, so play it safe and check.
+check_duplicate_patches || exit 1
+
create_db
for patch in $patches
do
diff --git a/test/duplicate-patch-in-series.test b/test/duplicate-patch-in-series.test
new file mode 100644
index 0000000..98591b2
--- /dev/null
+++ b/test/duplicate-patch-in-series.test
@@ -0,0 +1,37 @@
+# Check that duplicate patches in generated series files won't cause havoc
+# See bug #20628 at https://savannah.nongnu.org/bugs/?20628
+
+$ mkdir patches
+$ echo "old line" > file.txt
+
+$ cat > patches/first.patch
+< --- file.txt
+< +++ file.txt
+< @@ -1 +1 @@
+< -old line
+< +new line
+
+$ cat > patches/series
+< first.patch -p0
+< first.patch -p0
+
+$ quilt push
+> Applying patch %{P}first.patch
+> patching file file.txt
+>
+> Now at patch %{P}first.patch
+
+$ quilt push
+> Patch %{P}first.patch is already applied; check your series file
+
+$ quilt pop
+> Removing patch %{P}first.patch
+> Restoring file.txt
+>
+> No patches applied
+
+$ quilt push -qa
+> Patch %{P}first.patch is already applied; check your series file
+
+$ quilt pop -q
+> No patch removed