Skip to content

Commit

Permalink
Merge branch 'jk/checkout-from-tree'
Browse files Browse the repository at this point in the history
"git checkout $treeish $path", when $path in the index and the
working tree already matched what is in $treeish at the $path,
still overwrote the $path unnecessarily.

* jk/checkout-from-tree:
  checkout $tree: do not throw away unchanged index entries
  • Loading branch information
Junio C Hamano committed Dec 5, 2014
2 parents 09d60d7 + c5326bd commit c21df07
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
18 changes: 18 additions & 0 deletions builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
{
int len;
struct cache_entry *ce;
int pos;

if (S_ISDIR(mode))
return READ_TREE_RECURSIVE;
Expand All @@ -79,6 +80,23 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
ce->ce_flags = create_ce_flags(0) | CE_UPDATE;
ce->ce_namelen = len;
ce->ce_mode = create_ce_mode(mode);

/*
* If the entry is the same as the current index, we can leave the old
* entry in place. Whether it is UPTODATE or not, checkout_entry will
* do the right thing.
*/
pos = cache_name_pos(ce->name, ce->ce_namelen);
if (pos >= 0) {
struct cache_entry *old = active_cache[pos];
if (ce->ce_mode == old->ce_mode &&
!hashcmp(ce->sha1, old->sha1)) {
old->ce_flags |= CE_UPDATE;
free(ce);
return 0;
}
}

add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
return 0;
}
Expand Down
17 changes: 17 additions & 0 deletions t/t2022-checkout-paths.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,21 @@ test_expect_success 'do not touch unmerged entries matching $path but not in $tr
test_cmp expect.next0 actual.next0
'

test_expect_success 'do not touch files that are already up-to-date' '
git reset --hard &&
echo one >file1 &&
echo two >file2 &&
git add file1 file2 &&
git commit -m base &&
echo modified >file1 &&
test-chmtime =1000000000 file2 &&
git update-index -q --refresh &&
git checkout HEAD -- file1 file2 &&
echo one >expect &&
test_cmp expect file1 &&
echo "1000000000 file2" >expect &&
test-chmtime -v +0 file2 >actual &&
test_cmp expect actual
'

test_done

0 comments on commit c21df07

Please sign in to comment.