Junio C Hamano <gits...@pobox.com> writes:

> John Keeping <j...@keeping.me.uk> writes:
>
>> On Fri, Jul 11, 2014 at 09:44:33PM -0700, David Turner wrote:
>>> When git checkout checks out a branch, create or update the
>>> cache-tree so that subsequent operations are faster.
>>> 
>>> update_main_cache_tree learned a new flag, WRITE_TREE_REPAIR.  When
>>> WRITE_TREE_REPAIR is set, portions of the cache-tree which do not
>>> correspond to existing tree objects are invalidated (and portions which
>>> do are marked as valid).  No new tree objects are created.
>>> 
>>> Signed-off-by: David Turner <dtur...@twitter.com>
>>> ---
>>
>> This causes an incorrect error message to be printed when switching
>> branches with staged changes in a subdirectory.  The test case is pretty
>> simple:
>>
>>      git init test &&
>>      cd test &&
>>      mkdir sub &&
>>      echo one >sub/one &&
>>      git add sub/one &&
>>      git commit -m one &&
>>      echo two >sub/two &&
>>      git add sub/two &&
>>      git checkout -b test
>>
>> After this commit the output is:
>>
>>      error: invalid object 040000 0000000000000000000000000000000000000000 
>> for 'bar'
>>      A       bar/quux
>>      Switched to branch 'test'
>>
>> but the "error:" line should not be there.
>
> Yeah, this seems to be broken and I am unhappy that I didn't notice
> it myself as I always use a version that is somewhat ahead of 'next'
> myself.

Perhaps like this, to make sure that we do not throw a garbage
object name into the cache tree when we avoid creating an unwanted
tree object?

All the tests added by the series seems to pass, so I am assuming
that this will not break the "repair" codepath when it should kick
in.

We may want to add your test to t0090 as well.

 cache-tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cache-tree.c b/cache-tree.c
index f951d7d..e3baf42 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -398,7 +398,7 @@ static int update_one(struct cache_tree *it,
                it->entry_count, it->subtree_nr,
                sha1_to_hex(it->sha1));
 #endif
-       return i;
+       return to_invalidate ? -1 : i;
 }
 
 int cache_tree_update(struct cache_tree *it,
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to