mirror of
https://github.com/git/git.git
synced 2024-06-01 18:16:08 +02:00
git-read-tree: fix up three-way merge tests
When we collapse three entries, we need to check all of the collapsed entries against the old pre-merge state.
This commit is contained in:
parent
02ede67ad4
commit
76f38347b4
28
read-tree.c
28
read-tree.c
|
@ -118,16 +118,12 @@ static void verify_uptodate(struct cache_entry *ce)
|
||||||
* it's up-to-date or not (ie it can be a file that we
|
* it's up-to-date or not (ie it can be a file that we
|
||||||
* have updated but not committed yet).
|
* have updated but not committed yet).
|
||||||
*/
|
*/
|
||||||
static void verify_cleared(struct cache_entry *ce)
|
static void reject_merge(struct cache_entry *ce)
|
||||||
{
|
{
|
||||||
if (ce)
|
die("Entry '%s' would be overwritten by merge. Cannot merge.", ce->name);
|
||||||
die("Entry '%s' would be overwritten by merge. Cannot merge.", ce->name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int old_match(struct cache_entry *old, struct cache_entry *a)
|
#define CHECK_OLD(ce) if (old && same(old, ce)) { verify_uptodate(old); old = NULL; }
|
||||||
{
|
|
||||||
return old && path_matches(old, a) && same(old, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void trivially_merge_cache(struct cache_entry **src, int nr)
|
static void trivially_merge_cache(struct cache_entry **src, int nr)
|
||||||
{
|
{
|
||||||
|
@ -141,22 +137,28 @@ static void trivially_merge_cache(struct cache_entry **src, int nr)
|
||||||
|
|
||||||
/* We throw away original cache entries except for the stat information */
|
/* We throw away original cache entries except for the stat information */
|
||||||
if (!ce_stage(ce)) {
|
if (!ce_stage(ce)) {
|
||||||
verify_cleared(old);
|
if (old)
|
||||||
|
reject_merge(old);
|
||||||
old = ce;
|
old = ce;
|
||||||
src++;
|
src++;
|
||||||
nr--;
|
nr--;
|
||||||
active_nr--;
|
active_nr--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (old && !path_matches(old, ce))
|
||||||
|
reject_merge(old);
|
||||||
if (nr > 2 && (result = merge_entries(ce, src[1], src[2])) != NULL) {
|
if (nr > 2 && (result = merge_entries(ce, src[1], src[2])) != NULL) {
|
||||||
/*
|
/*
|
||||||
* See if we can re-use the old CE directly?
|
* See if we can re-use the old CE directly?
|
||||||
* That way we get the uptodate stat info.
|
* That way we get the uptodate stat info.
|
||||||
*/
|
*/
|
||||||
if (old_match(old, result)) {
|
if (old && same(old, result)) {
|
||||||
*result = *old;
|
*result = *old;
|
||||||
old = NULL;
|
old = NULL;
|
||||||
}
|
}
|
||||||
|
CHECK_OLD(ce);
|
||||||
|
CHECK_OLD(src[1]);
|
||||||
|
CHECK_OLD(src[2]);
|
||||||
ce = result;
|
ce = result;
|
||||||
ce->ce_flags &= ~htons(CE_STAGEMASK);
|
ce->ce_flags &= ~htons(CE_STAGEMASK);
|
||||||
src += 2;
|
src += 2;
|
||||||
|
@ -168,15 +170,13 @@ static void trivially_merge_cache(struct cache_entry **src, int nr)
|
||||||
* If we had an old entry that we now effectively
|
* If we had an old entry that we now effectively
|
||||||
* overwrite, make sure it wasn't dirty.
|
* overwrite, make sure it wasn't dirty.
|
||||||
*/
|
*/
|
||||||
if (old_match(old, ce)) {
|
CHECK_OLD(ce);
|
||||||
verify_uptodate(old);
|
|
||||||
old = NULL;
|
|
||||||
}
|
|
||||||
*dst++ = ce;
|
*dst++ = ce;
|
||||||
src++;
|
src++;
|
||||||
nr--;
|
nr--;
|
||||||
}
|
}
|
||||||
verify_cleared(old);
|
if (old)
|
||||||
|
reject_merge(old);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void merge_stat_info(struct cache_entry **src, int nr)
|
static void merge_stat_info(struct cache_entry **src, int nr)
|
||||||
|
|
Loading…
Reference in New Issue