(m.c == 0 || ends_line(cf.list[m.c-1])));
}
-static int isolate_conflicts(struct file af, struct file bf, struct file cf,
+int isolate_conflicts(struct file af, struct file bf, struct file cf,
struct csl *csl1, struct csl *csl2, int words,
struct merge *m, int show_wiggles)
{
int changed = 0;
int unmatched = 0;
+ for (i = 0; m[i].type != End; i++)
+ m[i].in_conflict = 0;
+
for (i = 0; m[i].type != End; i++) {
if (m[i].type == Changed)
changed = 1;
if (m[i].type == Unmatched)
unmatched = 1;
- if (m[i].type == Conflict ||
+ if ((m[i].type == Conflict && m[i].conflict_ignored == 0) ||
(show_wiggles && ((changed && unmatched)
|| m[i].type == Extraneous))) {
/* We have a conflict (or wiggle) here.
rv.merger[i].c1 = c1;
rv.merger[i].c2 = c2;
rv.merger[i].in_conflict = 0;
+ rv.merger[i].conflict_ignored = 0;
if (!match1 && match2) {
/* This is either Unmatched or Extraneous - probably both.
rv.merger[i].c1 = c1;
rv.merger[i].c2 = c2;
rv.merger[i].in_conflict = 0;
+ rv.merger[i].conflict_ignored = 0;
assert(i < l);
rv.conflicts = isolate_conflicts(af, bf, cf, csl1, csl2, words,
rv.merger, show_wiggles);
return a_extra | A_UNDERLINE;
break;
case 2:
+ if ((mode & RESULT) && m[pos->p.m].conflict_ignored)
+ break;
if (mode & (AFTER|RESULT))
return a_added | A_UNDERLINE;
break;
do {
if (m[pos.p.m].type == Changed)
rv |= CHANGES;
- else if (m[pos.p.m].type == Conflict)
- rv |= CONFLICTED | CHANGES;
- else if (m[pos.p.m].type == AlreadyApplied) {
+ else if (m[pos.p.m].type == Conflict) {
+ if (m[pos.p.m].conflict_ignored &&
+ (mode & RESULT))
+ ;
+ else
+ rv |= CONFLICTED | CHANGES;
+ } else if (m[pos.p.m].type == AlreadyApplied) {
rv |= CONFLICTED;
if (mode & (BEFORE|AFTER))
rv |= CHANGES;
vpos = tvpos;
break;
+ case 'x': /* Toggle rejecting of conflict */
+ if (ci.merger[curs.pos.m].type == Conflict) {
+ ci.merger[curs.pos.m].conflict_ignored =
+ ! ci.merger[curs.pos.m].conflict_ignored;
+ isolate_conflicts(fm, fb, fa, csl1, csl2, 0, ci.merger, 0);
+ refresh = 1;
+ }
+ break;
+
case '?':
help_window(modehelp, merge_window_help);
refresh = 2;
int al, bl, cl; /* length of ranges */
int c1, c2; /* this or next common-sequence */
int in_conflict;
+ int conflict_ignored;
int lo, hi; /* region of a Changed or Unchanged that is not involved
* in a conflict.
* These are distances from start of the "before" section,
int words, int ignore_already, int show_wiggles);
extern void printword(FILE *f, struct elmnt e);
+extern int isolate_conflicts(struct file af, struct file bf, struct file cf,
+ struct csl *csl1, struct csl *csl2, int words,
+ struct merge *m, int show_wiggles);
extern struct ci make_merger(struct file a, struct file b, struct file c,
struct csl *c1, struct csl *c2, int words,
int ignore_already, int show_wiggles);