/* The '3' here is a count of newlines. Once we find
* that many newlines of the particular type, we have escaped.
*/
- if (m[i].type == Changed && !m[i].ignored)
+ if (m[i].type == Changed)
changed = 3;
if (m[i].type == Unmatched)
unmatched = 3;
} else
in_wiggle = 0;
- if ((m[i].type == Conflict && m[i].ignored == 0) ||
+ if ((m[i].type == Conflict) ||
(show_wiggles && in_wiggle)) {
/* We have a conflict or wiggle here.
* First search backwards for an Unchanged marking
/* no start-of-line found... */
m[j].hi = -1;
if (m[j].hi > 0 &&
- (m[j].type == Changed && !m[j].ignored)) {
+ (m[j].type == Changed)) {
/* this can only work if start is
* also a line break */
if (is_cutpoint(m[j], af,bf,cf))
m[j].lo = m[j].al+1;
}
if (m[j].lo <= m[j].al+1 &&
- (m[j].type == Changed && !m[j].ignored)) {
+ (m[j].type == Changed)) {
/* this can only work if the end is a line break */
if (is_cutpoint(m[j+1], af,bf,cf))
/* ok */;
rv.merger[i].c1 = c1;
rv.merger[i].c2 = c2;
rv.merger[i].in_conflict = 0;
- rv.merger[i].ignored = 0;
if (!match1 && match2) {
/* This is either Unmatched or Extraneous - probably both.
*/
rv.merger[i].al = 0;
}
+ rv.merger[i].oldtype = rv.merger[i].type;
a += rv.merger[i].al;
b += rv.merger[i].bl;
c += rv.merger[i].cl;
break;
}
rv.merger[i].type = End;
+ rv.merger[i].oldtype = End;
rv.merger[i].a = a;
rv.merger[i].b = b;
rv.merger[i].c = c;
rv.merger[i].c1 = c1;
rv.merger[i].c2 = c2;
rv.merger[i].in_conflict = 0;
- rv.merger[i].ignored = 0;
assert(i < l);
/* Now revert any AlreadyApplied that aren't bounded by
printrange(out, c, cm->c, cm->cl);
break;
}
- if (cm->type == Changed && !cm->ignored)
+ if (cm->type == Changed)
st1 = 0; /* All of result of change must be printed */
printrange(out, c, cm->c+st1, cm->cl-st1);
st1 = 0;
int last = 0;
if (cm->in_conflict == 1 && cm != m)
last = 1;
- switch (cm->ignored ? Unchanged : cm->type) {
+ switch (cm->type) {
case Unchanged:
case AlreadyApplied:
case Unmatched:
case Extraneous:
break;
case Changed:
- if (m->ignored)
- printrange(out, a, m->a, m->al);
- else
- printrange(out, c, m->c, m->cl);
+ printrange(out, c, m->c, m->cl);
break;
case Conflict:
- if (m->ignored) {
- printrange(out, a, m->a, m->al);
- break;
- }
case End:
assert(0);
}
pos->s = 0;
pos->m++;
}
- } while (!stream_valid(pos->s, m[pos->m].type));
+ } while (!stream_valid(pos->s, m[pos->m].oldtype));
} else
break;
}
pos->m--;
}
} while (pos->m >= 0 &&
- !stream_valid(pos->s, m[pos->m].type));
+ !stream_valid(pos->s, m[pos->m].oldtype));
if (pos->m >= 0) {
switch (pos->s) {
case 0:
{
enum mergetype type;
int stream = pos->p.s;
- unsigned int ignore;
if (mode == 0)
return -1;
return a_unmatched;
break;
case Unchanged: /* visible everywhere, but only show stream 0 */
- if (stream == 0)
+ if (m[pos->p.m].oldtype == Conflict) {
+ switch (stream) {
+ case 0:
+ if (mode & RESULT)
+ return a_unmatched;
+ if (mode & ORIG)
+ return a_unmatched;
+ break;
+ case 1:
+ if (mode & BEFORE)
+ return a_extra;
+ break;
+ case 2:
+ if (mode & RESULT)
+ break;
+ if (mode & AFTER)
+ return a_added;
+ break;
+ }
+ break;
+ }
+ if (stream == 0) {
+ if (m[pos->p.m].oldtype != Unchanged)
+ return a_common | A_UNDERLINE;
return a_common;
+ }
break;
case Extraneous: /* stream 2 is visible in BEFORE and AFTER */
if ((mode & (BEFORE|AFTER))
return a_extra;
break;
case Changed: /* stream zero visible ORIG and BEFORE, stream 2 elsewhere */
- if (m[pos->p.m].ignored) {
- if (stream == 0)
- return a_common | A_UNDERLINE;
- break;
- }
if (stream == 0 &&
(mode & (ORIG|BEFORE)))
return a_delete;
return a_added;
break;
case Conflict:
- if (m[pos->p.m].ignored)
- ignore = A_REVERSE|A_UNDERLINE;
- else
- ignore = 0;
switch (stream) {
case 0:
- if (ignore && (mode & RESULT))
- return a_unmatched;
if (mode & ORIG)
- return a_unmatched | (A_REVERSE & ~ignore);
+ return a_unmatched | A_REVERSE;
break;
case 1:
if (mode & BEFORE)
- return a_extra | (A_UNDERLINE & ~ignore);
+ return a_extra | A_UNDERLINE;
break;
case 2:
- if ((mode & RESULT) && m[pos->p.m].ignored)
- break;
if (mode & (AFTER|RESULT))
- return a_added | (A_UNDERLINE & ~ignore);
+ return a_added | A_UNDERLINE;
break;
}
break;
if (pos.p.m < 0)
return 0;
do {
- if (m[pos.p.m].type == Changed && !m[pos.p.m].ignored)
+ if (m[pos.p.m].type == Changed)
rv |= CHANGES;
else if (m[pos.p.m].type == Conflict) {
- if (m[pos.p.m].ignored &&
- (mode & RESULT))
- ;
- else
- rv |= CONFLICTED | CHANGES;
+ rv |= CONFLICTED | CHANGES;
} else if (m[pos.p.m].type == AlreadyApplied) {
rv |= CONFLICTED;
if (mode & (BEFORE|AFTER))
tnum;
int changes = 0; /* If any edits have been made to the merge */
int answer; /* answer to 'save changes?' question */
- int do_ignore;
+ int do_mark;
struct elmnt e;
char search[80]; /* string we are searching for */
unsigned int searchlen = 0;
csl2 = diff_patch(fb, fa);
ci = make_merger(fm, fb, fa, csl1, csl2, 0, 1, 0);
+ for (i = 0; ci.merger[i].type != End; i++)
+ ci.merger[i].oldtype = ci.merger[i].type;
term_init(!selftest);
char lbuf[30];
(void)attrset(A_BOLD);
snprintf(lbuf, 29, "%s%s ln:%d",
- ci.merger[curs.pos.m].ignored
+ ci.merger[curs.pos.m].type != ci.merger[curs.pos.m].oldtype
? "Ignored ":"",
- typenames[ci.merger[curs.pos.m].type],
+ typenames[ci.merger[curs.pos.m].oldtype],
(pos.p.lineno-1)/2);
/* Longest type is AlreadyApplied - need to ensure
* we erase all of that.
vpos = tvpos;
break;
- case 'x': /* Toggle rejecting of conflict */
- if (ci.merger[curs.pos.m].type == Conflict ||
- ci.merger[curs.pos.m].type == Changed) {
- ci.merger[curs.pos.m].ignored =
- ! ci.merger[curs.pos.m].ignored;
- p->conflicts = isolate_conflicts(
- fm, fb, fa, csl1, csl2, 0,
- ci.merger, 0, &p->wiggles);
- refresh = 1;
- changes = 1;
- }
+ case 'x': /* Toggle rejecting of conflict.
+ * A 'Conflict' or 'Changed' becomes 'Unchanged'
+ */
+ if (ci.merger[curs.pos.m].oldtype != Conflict &&
+ ci.merger[curs.pos.m].oldtype != Changed)
+ break;
+
+ if (ci.merger[curs.pos.m].type == Unchanged)
+ ci.merger[curs.pos.m].type = ci.merger[curs.pos.m].oldtype;
+
+ else
+ ci.merger[curs.pos.m].type = Unchanged;
+ p->conflicts = isolate_conflicts(
+ fm, fb, fa, csl1, csl2, 0,
+ ci.merger, 0, &p->wiggles);
+ refresh = 1;
+ changes = 1;
break;
- case 'X': /* toggle 'ignored' for all Conflicts and Changeds
- * in the current line.
- * If any are not ignored, ignore them all, else
- * un-ignore them all.
+ case 'X': /* toggle where all Conflicts and Changeds
+ * in the current line are marked Unchanged.
+ * If any are not mark, mark them all, else
+ * un-mark them all.
*/
tpos = pos;
- do_ignore = 0;
+ do_mark = 0;
do {
- if ((ci.merger[tpos.p.m].type == Conflict ||
- ci.merger[tpos.p.m].type == Changed)
- && ci.merger[tpos.p.m].ignored == 0)
- do_ignore = 1;
+ if ((ci.merger[tpos.p.m].oldtype == Conflict ||
+ ci.merger[tpos.p.m].oldtype == Changed)
+ && ci.merger[tpos.p.m].type != Unchanged)
+ do_mark = 1;
e = prev_melmnt(&tpos.p, fm, fb, fa, ci.merger);
} while (!ends_line(e) ||
visible(mode & (RESULT|AFTER), ci.merger, &tpos) < 0);
tpos = pos;
do {
- if (ci.merger[tpos.p.m].type == Conflict ||
- ci.merger[tpos.p.m].type == Changed)
- ci.merger[tpos.p.m].ignored = do_ignore;
+ if (ci.merger[tpos.p.m].oldtype == Conflict ||
+ ci.merger[tpos.p.m].oldtype == Changed) {
+ if (do_mark)
+ ci.merger[tpos.p.m].type = Unchanged;
+ else
+ ci.merger[tpos.p.m].type =
+ ci.merger[tpos.p.m].oldtype;
+ }
e = prev_melmnt(&tpos.p, fm, fb, fa, ci.merger);
} while (!ends_line(e) ||
visible(mode & (RESULT|AFTER), ci.merger, &tpos) < 0);