patch: add longopts, --dry-run, add one more test
function old new delta patch_main 1110 1214 +104 static.patch_longopts - 47 +47 packed_usage 26738 26761 +23 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 2/0 up/down: 174/0) Total: 174 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
@@ -78,12 +78,23 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
|
||||
enum {
|
||||
OPT_R = (1 << 2),
|
||||
OPT_N = (1 << 3),
|
||||
OPT_dry_run = (1 << 4) * ENABLE_LONG_OPTS,
|
||||
};
|
||||
|
||||
xfunc_error_retval = 2;
|
||||
{
|
||||
const char *p = "-1";
|
||||
const char *i = "-"; /* compat */
|
||||
#if ENABLE_LONG_OPTS
|
||||
static const char patch_longopts[] ALIGN1 =
|
||||
"strip\0" Required_argument "p"
|
||||
"input\0" Required_argument "i"
|
||||
"reverse\0" No_argument "R"
|
||||
"forward\0" No_argument "N"
|
||||
"dry-run\0" No_argument "\xff"
|
||||
;
|
||||
applet_long_options = patch_longopts;
|
||||
#endif
|
||||
opt = getopt32(argv, "p:i:RN", &p, &i);
|
||||
if (opt & OPT_R)
|
||||
plus = '-';
|
||||
@@ -97,7 +108,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
|
||||
FILE *dst_stream;
|
||||
//char *old_filename;
|
||||
char *new_filename;
|
||||
char *backup_filename;
|
||||
char *backup_filename = NULL;
|
||||
unsigned src_cur_line = 1;
|
||||
unsigned dst_cur_line = 0;
|
||||
unsigned dst_beg_line;
|
||||
@@ -131,16 +142,21 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
|
||||
bb_make_directory(new_filename, -1, FILEUTILS_RECUR);
|
||||
*slash = '/';
|
||||
}
|
||||
backup_filename = NULL;
|
||||
src_stream = NULL;
|
||||
saved_stat.st_mode = 0644;
|
||||
} else {
|
||||
} else if (!(opt & OPT_dry_run)) {
|
||||
backup_filename = xasprintf("%s.orig", new_filename);
|
||||
xrename(new_filename, backup_filename);
|
||||
src_stream = xfopen_for_read(backup_filename);
|
||||
} else
|
||||
src_stream = xfopen_for_read(new_filename);
|
||||
|
||||
if (opt & OPT_dry_run) {
|
||||
dst_stream = xfopen_for_write("/dev/null");
|
||||
} else {
|
||||
dst_stream = xfopen_for_write(new_filename);
|
||||
fchmod(fileno(dst_stream), saved_stat.st_mode);
|
||||
}
|
||||
dst_stream = xfopen_for_write(new_filename);
|
||||
fchmod(fileno(dst_stream), saved_stat.st_mode);
|
||||
|
||||
printf("patching file %s\n", new_filename);
|
||||
|
||||
@@ -189,6 +205,11 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
|
||||
patch_line = xmalloc_fgets(patch_file);
|
||||
if (patch_line == NULL)
|
||||
break; /* EOF */
|
||||
if (!*patch_line) {
|
||||
/* whitespace-damaged patch with "" lines */
|
||||
free(patch_line);
|
||||
patch_line = xstrdup(" ");
|
||||
}
|
||||
if ((*patch_line != '-') && (*patch_line != '+')
|
||||
&& (*patch_line != ' ')
|
||||
) {
|
||||
@@ -244,7 +265,9 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
|
||||
if (backup_filename) {
|
||||
unlink(backup_filename);
|
||||
}
|
||||
if ((dst_cur_line == 0) || (dst_beg_line == 0)) {
|
||||
if (!(opt & OPT_dry_run)
|
||||
&& ((dst_cur_line == 0) || (dst_beg_line == 0))
|
||||
) {
|
||||
/* The new patched file is empty, remove it */
|
||||
xunlink(new_filename);
|
||||
// /* old_filename and new_filename may be the same file */
|
||||
|
Reference in New Issue
Block a user