]> git.ipfire.org Git - thirdparty/git.git/commit - t/t2203-add-intent.sh
cache-tree.c: fix i-t-a entry skipping directory updates sometimes
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 16 Jul 2016 05:06:26 +0000 (07:06 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 18 Jul 2016 20:45:33 +0000 (13:45 -0700)
commitc041d54a741e516b5a743f4d27532e484f2a05d3
tree6f86a537b33189866f86b83b0c4d33c3465a7bad
parent378932d3c3214cf658805af20c4bd101922d8fcd
cache-tree.c: fix i-t-a entry skipping directory updates sometimes

Commit 3cf773e (cache-tree: fix writing cache-tree when CE_REMOVE is
present - 2012-12-16) skips i-t-a entries when building trees objects
from the index. Unfortunately it may skip too much.

The code in question checks if an entry is an i-t-a one, then no tree
entry will be written. But it does not take into account that
directories can also be written with the same code. Suppose we have
this in the index.

    a-file
    subdir/file1
    subdir/file2
    subdir/file3
    the-last-file

We write an entry for a-file as normal and move on to subdir/file1,
where we realize the entry name for this level is simply just
"subdir", write down an entry for "subdir" then jump three items ahead
to the-last-file.

That is what happens normally when the first file in subdir is not an
i-t-a entry. If subdir/file1 is an i-t-a, because of the broken
condition in this code, we still think "subdir" is an i-t-a file and
not writing "subdir" down and jump to the-last-file. The result tree
now only has two items: a-file and the-last-file. subdir should be
there too (even though it only records two sub-entries, file2 and
file3).

If the i-t-a entry is subdir/file2 or subdir/file3, this is not a
problem because we jump over them anyway. Which may explain why the
bug is hidden for nearly four years.

Fix it by making sure we only skip i-t-a entries when the entry in
question is actual an index entry, not a directory.

Reported-by: Yuri Kanivetsky <yuri.kanivetsky@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache-tree.c
t/t2203-add-intent.sh