Junio C Hamano [off-list ref] writes:
Duy Nguyen [off-list ref] writes:
quoted
On Tue, Feb 04, 2014 at 02:25:25PM -0800, Junio C Hamano wrote:
quoted
Junio C Hamano [off-list ref] writes:
quoted
While I do not have any problem with adding an optional "keep lost
paths as intent-to-add entries" feature, I am not sure why this has
to be so different from the usual add-cache-entry codepath. The
if/elseif chain you are touching inside this loop does:
- If the tree you are resetting to has something at the path
(which is different from the current index, obviously), create
a cache entry to represent that state from the tree and stuff
it in the index;
- Otherwise, the tree you are resetting to does not have that
path. We used to say "remove it from the index", but now we have
an option to instead add it as an intent-to-add entry.
So, why doesn't the new codepath do exactly the same thing as the
first branch of the if/else chain and call add_cache_entry but with
a ce marked with CE_INTENT_TO_ADD? That would parallel what happens
in "git add -N" better, I would think, no?
In other words, something along this line, perhaps?
<snip>
Yes. But you need something like this on top to actually set
CE_INTENT_TO_ADD
Yes, indeed. I wonder why your new test did not notice it, though
;-)
... and the answer turns out to be that it was not testing the right
thing. On top of that faulty version, this will fix it.
Your suggestion to move CE_INTENT_TO_ADD to mark-intent-to-add makes
sense but a caller needs to be adjusted to drop the duplicated flag
manipulation.
read-cache.c | 3 +--
t/t7102-reset.sh | 6 ++++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/read-cache.c b/read-cache.c
index 325d193..5b8102a 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -584,6 +584,7 @@ void mark_intent_to_add(struct cache_entry *ce)
unsigned char sha1[20];
if (write_sha1_file("", 0, blob_type, sha1))
die("cannot create an empty blob in the object database");
+ ce->ce_flags |= CE_INTENT_TO_ADD;
hashcpy(ce->sha1, sha1);
}
@@ -613,8 +614,6 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
ce->ce_namelen = namelen;
if (!intent_only)
fill_stat_cache_info(ce, st);
- else
- ce->ce_flags |= CE_INTENT_TO_ADD;
if (trust_executable_bit && has_symlinks)
ce->ce_mode = create_ce_mode(st_mode);
diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
index 642920a..bc0846f 100755
--- a/t/t7102-reset.sh
+++ b/t/t7102-reset.sh
@@ -539,6 +539,12 @@ test_expect_success 'reset -N keeps removed files as intent-to-add' '
echo new-file >new-file &&
git add new-file &&
git reset -N HEAD &&
+
+ tree=$(git write-tree) &&
+ git ls-tree $tree new-file >actual &&
+ >expect &&
+ test_cmp expect actual &&
+
git diff --name-only >actual &&
echo new-file >expect &&
test_cmp expect actual