"git read-tree --reset" will currently remove all unmerged entries in index before feeding the index to unpack_trees(). Because the lack of unmerged entries, these entries, when read from tree, will be seen as "new entries" by {one,two,three}way_merge(). This is fine for now. But for sparse checkout, it needs to know whether an entry is new entry, because it will handle it different way than already-in entry. So the patch moves "unmerged entries removal" part into unpack_trees(), actually unpack_callback(). The function then can turn on o->has_unmerged flag, which can be utilized by sparse checkout. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin-read-tree.c | 3 ++- unpack-trees.c | 7 +++++++ unpack-trees.h | 2 ++ 3 files changed, 11 insertions(+), 1 deletions(-) diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 38fef34..528134c 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -136,9 +136,10 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) if (stage || opts.merge || opts.prefix) usage(read_tree_usage); opts.reset = 1; + opts.prune_unmerged = 1; opts.merge = 1; stage = 1; - read_cache_unmerged(); + read_cache(); continue; } diff --git a/unpack-trees.c b/unpack-trees.c index 83888ae..7d99051 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -301,6 +301,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str /* Are we supposed to look at the index too? */ if (o->merge) { + o->has_unmerged = 0; while (o->pos < o->src_index->cache_nr) { struct cache_entry *ce = o->src_index->cache[o->pos]; int cmp = compare_entry(ce, info, p); @@ -320,6 +321,12 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str add_entry(o, ce, 0, 0); return mask; } + + if (o->prune_unmerged) { + o->has_unmerged = 1; + /* leave src[0] as NULL and go over all other staged entries */ + continue; + } } src[0] = ce; } diff --git a/unpack-trees.h b/unpack-trees.h index 93ec3c6..86f0989 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -43,6 +43,8 @@ struct unpack_trees_options { verbose_update:1, aggressive:1, skip_unmerged:1, + prune_unmerged:1, + has_unmerged:1, initial_checkout:1, gently:1; const char *prefix; -- 1.6.0.3.890.g95457 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html