git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Varun Naik <vcnaik94@gmail.com>
To: vcnaik94@gmail.com
Cc: git@vger.kernel.org, peff@peff.net, gitster@pobox.com
Subject: [PATCH v2] checkout.c: unstage empty deleted ita files
Date: Thu,  1 Aug 2019 09:07:56 -0700	[thread overview]
Message-ID: <20190801160756.12601-1-vcnaik94@gmail.com> (raw)
In-Reply-To: <20190726045645.2437-1-vcnaik94@gmail.com>

It is possible to delete a committed file from the index and then add it
as intent-to-add. After `git checkout HEAD`, the file should be
identical in the index and HEAD. The command already works correctly if
the file has contents in HEAD. This patch provides the desired behavior
even when the file is empty in HEAD.

`git checkout HEAD` calls tree.c:read_tree_1(), with fn pointing to
checkout.c:update_some(). update_some() creates a new cache entry but
discards it when its mode and oid match those of the old entry. A cache
entry for an ita file and a cache entry for an empty file have the same
oid. Therefore, an empty deleted ita file previously passed both of
these checks, and the new entry was discarded, so the file remained
unchanged in the index. After this fix, if the file is marked as ita in
the cache, then we avoid discarding the new entry and add the new entry
to the cache instead.

This change should not affect newly added ita files. For those, inside
tree.c:read_tree_1(), tree_entry_interesting() returns
entry_not_interesting, so fn is never called.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Varun Naik <vcnaik94@gmail.com>
---
This patch fixes and tests only "checkout", because "restore" has not
reached maint yet. A second patch on the merge of this patch into master
with a test case for "restore" is coming.

 builtin/checkout.c        |  1 +
 t/t2022-checkout-paths.sh | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/builtin/checkout.c b/builtin/checkout.c
index ffa776c6e1..c41dfa53a9 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -105,6 +105,7 @@ static int update_some(const struct object_id *oid, struct strbuf *base,
 	if (pos >= 0) {
 		struct cache_entry *old = active_cache[pos];
 		if (ce->ce_mode == old->ce_mode &&
+		    !ce_intent_to_add(old) &&
 		    oideq(&ce->oid, &old->oid)) {
 			old->ce_flags |= CE_UPDATE;
 			discard_cache_entry(ce);
diff --git a/t/t2022-checkout-paths.sh b/t/t2022-checkout-paths.sh
index fc3eb43b89..6844afafc0 100755
--- a/t/t2022-checkout-paths.sh
+++ b/t/t2022-checkout-paths.sh
@@ -78,4 +78,15 @@ test_expect_success 'do not touch files that are already up-to-date' '
 	test_cmp expect actual
 '
 
+test_expect_success 'checkout HEAD adds deleted intent-to-add file back to index' '
+	echo "nonempty" >nonempty &&
+	>empty &&
+	git add nonempty empty &&
+	git commit -m "create files to be deleted" &&
+	git rm --cached nonempty empty &&
+	git add -N nonempty empty &&
+	git checkout HEAD nonempty empty &&
+	git diff --cached --exit-code
+'
+
 test_done
-- 
2.22.0


  parent reply	other threads:[~2019-08-01 16:08 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-26  4:56 [PATCH] checkout.c: unstage empty deleted ita files Varun Naik
2019-07-26  5:01 ` Varun Naik
2019-07-26  8:57 ` Jeff King
2019-07-29  6:54   ` Varun Naik
2019-07-29  9:11     ` Jeff King
2019-08-01 16:07 ` Varun Naik [this message]
2019-08-01 17:34   ` [PATCH v2] " Junio C Hamano
2019-08-01 21:51   ` Jeff King
2019-08-01 16:09 ` [PATCH] restore: add test for " Varun Naik
2019-08-02 16:16   ` Junio C Hamano
2019-08-02 16:28 ` [PATCH v3] checkout.c: unstage empty " Varun Naik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190801160756.12601-1-vcnaik94@gmail.com \
    --to=vcnaik94@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=peff@peff.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).