mirror of
https://github.com/git/git
synced 2024-10-30 04:01:21 +00:00
unpack_trees(): fix diff-index regression.
When skip_unmerged option is not given, unpack_trees() should not just skip unmerged cache entries but keep them in the result for the caller to sort them out. For callers other than diff-index, the incoming index should never be unmerged, but diff-index is a special case caller. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
542c264b01
commit
20a16eb33e
2 changed files with 18 additions and 2 deletions
18
diff-lib.c
18
diff-lib.c
|
@ -641,6 +641,21 @@ static void do_oneway_diff(struct unpack_trees_options *o,
|
||||||
show_modified(revs, tree, idx, 1, cached, match_missing);
|
show_modified(revs, tree, idx, 1, cached, match_missing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void skip_same_name(struct cache_entry *ce, struct unpack_trees_options *o)
|
||||||
|
{
|
||||||
|
int len = ce_namelen(ce);
|
||||||
|
const struct index_state *index = o->src_index;
|
||||||
|
|
||||||
|
while (o->pos < index->cache_nr) {
|
||||||
|
struct cache_entry *next = index->cache[o->pos];
|
||||||
|
if (len != ce_namelen(next))
|
||||||
|
break;
|
||||||
|
if (memcmp(ce->name, next->name, len))
|
||||||
|
break;
|
||||||
|
o->pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The unpack_trees() interface is designed for merging, so
|
* The unpack_trees() interface is designed for merging, so
|
||||||
* the different source entries are designed primarily for
|
* the different source entries are designed primarily for
|
||||||
|
@ -662,6 +677,9 @@ static int oneway_diff(struct cache_entry **src, struct unpack_trees_options *o)
|
||||||
struct cache_entry *tree = src[1];
|
struct cache_entry *tree = src[1];
|
||||||
struct rev_info *revs = o->unpack_data;
|
struct rev_info *revs = o->unpack_data;
|
||||||
|
|
||||||
|
if (idx && ce_stage(idx))
|
||||||
|
skip_same_name(idx, o);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unpack-trees generates a DF/conflict entry if
|
* Unpack-trees generates a DF/conflict entry if
|
||||||
* there was a directory in the index and a tree
|
* there was a directory in the index and a tree
|
||||||
|
|
|
@ -116,7 +116,6 @@ static int unpack_index_entry(struct cache_entry *ce, struct unpack_trees_option
|
||||||
add_entry(o, ce, 0, 0);
|
add_entry(o, ce, 0, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return call_unpack_fn(src, o);
|
return call_unpack_fn(src, o);
|
||||||
}
|
}
|
||||||
|
@ -286,7 +285,6 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
|
||||||
add_entry(o, ce, 0, 0);
|
add_entry(o, ce, 0, 0);
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
src[0] = ce;
|
src[0] = ce;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue