unpack-trees.c: prepare for looking ahead in the index
authorJunio C Hamano <gitster@pobox.com>
Sun, 20 Sep 2009 00:50:04 +0000 (17:50 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 29 Sep 2009 17:06:47 +0000 (10:06 -0700)
commit137ec2b3f74aaf25c7ed7cceaea420d9dd2d5a51
tree5aeae3ffed586ba5a9a778713556954eb0dbceb8
parent5adde4cb0384bc9c24f07cdb9956b5b4148dd8b0
unpack-trees.c: prepare for looking ahead in the index

This prepares but does not yet implement a look-ahead in the index entries
when traverse-trees.c decides to give us tree entries in an order that
does not match what is in the index.

A case where a look-ahead in the index is necessary happens when merging
branch B into branch A while the index matches the current branch A, using
a tree O as their common ancestor, and these three trees looks like this:

   O        A       B
   t                t
   t-i      t-i     t-i
   t-j      t-j
            t/1
            t/2

The traverse_trees() function gets "t", "t-i" and "t" from trees O, A and
B first, and notices that A may have a matching "t" behind "t-i" and "t-j"
(indeed it does), and tells A to give that entry instead.  After unpacking
blob "t" from tree B (as it hasn't changed since O in B and A removed it,
it will result in its removal), it descends into directory "t/".

The side that walked index in parallel to the tree traversal used to be
implemented with one pointer, o->pos, that points at the next index entry
to be processed.  When this happens, the pointer o->pos still points at
"t-i" that is the first entry.  We should be able to skip "t-i" and "t-j"
and locate "t/1" from the index while the recursive invocation of
traverse_trees() walks and match entries found there, and later come back
to process "t-i".

While that look-ahead is not implemented yet, this adds a flag bit,
CE_UNPACKED, to mark the entries in the index that has already been
processed.  o->pos pointer has been renamed to o->cache_bottom and it
points at the first entry that may still need to be processed.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
diff-lib.c
unpack-trees.c
unpack-trees.h