| Upstream-Status: Inappropriate [debian patch] |
| |
| Index: patch-2.5.9/patch.man |
| =================================================================== |
| --- patch-2.5.9.orig/patch.man |
| +++ patch-2.5.9/patch.man |
| @@ -520,6 +520,15 @@ file. |
| \fB\*=reject\-unified\fP |
| Produce unified reject files. The default is to produce context type reject files. |
| .TP |
| +.BI \*=global\-reject\-file= rejectfile |
| +Put all rejects into |
| +.I rejectfile |
| +instead of creating separate reject files for all files that have rejects. The |
| +.I rejectfile |
| +will contain headers that identify which file each reject refers to. Note that |
| +the global reject file is created even if \-\-dry\-run is specified (while |
| +non-global reject files will only be created without \-\-dry\-run). |
| +.TP |
| \fB\-R\fP or \fB\*=reverse\fP |
| Assume that this patch was created with the old and new files swapped. |
| (Yes, I'm afraid that does happen occasionally, human nature being what it |
| Index: patch-2.5.9/patch.c |
| =================================================================== |
| --- patch-2.5.9.orig/patch.c |
| +++ patch-2.5.9/patch.c |
| @@ -67,6 +67,7 @@ static bool similar (char const *, size_ |
| static bool spew_output (struct outstate *); |
| static char const *make_temp (char); |
| static int numeric_string (char const *, bool, char const *); |
| +static void reject_header (const char *filename); |
| static void abort_hunk (void); |
| static void cleanup (void); |
| static void get_some_switches (void); |
| @@ -98,6 +99,7 @@ static int Argc; |
| static char * const *Argv; |
| |
| static FILE *rejfp; /* reject file pointer */ |
| +static char *global_reject; |
| |
| static char const *patchname; |
| static char *rejname; |
| @@ -172,6 +174,10 @@ main (int argc, char **argv) |
| /* Make sure we clean up in case of disaster. */ |
| set_signals (false); |
| |
| + /* initialize global reject file */ |
| + if (global_reject) |
| + init_reject (); |
| + |
| for ( |
| open_patch_file (patchname); |
| there_is_another_patch(); |
| @@ -208,8 +214,9 @@ main (int argc, char **argv) |
| init_output (TMPOUTNAME, exclusive, &outstate); |
| } |
| |
| - /* initialize reject file */ |
| - init_reject (); |
| + /* initialize per-patch reject file */ |
| + if (!global_reject) |
| + init_reject (); |
| |
| /* find out where all the lines are */ |
| if (!skip_rest_of_patch) |
| @@ -278,6 +285,8 @@ main (int argc, char **argv) |
| |
| newwhere = pch_newfirst() + last_offset; |
| if (skip_rest_of_patch) { |
| + if (!failed) |
| + reject_header(outname); |
| abort_hunk(); |
| failed++; |
| if (verbosity == VERBOSE) |
| @@ -292,6 +301,8 @@ main (int argc, char **argv) |
| say ("Patch attempted to create file %s, which already exists.\n", |
| quotearg (inname)); |
| |
| + if (!failed) |
| + reject_header(outname); |
| abort_hunk(); |
| failed++; |
| if (verbosity != SILENT) |
| @@ -299,6 +310,8 @@ main (int argc, char **argv) |
| format_linenum (numbuf, newwhere)); |
| } |
| else if (! apply_hunk (&outstate, where)) { |
| + if (!failed) |
| + reject_header(outname); |
| abort_hunk (); |
| failed++; |
| if (verbosity != SILENT) |
| @@ -332,7 +345,8 @@ main (int argc, char **argv) |
| fclose (outstate.ofp); |
| outstate.ofp = 0; |
| } |
| - fclose (rejfp); |
| + if (!global_reject) |
| + fclose (rejfp); |
| continue; |
| } |
| |
| @@ -412,13 +426,13 @@ main (int argc, char **argv) |
| } |
| } |
| if (diff_type != ED_DIFF) { |
| - if (fclose (rejfp) != 0) |
| + if (!global_reject && fclose (rejfp) != 0) |
| write_fatal (); |
| if (failed) { |
| somefailed = true; |
| say ("%d out of %d hunk%s %s", failed, hunk, "s" + (hunk == 1), |
| skip_rest_of_patch ? "ignored" : "FAILED"); |
| - if (outname) { |
| + if (!global_reject && outname) { |
| char *rej = rejname; |
| if (!rejname) { |
| rej = xmalloc (strlen (outname) + 5); |
| @@ -445,6 +459,20 @@ main (int argc, char **argv) |
| } |
| set_signals (true); |
| } |
| + if (global_reject) |
| + { |
| + if (fclose (rejfp) != 0) |
| + write_fatal (); |
| + if (somefailed) |
| + { |
| + say (" -- saving rejects to file %s\n", quotearg (global_reject)); |
| + /*if (! dry_run) |
| + {*/ |
| + move_file (TMPREJNAME, &TMPREJNAME_needs_removal, |
| + global_reject, 0644, false); |
| + /*}*/ |
| + } |
| + } |
| if (outstate.ofp && (ferror (outstate.ofp) || fclose (outstate.ofp) != 0)) |
| write_fatal (); |
| cleanup (); |
| @@ -523,6 +551,7 @@ static struct option const longopts[] = |
| {"posix", no_argument, NULL, CHAR_MAX + 7}, |
| {"quoting-style", required_argument, NULL, CHAR_MAX + 8}, |
| {"unified-reject-files", no_argument, NULL, CHAR_MAX + 9}, |
| + {"global-reject-file", required_argument, NULL, CHAR_MAX + 10}, |
| {NULL, no_argument, NULL, 0} |
| }; |
| |
| @@ -582,6 +611,7 @@ static char const *const option_help[] = |
| " --dry-run Do not actually change any files; just print what would happen.", |
| " --posix Conform to the POSIX standard.", |
| " --unified-reject-files Create unified reject files.", |
| +" --global-reject-file=file Put all rejects into one file.", |
| "", |
| " -d DIR --directory=DIR Change the working directory to DIR first.", |
| #if HAVE_SETMODE_DOS |
| @@ -784,6 +814,9 @@ get_some_switches (void) |
| case CHAR_MAX + 9: |
| unified_reject_files = true; |
| break; |
| + case CHAR_MAX + 10: |
| + global_reject = savestr (optarg); |
| + break; |
| default: |
| usage (stderr, 2); |
| } |
| @@ -933,6 +966,37 @@ locate_hunk (LINENUM fuzz) |
| } |
| |
| static char * |
| +format_timestamp (char timebuf[37], bool which) |
| +{ |
| + time_t ts = pch_timestamp(which); |
| + if (ts != -1) |
| + { |
| + struct tm *tm = localtime(&ts); |
| + strftime(timebuf, 37, "\t%Y-%m-%d %H:%M:%S.000000000 %z", tm); |
| + } |
| + else |
| + timebuf[0] = 0; |
| + return timebuf; |
| +} |
| + |
| +/* Write a header in a reject file that combines multiple hunks. */ |
| +static void |
| +reject_header (const char *outname) |
| +{ |
| + char timebuf0[37], timebuf1[37]; |
| + if (!global_reject) |
| + return; |
| + if (diff_type == UNI_DIFF) |
| + fprintf(rejfp, "--- %s.orig%s\n+++ %s%s\n", |
| + outname, format_timestamp(timebuf0, reverse), |
| + outname, format_timestamp(timebuf1, !reverse)); |
| + else |
| + fprintf(rejfp, "*** %s.orig%s\n--- %s%s\n", |
| + outname, format_timestamp(timebuf0, reverse), |
| + outname, format_timestamp(timebuf1, !reverse)); |
| +} |
| + |
| +static char * |
| format_linerange (char rangebuf[LINENUM_LENGTH_BOUND*2 + 2], |
| LINENUM first, LINENUM lines) |
| { |