Junio C Hamano <gitster@xxxxxxxxx> writes: > Duy Nguyen <pclouds@xxxxxxxxx> writes: > >> On Tue, Feb 04, 2014 at 02:25:25PM -0800, Junio C Hamano wrote: >>> Junio C Hamano <gitster@xxxxxxxxx> writes: >>> >>> > 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html