On Fri, Jul 17, 2015 at 05:19:27PM -0400, David Turner wrote:
> Don't update files in the worktree from cache entries which are
> flagged with CE_WT_REMOVE.
>
> When a user does a sparse checkout, git removes files that are marked
> with CE_WT_REMOVE (because they are out-of-scope for the sparse
> checkout). If those files are also marked CE_UPDATE (for instance,
> because they differ in the branch that is being checked out and the
> outgoing branch), git would previously recreate them. This patch
> prevents them from being recreated.
>
> These erroneously-created files would also interfere with merges,
> causing pre-merge revisions of out-of-scope files to appear in the
> worktree.
Thank you both for catching this. Just a small suggestion. Perhaps we
should do this instead. apply_sparse_checkout() is the function where
all "action" manipulation (add, delete, update files..) for sparse
checkout occurs and it should not ask to delete and update both at the
same time.
-- 8< --
diff --git a/unpack-trees.c b/unpack-trees.c
index 2927660..d6cf849 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -224,6 +224,9 @@ static int check_updates(struct unpack_trees_options *o)
struct cache_entry *ce = index->cache[i];
if (ce->ce_flags & CE_UPDATE) {
+ if (ce->ce_flags & CE_WT_REMOVE)
+ die("BUG: both update and delete flags are set
on %s",
+ ce->name);
display_progress(progress, ++cnt);
ce->ce_flags &= ~CE_UPDATE;
if (o->update && !o->dry_run) {
@@ -293,6 +296,7 @@ static int apply_sparse_checkout(struct index_state *istate,
if (!(ce->ce_flags & CE_UPDATE) && verify_uptodate_sparse(ce,
o))
return -1;
ce->ce_flags |= CE_WT_REMOVE;
+ ce->ce_flags &= ~CE_UPDATE;
}
if (was_skip_worktree && !ce_skip_worktree(ce)) {
if (verify_absent_sparse(ce,
ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o))
-- 8< --
--
Duy
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html