diff options
-rw-r--r-- | rerere.c | 28 | ||||
-rwxr-xr-x | t/t4200-rerere.sh | 10 |
2 files changed, 37 insertions, 1 deletions
@@ -1038,7 +1038,33 @@ static int rerere_forget_one_path(const char *path, struct string_list *rr) /* Nuke the recorded resolution for the conflict */ id = new_rerere_id(sha1); - id->variant = 0; /* for now */ + + for (id->variant = 0; + id->variant < id->collection->status_nr; + id->variant++) { + mmfile_t cur = { NULL, 0 }; + mmbuffer_t result = {NULL, 0}; + int cleanly_resolved; + + if (!has_rerere_resolution(id)) + continue; + + handle_cache(path, sha1, rerere_path(id, "thisimage")); + if (read_mmfile(&cur, rerere_path(id, "thisimage"))) { + free(cur.ptr); + return error("Failed to update conflicted state in '%s'", + path); + } + cleanly_resolved = !try_merge(id, path, &cur, &result); + free(result.ptr); + free(cur.ptr); + if (cleanly_resolved) + break; + } + + if (id->collection->status_nr <= id->variant) + return error("no remembered resolution for '%s'", path); + filename = rerere_path(id, "postimage"); if (unlink(filename)) return (errno == ENOENT diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index a85fc7d42..1a080e782 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -536,6 +536,16 @@ test_expect_success 'multiple identical conflicts' ' test_cmp file1.expect file1 && test_cmp file2.expect file2 && + # Forget resolution for file2 + git rerere forget file2 && + echo file2 >expect && + git rerere status >actual && + test_cmp expect actual && + count_pre_post 2 1 && + + # file2 already has correct resolution, so record it again + git rerere && + # Pretend that the resolutions are old again find .git/rr-cache/ -type f | xargs test-chmtime -172800 && |