diff -Naur patch-2.6.1-orig/src/common.h patch-2.6.1/src/common.h --- patch-2.6.1-orig/src/common.h 2009-12-30 09:56:30.000000000 -0300 +++ patch-2.6.1/src/common.h 2011-10-04 13:25:01.000000000 -0300 @@ -149,6 +149,7 @@ XTERN int patch_get; XTERN bool set_time; XTERN bool set_utc; +XTERN bool interactive_patch; enum diff { diff -Naur patch-2.6.1-orig/src/patch.c patch-2.6.1/src/patch.c --- patch-2.6.1-orig/src/patch.c 2009-12-30 09:56:30.000000000 -0300 +++ patch-2.6.1/src/patch.c 2011-10-04 13:45:25.000000000 -0300 @@ -523,7 +523,7 @@ skip_rest_of_patch = false; } -static char const shortopts[] = "bB:cd:D:eEfF:g:i:l" +static char const shortopts[] = "bB:cd:D:eEfF:g:i:Il" #if 0 && defined(ENABLE_MERGE) "m" #endif @@ -536,6 +536,7 @@ {"context", no_argument, NULL, 'c'}, {"directory", required_argument, NULL, 'd'}, {"ifdef", required_argument, NULL, 'D'}, + {"interactive", no_argument, NULL, 'I'}, {"ed", no_argument, NULL, 'e'}, {"remove-empty-files", no_argument, NULL, 'E'}, {"force", no_argument, NULL, 'f'}, @@ -593,6 +594,8 @@ "", " -i PATCHFILE --input=PATCHFILE Read patch from PATCHFILE instead of stdin.", "", +" -I --interactive Prompt user before applying each hunk.", +"", "Output options:", "", " -o FILE --output=FILE Output patched files to FILE.", @@ -732,6 +735,9 @@ case 'i': patchname = savestr (optarg); break; + case 'I': + interactive_patch = true; + break; case 'l': canonicalize = true; break; @@ -1205,6 +1211,21 @@ register LINENUM pat_end = pch_end (); register FILE *fp = outstate->ofp; + /* Show hunk and ask the user if apply. */ + if (interactive_patch) { + /* Do a fake abort_hunk just for show it on screen. */ + FILE* tmp_rejfp = rejfp; + rejfp = stdout; + abort_hunk (true, false); + rejfp = tmp_rejfp; + say ("\n"); + ask ( "Apply patch? [y] " ); + if (*buf == 'n') { + say ("\tpatch skipped.\n"); + return true; + } + } + where--; while (pch_char(new) == '=' || pch_char(new) == '\n') new++;