Thread (9 messages) 9 messages, 2 authors, 2019-08-02

Re: [PATCH v2] checkout.c: unstage empty deleted ita files

From: Jeff King <hidden>
Date: 2019-08-01 21:51:50

On Thu, Aug 01, 2019 at 09:07:56AM -0700, Varun Naik wrote:
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 [off-list ref]
Signed-off-by: Varun Naik <redacted>
---
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.
Thanks, this version looks good to me!

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help