diff --git a/patch-2.5.9-cat_if_device.diff b/patch-2.5.9-cat_if_device.diff index 0c1ad5d..4bf8bfc 100644 --- a/patch-2.5.9-cat_if_device.diff +++ b/patch-2.5.9-cat_if_device.diff @@ -65,15 +65,13 @@ Index: patch-2.5.9/util.c void move_file (char const *from, int volatile *from_needs_removal, char *to, mode_t mode, bool backup) -@@ -164,6 +207,15 @@ move_file (char const *from, int volatil +@@ -165,6 +208,13 @@ move_file (char const *from, int volatil goto rename_succeeded; } + if (errno == EACCES && (s_is_chrblkfifosock(to) > 0)) + { + cat_file_to_dev (from, to); -+ if (backup) -+ insert_fid (to); + unlink(from); + return; + } diff --git a/patch.changes b/patch.changes index dd2cbda..362ff4e 100644 --- a/patch.changes +++ b/patch.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Wed Apr 23 10:53:19 CEST 2008 - agruen@suse.de + +- remember-backup-files.diff: Fix bug when a file is touched by + the same patch more than twice. Move the test cases from the + patch header into separate files. +- patch-2.5.9-cat_if_device.diff: No need to remember the device + we write to as a backup file. + ------------------------------------------------------------------- Fri Nov 2 01:57:03 CET 2007 - agruen@suse.de diff --git a/patch.spec b/patch.spec index 019c177..ed95a88 100644 --- a/patch.spec +++ b/patch.spec @@ -1,7 +1,7 @@ # # spec file for package patch (Version 2.5.9) # -# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. # This file and all modifications and additions to the pristine # package are under the same license as the package itself. # @@ -10,15 +10,16 @@ # norootforbuild + Name: patch License: GPL v2 or later Group: Productivity/Text/Utilities AutoReqProv: on Version: 2.5.9 -Release: 223 +Release: 252 Summary: GNU patch Source: ftp://prep.ai.mit.edu/pub/gnu/patch/%{name}-%{version}.tar.bz2 -Url: http://www.gnu.org/software/patch/patch.html +Url: ftp://alpha.gnu.org/gnu/diffutils/ Patch: trailing-cr-fix.diff Patch1: remember-backup-files.diff Patch2: unified-reject-files.diff @@ -73,57 +74,64 @@ make install \ %doc NEWS README /usr/bin/patch %doc %{_mandir}/man1/patch.1.gz + %changelog -* Fri Nov 02 2007 - agruen@suse.de +* Wed Apr 23 2008 agruen@suse.de +- remember-backup-files.diff: Fix bug when a file is touched by + the same patch more than twice. Move the test cases from the + patch header into separate files. +- patch-2.5.9-cat_if_device.diff: No need to remember the device + we write to as a backup file. +* Fri Nov 02 2007 agruen@suse.de - Patch fails to apply hunks with asymmetric context correctly. -* Wed Jan 25 2006 - mls@suse.de +* Wed Jan 25 2006 mls@suse.de - converted neededforbuild to BuildRequires -* Thu Jan 12 2006 - agruen@suse.de +* Thu Jan 12 2006 agruen@suse.de - remember-backup-files.diff: Fix case where a patch modifies a read-only file more than once while --backup is used (test case in the patch header). -* Thu Aug 18 2005 - mmj@suse.de +* Thu Aug 18 2005 mmj@suse.de - --reject-unified is called --unified-reject-files [#105151] -* Wed Jun 29 2005 - mmj@suse.de +* Wed Jun 29 2005 mmj@suse.de - Don't compile with -f-signed-char [#93883] - Don't strip explicitly -* Tue Jan 04 2005 - mmj@suse.de +* Tue Jan 04 2005 mmj@suse.de - Add patch to make patch able to write reject files to devices, named pipes and sockets [#45794] -* Sun Jan 25 2004 - agruen@suse.de +* Sun Jan 25 2004 agruen@suse.de - Add --reject-unified option to produce unified reject files: Before, unified reject files were produced if the patch itself was unified; this could sometimes have been annoying. - If a patch with C function names (diff -p) has rejects, include the function names in the reject files. -* Sun Jan 11 2004 - adrian@suse.de +* Sun Jan 11 2004 adrian@suse.de - add %%defattr -* Tue Oct 07 2003 - agruen@suse.de +* Tue Oct 07 2003 agruen@suse.de - remember-backup-files: Also include the file timestamps in the hash table for non-POSIX-compliant systems that don't guarantee that i_dev + i_ino uniquely identifies a file. - #32031: Create --global-reject-file even if --dry-run is specified. Add a missing '\n'. -* Wed Jul 16 2003 - agruen@suse.de +* Wed Jul 16 2003 agruen@suse.de - Replace trailing-cr-fix.diff with official upstream version that fixes this bug differently. -* Mon Jun 30 2003 - agruen@suse.de +* Mon Jun 30 2003 agruen@suse.de - trailing-cr-fix.diff: Fix a bug in carriage return detection (DOS files) in the unified diff path. - Disable patch that adds comments to C preprocessor style merges, as specified by POSIX.1-2001. -* Wed Jun 25 2003 - agruen@suse.de +* Wed Jun 25 2003 agruen@suse.de - Fix bug introduced on June 5 that broke remember-backup-files. -* Tue Jun 24 2003 - agruen@suse.de +* Tue Jun 24 2003 agruen@suse.de - smart-reject-file-format.diff: Work around a special case in which patches are not terminated with a '^' in the internal representation. The resulting error message was "internal error in abort_hunk". -* Thu Jun 05 2003 - agruen@suse.de +* Thu Jun 05 2003 agruen@suse.de - Temporary reject file logic: Ooops, now must only close the temporary reject file after processing all patches, instead of after each patch. -* Thu Jun 05 2003 - agruen@suse.de +* Thu Jun 05 2003 agruen@suse.de - Upgrade to 2.5.9: Several fixes, obsoletes rename-same-file.patch. - Fix and adapt global-reject-file patch: @@ -142,11 +150,11 @@ make install \ tables instead of glibc's binary trees, requested from upstream to ensure greater portability. - Add /* SYM */ comment to #endif lines for patch -D SYM, too. -* Wed Apr 09 2003 - agruen@suse.de +* Wed Apr 09 2003 agruen@suse.de - Fix another bug with hard links and backup file generation. - Fix backup file generation if the same file appears in the patch more than once. -* Wed Mar 26 2003 - mmj@suse.de +* Wed Mar 26 2003 mmj@suse.de - Update to 2.5.8: · Bugfixes · patch -D now outputs preprocessor lines without comments, as @@ -156,37 +164,37 @@ make install \ from the time stamp · Perforce is now supported · Patch lines beginning with "#" are comments and are ignored -* Wed Jan 15 2003 - agruen@suse.de +* Wed Jan 15 2003 agruen@suse.de - Fix a bug with hardlinks (see rename-same-file.patch) -* Tue Sep 17 2002 - ro@suse.de +* Tue Sep 17 2002 ro@suse.de - removed bogus self-provides -* Wed Feb 06 2002 - coolo@suse.de +* Wed Feb 06 2002 coolo@suse.de - called suse_update_config -* Mon Jun 25 2001 - uli@suse.de +* Mon Jun 25 2001 uli@suse.de - added patch adding "--global-reject" option by ak@suse.de - bzipped tarball -* Tue Mar 06 2001 - bk@suse.de +* Tue Mar 06 2001 bk@suse.de - update to 2.5.4, added 2 patches from PLD and use buildroot -* Wed Nov 08 2000 - uli@suse.de +* Wed Nov 08 2000 uli@suse.de - now builds with -D_GNU_SOURCE, should avoid miscompilation that breaks LFS support - added fix for offset output by Alessandro Rubini - added fix and enhancement for --ifdef by Pete Buechler -* Sun Feb 27 2000 - @suse.de +* Sun Feb 27 2000 @suse.de - added missing CFLAGS quotes. -* Sun Feb 27 2000 - bk@suse.de +* Sun Feb 27 2000 bk@suse.de - added PPC fixes by Uli back again (-fsigned-char, CPPFLAGS) -* Fri Feb 25 2000 - schwab@suse.de +* Fri Feb 25 2000 schwab@suse.de - Specfile cleanup, get rid of Makefile.Linux - /usr/man -> /usr/share/man - Add group tag. -* Mon Sep 13 1999 - bs@suse.de +* Mon Sep 13 1999 bs@suse.de - ran old prepare_spec on spec file to switch to new prepare_spec. -* Wed Aug 18 1999 - uli@suse.de +* Wed Aug 18 1999 uli@suse.de - fixed for PPC (-fsigned-char, CPPFLAGS) -* Tue Mar 16 1999 - ro@suse.de +* Tue Mar 16 1999 ro@suse.de - update to 2.5.3 using diff from jurix -* Wed Jan 13 1999 - bs@suse.de +* Wed Jan 13 1999 bs@suse.de - applied patch from Egbert Eich (problems with non existing files fixed) -* Thu Nov 05 1998 - ro@suse.de +* Thu Nov 05 1998 ro@suse.de - use libc's basename() for glibc diff --git a/remember-backup-files.diff b/remember-backup-files.diff index ecbc261..bec287e 100644 --- a/remember-backup-files.diff +++ b/remember-backup-files.diff @@ -1,81 +1,6 @@ This patch remembers backup file names patch has already created in a binary tree, and prevents patch from overwriting backup -files it has created before. The bug can be reproduced as follows: - - $ cat > f - < one - - $ cat > f.patch - <--- f.orig 2003-04-09 01:48:01.000000000 +0200 - <+++ f 2003-04-09 01:49:17.000000000 +0200 - <@@ -2 +2 @@ - <-one - <+two - <--- f.orig 2003-04-09 01:48:01.000000000 +0200 - <+++ f 2003-04-09 01:49:17.000000000 +0200 - <@@ -2 +2 @@ - <-two - <+three - - $ patch -p0 < f.patch - > patching file f - > Hunk #1 succeeded at 1 (offset -1 lines). - > patching file f - > Hunk #1 succeeded at 1 (offset -1 lines). - - $ cat f.orig - > one - - $ rm f f.orig f.patch - - -Here is another test case with hard links between source files. - - $ cat > f - < one - - $ ln f g - $ cat > fg.patch - <--- f.orig 2003-04-09 01:48:01.000000000 +0200 - <+++ f 2003-04-09 01:49:17.000000000 +0200 - <@@ -2 +2 @@ - <-one - <+two - <--- g.orig 2003-04-09 01:48:01.000000000 +0200 - <+++ g 2003-04-09 01:49:17.000000000 +0200 - <@@ -2 +2 @@ - <-one - <+two - - $ patch -p0 < fg.patch - > patching file f - > Hunk #1 succeeded at 1 (offset -1 lines). - > patching file g - > Hunk #1 succeeded at 1 (offset -1 lines). - - $ cat f.orig - > one - - $ cat g.orig - > one - - $ rm f f.orig g g.orig fg.patch - -This test case failed with a Permission denied error with a previous -version of this patch: - - $ echo 1 > f - $ echo 2 > f.new - $ diff -Nu f f.new > f.diff - $ mv f.new f - $ echo 3 > f.new - $ diff -Nu f f.new >> f.diff - $ rm f.new - $ echo 1 > f - $ chmod a=r f - $ strace -o ../log patch -p0 --backup < f.diff - > patching file f - > patching file f +files it has created before. Index: patch-2.5.9/Makefile.in =================================================================== @@ -161,16 +86,17 @@ Index: patch-2.5.9/util.c /* Move a file FROM (where *FROM_NEEDS_REMOVAL is nonzero if FROM needs removal when cleaning up at the end of execution) -@@ -64,7 +72,7 @@ move_file (char const *from, int volatil +@@ -64,6 +72,9 @@ move_file (char const *from, int volatil struct stat to_st; int to_errno = ! backup ? -1 : stat (to, &to_st) == 0 ? 0 : errno; -- if (backup) -+ if (backup && (to_errno || ! fid_exists (to, &to_st))) ++ if (backup && ! to_errno && fid_exists (to, &to_st)) ++ backup = false; ++ + if (backup) { int try_makedirs_errno = 0; - char *bakname; -@@ -123,6 +131,7 @@ move_file (char const *from, int volatil +@@ -123,6 +134,7 @@ move_file (char const *from, int volatil quotearg_n (0, to), quotearg_n (1, bakname)); while (rename (to, bakname) != 0) { @@ -178,34 +104,23 @@ Index: patch-2.5.9/util.c if (errno != try_makedirs_errno) pfatal ("Can't rename file %s to %s", quotearg_n (0, to), quotearg_n (1, bakname)); -@@ -133,6 +142,8 @@ move_file (char const *from, int volatil - - free (bakname); - } -+ else -+ backup = false; - - if (from) - { -@@ -165,6 +176,8 @@ move_file (char const *from, int volatil +@@ -165,6 +177,7 @@ move_file (char const *from, int volatil if (! to_dir_known_to_exist) makedirs (to); copy_file (from, to, 0, mode); -+ if (backup) -+ insert_fid (to); ++ insert_fid (to); return; } -@@ -173,6 +186,8 @@ move_file (char const *from, int volatil +@@ -173,6 +186,7 @@ move_file (char const *from, int volatil } rename_succeeded: -+ if (backup) -+ insert_fid (to); ++ insert_fid (to); /* Do not clear *FROM_NEEDS_REMOVAL if it's possible that the rename returned zero because FROM and TO are hard links to the same file. */ -@@ -1011,3 +1026,105 @@ Fseek (FILE *stream, file_offset offset, +@@ -1011,3 +1025,105 @@ Fseek (FILE *stream, file_offset offset, if (file_seek (stream, offset, ptrname) != 0) pfatal ("fseek"); } @@ -1505,3 +1420,101 @@ Index: patch-2.5.9/m4/nanosecond_stat.m4 + if test $ac_cv_stat_timeval = yes; then + AC_DEFINE(HAVE_STAT_TIMEVAL, 1, [Define to 1 if struct stat comtains struct timeval's.]) + fi]) +Index: patch-2.5.9/remember-tests/hardlinks.test +=================================================================== +--- /dev/null ++++ patch-2.5.9/remember-tests/hardlinks.test +@@ -0,0 +1,31 @@ ++Test case with hard links between source files. ++ ++$ cat > f ++< one ++ ++$ ln f g ++$ cat > fg.patch ++<--- f.orig ++<+++ f ++<@@ -2 +2 @@ ++<-one ++<+two ++<--- g.orig ++<+++ g ++<@@ -2 +2 @@ ++<-one ++<+two ++ ++$ ../patch -p0 < fg.patch ++> patching file f ++> Hunk #1 succeeded at 1 (offset -1 lines). ++> patching file g ++> Hunk #1 succeeded at 1 (offset -1 lines). ++ ++$ cat f.orig ++> one ++ ++$ cat g.orig ++> one ++ ++$ rm f f.orig g g.orig fg.patch +Index: patch-2.5.9/remember-tests/multi-modify.test +=================================================================== +--- /dev/null ++++ patch-2.5.9/remember-tests/multi-modify.test +@@ -0,0 +1,35 @@ ++A patch that modifies the same file three times. An unpatched version of ++GNU patch will destroy the backup file. ++ ++$ cat > f ++< one ++ ++$ cat > f.patch ++<--- f.orig ++<+++ f ++<@@ -2 +2 @@ ++<-one ++<+two ++<--- f.orig ++<+++ f ++<@@ -2 +2 @@ ++<-two ++<+three ++<--- f.orig ++<+++ f ++<@@ -2 +2 @@ ++<-three ++<+four ++ ++$ ../patch -p0 < f.patch ++> patching file f ++> Hunk #1 succeeded at 1 (offset -1 lines). ++> patching file f ++> Hunk #1 succeeded at 1 (offset -1 lines). ++> patching file f ++> Hunk #1 succeeded at 1 (offset -1 lines). ++ ++$ cat f.orig ++> one ++ ++$ rm f f.orig f.patch +Index: patch-2.5.9/remember-tests/permission.test +=================================================================== +--- /dev/null ++++ patch-2.5.9/remember-tests/permission.test +@@ -0,0 +1,17 @@ ++This test case failed with a Permission denied error with a previous ++version of this patch. ++ ++$ echo 1 > f ++$ echo 2 > f.new ++$ diff -Nu f f.new > f.diff ++$ mv f.new f ++$ echo 3 > f.new ++$ diff -Nu f f.new >> f.diff ++$ rm f.new ++$ echo 1 > f ++$ chmod a=r f ++$ ../patch -p0 --backup < f.diff ++> patching file f ++> patching file f ++ ++$ rm -f f f.diff f.orig f.rej