diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-08-29 10:24:45 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-08-30 19:41:43 -0700 |
commit | 387c9d49815ef4b1cefda71cf27f199d9fb24083 (patch) | |
tree | a3ff97314c0acbc7776ee4264a9d05bf3d820f9f | |
parent | cc58d7dfddc842360f6aade1507e1063d8cd0f40 (diff) | |
download | git-387c9d49815ef4b1cefda71cf27f199d9fb24083.tar.gz git-387c9d49815ef4b1cefda71cf27f199d9fb24083.tar.xz |
rerere: understand "diff3 -m" style conflicts with the original
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>
-rw-r--r-- | rerere.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -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"); @@ -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) @@ -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) |