From: Nguyễn Thái Ngọc Duy Date: Sun, 30 Nov 2008 10:54:33 GMT Subject: [PATCH 3/8] unpack_trees(): keep track of unmerged entries Message-ID: <1228042478-1886-4-git-send-email-pclouds@gmail.com> In-Reply-To: <1228042478-1886-3-git-send-email-pclouds@gmail.com> "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 --- 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