"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 | 6 +++++- unpack-trees.c | 7 +++++++ unpack-trees.h | 2 ++ 3 files changed, 14 insertions(+), 1 deletions(-) diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 9c2d634..17ca265 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -113,7 +113,11 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) argc = parse_options(argc, argv, unused_prefix, read_tree_options, read_tree_usage, 0); - if (read_cache_unmerged() && (opts.prefix || opts.merge)) + if (opts.reset) { + opts.prune_unmerged = 1; + read_cache(); + } + else if (read_cache_unmerged() && (opts.prefix || opts.merge)) die("You need to resolve your current index first"); prefix_set = opts.prefix ? 1 : 0; diff --git a/unpack-trees.c b/unpack-trees.c index 720f7a1..c67eed8 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -289,6 +289,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); @@ -308,6 +309,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 d19df44..aa3ac17 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -26,6 +26,8 @@ struct unpack_trees_options { verbose_update, aggressive, skip_unmerged, + prune_unmerged, + has_unmerged, initial_checkout, diff_index_cached, gently; -- 1.6.3.2.448.gdf8b6 -- 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