From f1f523eae99020d58ad6e7a1ef8187569e15c270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Thu, 20 Aug 2009 20:47:10 +0700 Subject: [PATCH] unpack-trees(): ignore worktree check outside checkout area MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit verify_absent() and verify_uptodate() are used to ensure worktree is safe to be updated, then CE_REMOVE or CE_UPDATE will be set. Finally check_updates() bases on CE_REMOVE, CE_UPDATE and the recently added CE_WT_REMOVE to update working directory accordingly. The entries that are checked may eventually be left out of checkout area (done later in apply_sparse_checkout()). We don't want to update outside checkout area. This patch teaches Git to assume "good", skip these checks when it's sure those entries will be outside checkout area, and clear CE_REMOVE|CE_UPDATE that could be set due to this assumption. Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- unpack-trees.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/unpack-trees.c b/unpack-trees.c index 2d8ecb73b1..72743b34df 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -505,6 +505,14 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options ret = -1; goto done; } + /* + * Merge strategies may set CE_UPDATE|CE_REMOVE outside checkout + * area as a result of ce_skip_worktree() shortcuts in + * verify_absent() and verify_uptodate(). Clear them. + */ + if (ce_skip_worktree(ce)) + ce->ce_flags &= ~(CE_UPDATE | CE_REMOVE); + } } @@ -577,6 +585,8 @@ static int verify_uptodate_1(struct cache_entry *ce, static int verify_uptodate(struct cache_entry *ce, struct unpack_trees_options *o) { + if (!o->skip_sparse_checkout && will_have_skip_worktree(ce, o)) + return 0; return verify_uptodate_1(ce, o, ERRORMSG(o, not_uptodate_file)); } @@ -776,6 +786,8 @@ static int verify_absent_1(struct cache_entry *ce, const char *action, static int verify_absent(struct cache_entry *ce, const char *action, struct unpack_trees_options *o) { + if (!o->skip_sparse_checkout && will_have_skip_worktree(ce, o)) + return 0; return verify_absent_1(ce, action, o, ERRORMSG(o, would_lose_untracked)); }