summaryrefslogtreecommitdiff
path: root/rerere.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-08-29 17:24:45 (GMT)
committerJunio C Hamano <gitster@pobox.com>2008-08-31 02:41:43 (GMT)
commit387c9d49815ef4b1cefda71cf27f199d9fb24083 (patch)
treea3ff97314c0acbc7776ee4264a9d05bf3d820f9f /rerere.c
parentcc58d7dfddc842360f6aade1507e1063d8cd0f40 (diff)
downloadgit-387c9d49815ef4b1cefda71cf27f199d9fb24083.zip
git-387c9d49815ef4b1cefda71cf27f199d9fb24083.tar.gz
git-387c9d49815ef4b1cefda71cf27f199d9fb24083.tar.bz2
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>
Diffstat (limited to 'rerere.c')
-rw-r--r--rerere.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/rerere.c b/rerere.c
index bf74b26..4e2c9dd 100644
--- a/rerere.c
+++ b/rerere.c
@@ -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)