unpack-trees: move all skip-worktree checks back to unpack_trees()
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 27 Nov 2010 06:24:04 +0000 (13:24 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Nov 2010 21:35:12 +0000 (13:35 -0800)
commit2431afbf1b3b986245242218b909cd9f055ba65b
tree65b1386a9e0299385fa9db0af3865788f82bf420
parent0fd0e2417d383168b6a510f78c754298435a89ce
unpack-trees: move all skip-worktree checks back to unpack_trees()

Earlier, the will_have_skip_worktree() checks are done in various
places, which makes it hard to traverse the index tree-alike, required
by excluded_from_list(). This patch moves all the checks into two
loops in unpack_trees().

Entries in index in this operation can be classified into two
groups: ones already in index before unpack_trees() is called and ones
added to index after traverse_trees() is called.

In both groups, before checking file status on worktree, the future
skip-worktree bit must be checked, so that if an entry will be outside
worktree, worktree should not be checked.

For the first group, the future skip-worktree bit is precomputed and
stored as CE_NEW_SKIP_WORKTREE in the first loop before
traverse_trees() is called so that *way_merge() function does not need
to compute it again.

For the second group, because we don't know what entries will be in
this group until traverse_trees() finishes, operations that need
future skip-worktree check is delayed until CE_NEW_SKIP_WORKTREE is
computed in the second loop. CE_ADDED is used to mark entries in the
second group.

CE_ADDED and CE_NEW_SKIP_WORKTREE are temporary flags used in
unpack_trees().  CE_ADDED is only used by add_to_index(), which should
not be called while unpack_trees() is running.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
unpack-trees.c