checkout $tree: do not throw away unchanged index entries
commitc5326bd62b7e168ba1339dacb7ee812d0fe98c7c
authorJeff King <peff@peff.net>
Thu, 13 Nov 2014 18:30:34 +0000 (13 13:30 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 Nov 2014 22:35:41 +0000 (13 14:35 -0800)
treec2eff6145f8367208cd648a6b19dcdcaee459e0d
parenteeff891ac756fd97a05476446f15269b714ce4cc
checkout $tree: do not throw away unchanged index entries

When we "git checkout $tree", we pull paths from $tree into
the index, and then check the resulting entries out to the
worktree. Our method for the first step is rather
heavy-handed, though; it clobbers the entire existing index
entry, even if the content is the same. This means we lose
our stat information, leading checkout_entry to later
rewrite the entire file with identical content.

Instead, let's see if we have the identical entry already in
the index, in which case we leave it in place. That lets
checkout_entry do the right thing. Our tests cover two
interesting cases:

  1. We make sure that a file which has no changes is not
     rewritten.

  2. We make sure that we do update a file that is unchanged
     in the index (versus $tree), but has working tree
     changes. We keep the old index entry, and
     checkout_entry is able to realize that our stat
     information is out of date.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/checkout.c
t/t2022-checkout-paths.sh