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 <[email protected]>
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 \
pgpgpD7vC5IYP.pgp
Description: PGP signature
_______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
