git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2] unpack-trees: don't update files with CE_WT_REMOVE set

From
Duy Nguyen <pclouds@gmail.com>
Date
Jul 18, 2015, 08:37 UTC
Message-ID
<20150718083719.GA19676@lanh>
In-Reply-To
<1437167967-5933-1-git-send-email-dturner@twopensource.com>
On Fri, Jul 17, 2015 at 05:19:27PM -0400, David Turner wrote:
Show 13 quoted lines
> 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
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 8 in “unpack-trees: don't update files flagged for deletion”
  1. unpack-trees: don't update files flagged for deletionDavid Turner, Jul 17, 2015
  2. Junio C HamanoJul 17, 2015
  3. unpack-trees: don't update files with CE_WT_REMOVE setDavid Turner, Jul 17, 2015
  4. Junio C HamanoJul 17, 2015
  5. Duy NguyenJul 18, 2015
  6. Junio C HamanoJul 18, 2015
  7. Junio C HamanoJul 21, 2015
  8. David TurnerJul 20, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.