Hi Denys,

>From TODO list:
----
diff
  Make sure we handle empty files properly:
    From the patch man page:

    you can remove a file by sending out a context diff that compares
    the file to be deleted with an empty file dated the Epoch.  The
    file will be removed unless patch is conforming to POSIX and the
    -E or --remove-empty-files option is not given.
---

Problem is in the patch utility. Patch from BusyBox automatically delete empty 
files after patch applied.
I was added new flag -E (or --remove-empty-files) for it. Now without flag -E 
does not delete empty files.

----------
Lukas Huba <huba.lu...@centrum.cz>
diff --git a/editors/patch.c b/editors/patch.c
index 764f0f1..b6b6593 100644
--- a/editors/patch.c
+++ b/editors/patch.c
@@ -17,7 +17,6 @@
  * -o outfile output here instead of in place
  * -r rejectfile write rejected hunks to this file
  *
- * -E remove empty files --remove-empty-files
  * -f force (no questions asked)
  * -F fuzz (number, default 2)
  * [file] which file to patch
@@ -42,7 +41,7 @@ config PATCH
 	  hunks to stderr, and exits with nonzero status if any hunks fail.
 
 	  A file compared against /dev/null (or with a date <= the epoch) is
-	  created/deleted as appropriate.
+	  created or deleted (if isset -E or --remove-empty-files) as appropriate.
 */
 #include "libbb.h"
 
@@ -243,15 +242,16 @@ struct globals {
 } while (0)
 
 
-#define FLAG_STR "Rup:i:Nx"
+#define FLAG_STR "Rup:i:NEx"
 /* FLAG_REVERSE must be == 1! Code uses this fact. */
 #define FLAG_REVERSE (1 << 0)
 #define FLAG_u       (1 << 1)
 #define FLAG_PATHLEN (1 << 2)
 #define FLAG_INPUT   (1 << 3)
 #define FLAG_IGNORE  (1 << 4)
+#define FLAG_RMEMPTY (1 << 5)
 //non-standard:
-#define FLAG_DEBUG   (1 << 5)
+#define FLAG_DEBUG   (1 << 6)
 
 // Dispose of a line of input, either by writing it out or discarding it.
 
@@ -551,7 +551,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
 
 			// If this is the first hunk, open the file.
 			if (TT.filein == -1) {
-				int oldsum, newsum, del = 0;
+				int oldsum, newsum, empty = 0;
 				char *name;
 
 				oldsum = TT.oldline + TT.oldlen;
@@ -564,7 +564,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
 				if (!strcmp(name, "/dev/null") || !(reverse ? oldsum : newsum))
 				{
 					name = reverse ? newname : oldname;
-					del++;
+					empty++;
 				}
 
 				// handle -p path truncation.
@@ -576,10 +576,18 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
 					}
 				}
 
-				if (del) {
-					printf("removing %s\n", name);
-					xunlink(name);
+				if (empty) {
 					state = 0;
+					xunlink(name);
+					// If isset flag -E or --remove-empty-files
+					if (option_mask32 & FLAG_RMEMPTY) {
+						printf("removing %s\n", name);
+					} else {
+						// File is empty after the patches have been applied
+						int fd = xopen3(name, O_CREAT, 0666);
+						xclose(fd);
+						printf("patching file %s\n", name);
+					}
 				// If we've got a file to open, do so.
 				} else if (!(option_mask32 & FLAG_PATHLEN) || i <= TT.prefix) {
 					// If the old file was null, we're creating a new one.
diff --git a/include/usage.src.h b/include/usage.src.h
index 084427c..cefc101 100644
--- a/include/usage.src.h
+++ b/include/usage.src.h
@@ -2903,17 +2903,19 @@ INSERT
        "[OPTIONS] [ORIGFILE [PATCHFILE]]"
 #define patch_full_usage "\n\n" \
 	IF_LONG_OPTS( \
-       "	-p,--strip N	Strip N leading components from file names" \
-     "\n	-i,--input DIFF	Read DIFF instead of stdin" \
-     "\n	-R,--reverse	Reverse patch" \
-     "\n	-N,--forward	Ignore already applied patches" \
-     "\n	--dry-run	Don't actually change files" \
+       "	-p,--strip N		Strip N leading components from file names" \
+     "\n	-i,--input DIFF		Read DIFF instead of stdin" \
+     "\n	-R,--reverse		Reverse patch" \
+     "\n	-N,--forward		Ignore already applied patches" \
+     "\n	--dry-run		Don't actually change files" \
+     "\n	-E,--remove-empty-files	Remove output files that are empty after the patches have been applied" \
 	) \
 	IF_NOT_LONG_OPTS( \
        "	-p N	Strip N leading components from file names" \
      "\n	-i DIFF	Read DIFF instead of stdin" \
      "\n	-R	Reverse patch" \
      "\n	-N	Ignore already applied patches" \
+     "\n	-E	Remove output files that are empty after the patches have been applied" \
 	)
 
 #define patch_example_usage \

Attachment: pgpgpD7vC5IYP.pgp
Description: PGP signature

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to