Skip to content

Commit

Permalink
rerere: understand "diff3 -m" style conflicts with the original
Browse files Browse the repository at this point in the history
This teaches rerere to grok conflicts expressed in "diff3 -m" style
output, where the version from the common ancestor is output after the
first side, preceded by a "|||||||" line.

The rerere database needs to keep only the versions from two sides, so the
code parses the original copy and discards it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Aug 31, 2008
1 parent cc58d7d commit 387c9d4
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions rerere.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ static int handle_file(const char *path,
char buf[1024];
int hunk_no = 0;
enum {
RR_CONTEXT = 0, RR_SIDE_1, RR_SIDE_2,
RR_CONTEXT = 0, RR_SIDE_1, RR_SIDE_2, RR_ORIGINAL,
} hunk = RR_CONTEXT;
struct strbuf one, two;
FILE *f = fopen(path, "r");
Expand All @@ -104,9 +104,13 @@ static int handle_file(const char *path,
if (hunk != RR_CONTEXT)
goto bad;
hunk = RR_SIDE_1;
} else if (!prefixcmp(buf, "=======") && isspace(buf[7])) {
} else if (!prefixcmp(buf, "|||||||") && isspace(buf[7])) {
if (hunk != RR_SIDE_1)
goto bad;
hunk = RR_ORIGINAL;
} else if (!prefixcmp(buf, "=======") && isspace(buf[7])) {
if (hunk != RR_SIDE_1 && hunk != RR_ORIGINAL)
goto bad;
hunk = RR_SIDE_2;
} else if (!prefixcmp(buf, ">>>>>>> ")) {
if (hunk != RR_SIDE_2)
Expand All @@ -132,6 +136,8 @@ static int handle_file(const char *path,
strbuf_reset(&two);
} else if (hunk == RR_SIDE_1)
strbuf_addstr(&one, buf);
else if (hunk == RR_ORIGINAL)
; /* discard */
else if (hunk == RR_SIDE_2)
strbuf_addstr(&two, buf);
else if (out)
Expand Down

0 comments on commit 387c9d4

Please sign in to comment.