per-directory-exclude: lazily read .gitignore files
authorJunio C Hamano <gitster@pobox.com>
Thu, 29 Nov 2007 10:17:44 +0000 (02:17 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 29 Nov 2007 10:19:14 +0000 (02:19 -0800)
commit63d285c8494d03a08600bb4453fcce077ecdd517
tree4c0d3d0e9ea9a5a420fbcbbd61249b109b387568
parent686a4a06b679a202430ca81267ad6505e92d839a
per-directory-exclude: lazily read .gitignore files

Operations that walk directories or trees, which potentially need to
consult the .gitignore files, used to always try to open the .gitignore
file every time they entered a new directory, even when they ended up
not needing to call excluded() function to see if a path in the
directory is ignored.  This was done by push/pop exclude_per_directory()
functions that managed the data in a stack.

This changes the directory walking API to remove the need to call these
two functions.  Instead, the directory walk data structure caches the
data used by excluded() function the last time, and lazily reuses it as
much as possible.  Among the data the last check used, the ones from
deeper directories that the path we are checking is outside are
discarded, data from the common leading directories are reused, and then
the directories between the common directory and the directory the path
being checked is in are checked for .gitignore file.  This is very
similar to the way gitattributes are handled.

This API change also fixes "ls-files -c -i", which called excluded()
without setting up the gitignore data via the old push/pop functions.

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