m[i].in_conflict = 0;
for (i = 0; m[i].type != End; i++) {
- if (m[i].type == Changed)
+ if (m[i].type == Changed && !m[i].ignored)
changed = 1;
if (m[i].type == Unmatched)
unmatched = 1;
- if ((m[i].type == Conflict && m[i].conflict_ignored == 0) ||
+ if ((m[i].type == Conflict && m[i].ignored == 0) ||
(show_wiggles && ((changed && unmatched)
|| m[i].type == Extraneous))) {
/* We have a conflict (or wiggle) here.
if (!m[j].in_conflict) {
m[j].in_conflict = 1;
m[j].lo = 0;
- } else if (m[j].type == Changed) {
+ } else if (m[j].type == Changed && !m[i].ignored) {
/* This can no longer form a border */
m[j].hi = -1;
/* We merge these conflicts and stop searching */
newlines++;
}
- if (m[j].type == Unchanged || m[j].type == Changed) {
+ if (m[j].type == Unchanged ||
+ (m[j].type == Changed && !m[i].ignored)) {
/* If we find enough newlines in this section,
* then we only really need 1, but would rather
* it wasn't the first one. 'firstk' allows us
else
/* no start-of-line found... */
m[j].hi = -1;
- if (m[j].hi > 0 && m[j].type == Changed) {
+ if (m[j].hi > 0 &&
+ (m[j].type == Changed && !m[j].ignored)) {
/* this can only work if start is
* also a line break */
if (is_cutpoint(m[j], af,bf,cf))
if (ends_line(bf.list[m[j].b+k]))
newlines++;
}
- if (m[j].type == Unchanged || m[j].type == Changed) {
+ if (m[j].type == Unchanged ||
+ (m[j].type == Changed && !m[j].ignored)) {
m[j].hi = m[j].al;
if (words) {
m[j].lo = 0;
/* no start-of-line found */
m[j].lo = m[j].al+1;
}
- if (m[j].lo <= m[j].al+1 && m[j].type == Changed) {
+ if (m[j].lo <= m[j].al+1 &&
+ (m[j].type == Changed && !m[j].ignored)) {
/* 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].conflict_ignored = 0;
+ rv.merger[i].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;
+ rv.merger[i].ignored = 0;
assert(i < l);
rv.conflicts = isolate_conflicts(af, bf, cf, csl1, csl2, words,
rv.merger, show_wiggles);
*/
int found_conflict = 0;
int st = 0, st1;
- if (m->type == Unchanged || m->type == Changed)
+ if (m->type == Unchanged ||
+ (m->type == Changed && !m->ignored))
if (m->hi >= m->lo)
st = m->hi;
st1 = st;
- if (m->type == Unchanged)
+ if (m->type == Unchanged ||
+ (m->type == Changed && m->ignored))
printrange(out, a, m->a+m->lo, m->hi - m->lo);
if (do_trace)
fputs(words ? "===" : "=======\n", out);
st1 = st;
for (cm = m; cm->in_conflict; cm++) {
- if (cm->type == Unchanged &&
- cm != m && cm->lo < cm->hi) {
+ if ((cm->type == Unchanged ||
+ (cm->type == Changed && cm->ignored))
+ && cm != m && cm->lo < cm->hi) {
printrange(out, c, cm->c, cm->lo);
break;
}
- if (cm->type == Changed)
+ if (cm->type == Changed && !cm->ignored)
st1 = 0; /* All of result of change must be printed */
printrange(out, c, cm->c+st1, cm->cl-st1);
st1 = 0;
if ((cm->type == Unchanged || cm->type == Changed)
&& cm != m && cm->lo < cm->hi)
last = 1;
- switch (cm->type) {
+ switch (cm->ignored ? Unchanged : cm->type) {
case Unchanged:
case AlreadyApplied:
case Unmatched:
}
fputs(words ? "--->>>" : ">>>>>>>\n", out);
m = cm;
- if (m->in_conflict && m->type == Unchanged
+ if (m->in_conflict && (m->type == Unchanged ||
+ (m->type == Changed && m->ignored))
&& m->hi >= m->al) {
printrange(out, a, m->a+m->lo, m->hi-m->lo);
m++;
case Extraneous:
break;
case Changed:
- printrange(out, c, m->c, m->cl);
+ if (m->ignored)
+ printrange(out, a, m->a, m->al);
+ else
+ printrange(out, c, m->c, m->cl);
break;
case Conflict:
- if (m->conflict_ignored) {
+ if (m->ignored) {
printrange(out, a, m->a, m->al);
break;
}
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].conflict_ignored)
+ if (m[pos->p.m].ignored)
ignore = A_REVERSE|A_UNDERLINE;
else
ignore = 0;
return a_extra | (A_UNDERLINE & ~ignore);
break;
case 2:
- if ((mode & RESULT) && m[pos->p.m].conflict_ignored)
+ if ((mode & RESULT) && m[pos->p.m].ignored)
break;
if (mode & (AFTER|RESULT))
return a_added | (A_UNDERLINE & ~ignore);
int unmatched = 0;
do {
- if (m[pos.p.m].type == Changed)
+ if (m[pos.p.m].type == Changed && !m[pos.p.m].ignored)
rv |= CHANGES;
else if (m[pos.p.m].type == Conflict) {
- if (m[pos.p.m].conflict_ignored &&
+ if (m[pos.p.m].ignored &&
(mode & RESULT))
;
else
char lbuf[30];
(void)attrset(A_BOLD);
snprintf(lbuf, 29, "%s%s ln:%d",
- ci.merger[curs.pos.m].conflict_ignored
+ ci.merger[curs.pos.m].ignored
? "Ignored ":"",
typenames[ci.merger[curs.pos.m].type],
(pos.p.lineno-1)/2);
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;
+ 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;
isolate_conflicts(fm, fb, fa, csl1, csl2, 0, ci.merger, 0);
refresh = 1;
changes = 1;