patch: fix -N regression

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-08-17 01:31:40 +02:00
parent bdaea46318
commit cda815996b

View File

@ -12,7 +12,6 @@
* TODO: * TODO:
* -b backup * -b backup
* -l treat all whitespace as a single space * -l treat all whitespace as a single space
* -N ignore already applied
* -d chdir first * -d chdir first
* -D define wrap #ifdef and #ifndef around changes * -D define wrap #ifdef and #ifndef around changes
* -o outfile output here instead of in place * -o outfile output here instead of in place
@ -244,14 +243,12 @@ struct globals {
} while (0) } while (0)
//bbox had: "p:i:RN"
#define FLAG_STR "Rup:i:Nx" #define FLAG_STR "Rup:i:Nx"
/* FLAG_REVERSE must be == 1! Code uses this fact. */ /* FLAG_REVERSE must be == 1! Code uses this fact. */
#define FLAG_REVERSE (1 << 0) #define FLAG_REVERSE (1 << 0)
#define FLAG_u (1 << 1) #define FLAG_u (1 << 1)
#define FLAG_PATHLEN (1 << 2) #define FLAG_PATHLEN (1 << 2)
#define FLAG_INPUT (1 << 3) #define FLAG_INPUT (1 << 3)
// -N: not supported yet
#define FLAG_IGNORE (1 << 4) #define FLAG_IGNORE (1 << 4)
//non-standard: //non-standard:
#define FLAG_DEBUG (1 << 5) #define FLAG_DEBUG (1 << 5)
@ -314,6 +311,10 @@ static int apply_one_hunk(void)
{ {
struct double_list *plist, *buf = NULL, *check; struct double_list *plist, *buf = NULL, *check;
int matcheof = 0, reverse = option_mask32 & FLAG_REVERSE, backwarn = 0; int matcheof = 0, reverse = option_mask32 & FLAG_REVERSE, backwarn = 0;
/* Do we try "dummy" revert to check whether
* to silently skip this hunk? Used to implement -N.
*/
int dummy_revert = 0;
// Break doubly linked list so we can use singly linked traversal function. // Break doubly linked list so we can use singly linked traversal function.
TT.current_hunk->prev->next = NULL; TT.current_hunk->prev->next = NULL;
@ -343,9 +344,14 @@ static int apply_one_hunk(void)
while (plist && *plist->data == "+-"[reverse]) { while (plist && *plist->data == "+-"[reverse]) {
if (data && !strcmp(data, plist->data+1)) { if (data && !strcmp(data, plist->data+1)) {
if (!backwarn) { if (!backwarn) {
backwarn++;
if (option_mask32 & FLAG_IGNORE) {
dummy_revert = 1;
reverse ^= 1;
continue;
}
fdprintf(2,"Possibly reversed hunk %d at %ld\n", fdprintf(2,"Possibly reversed hunk %d at %ld\n",
TT.hunknum, TT.linenum); TT.hunknum, TT.linenum);
backwarn++;
} }
} }
plist = plist->next; plist = plist->next;
@ -409,7 +415,7 @@ static int apply_one_hunk(void)
} }
out: out:
// We have a match. Emit changed data. // We have a match. Emit changed data.
TT.state = "-+"[reverse]; TT.state = "-+"[reverse ^ dummy_revert];
llist_free(TT.current_hunk, do_line); llist_free(TT.current_hunk, do_line);
TT.current_hunk = NULL; TT.current_hunk = NULL;
TT.state = 1; TT.state = 1;