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