directory listing API
=====================

The directory listing API is used to enumerate paths in the work tree,
optionally taking `.git/info/exclude` and `.gitignore` files per
directory into account.

Data structure
--------------

`struct dir_struct` structure is used to pass directory traversal
options to the library and to record the paths discovered.  A single
`struct dir_struct` is used regardless of whether or not the traversal
recursively descends into subdirectories.

The notable options are:

`exclude_per_dir`::

	The name of the file to be read in each directory for excluded
	files (typically `.gitignore`).

`flags`::

	A bit-field of options:

`DIR_SHOW_IGNORED`:::

	Return just ignored files in `entries[]`, not untracked
	files. This flag is mutually exclusive with
	`DIR_SHOW_IGNORED_TOO`.

`DIR_SHOW_IGNORED_TOO`:::

	Similar to `DIR_SHOW_IGNORED`, but return ignored files in
	`ignored[]` in addition to untracked files in
	`entries[]`. This flag is mutually exclusive with
	`DIR_SHOW_IGNORED`.

`DIR_KEEP_UNTRACKED_CONTENTS`:::

	Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if this is set, the
	untracked contents of untracked directories are also returned in
	`entries[]`.

`DIR_SHOW_IGNORED_TOO_MODE_MATCHING`:::

	Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if
	this is set, returns ignored files and directories that match
	an exclude pattern. If a directory matches an exclude pattern,
	then the directory is returned and the contained paths are
	not. A directory that does not match an exclude pattern will
	not be returned even if all of its contents are ignored. In
	this case, the contents are returned as individual entries.
+
If this is set, files and directories that explicitly match an ignore
pattern are reported. Implicity ignored directories (directories that
do not match an ignore pattern, but whose contents are all ignored)
are not reported, instead all of the contents are reported.

`DIR_COLLECT_IGNORED`:::

	Special mode for git-add. Return ignored files in `ignored[]` and
	untracked files in `entries[]`. Only returns ignored files that match
	pathspec exactly (no wildcards). Does not recurse into ignored
	directories.

`DIR_SHOW_OTHER_DIRECTORIES`:::

	Include a directory that is not tracked.

`DIR_HIDE_EMPTY_DIRECTORIES`:::

	Do not include a directory that is not tracked and is empty.

`DIR_NO_GITLINKS`:::

	If set, recurse into a directory that looks like a Git
	directory.  Otherwise it is shown as a directory.

The result of the enumeration is left in these fields:

`entries[]`::

	An array of `struct dir_entry`, each element of which describes
	a path.

`nr`::

	The number of members in `entries[]` array.

`alloc`::

	Internal use; keeps track of allocation of `entries[]` array.

`ignored[]`::

	An array of `struct dir_entry`, used for ignored paths with the
	`DIR_SHOW_IGNORED_TOO` and `DIR_COLLECT_IGNORED` flags.

`ignored_nr`::

	The number of members in `ignored[]` array.

Calling sequence
----------------

Note: index may be looked at for .gitignore files that are CE_SKIP_WORKTREE
marked. If you to exclude files, make sure you have loaded index first.

* Prepare `struct dir_struct dir` and clear it with `memset(&dir, 0,
  sizeof(dir))`.

* To add single exclude pattern, call `add_exclude_list()` and then
  `add_exclude()`.

* To add patterns from a file (e.g. `.git/info/exclude`), call
  `add_excludes_from_file()` , and/or set `dir.exclude_per_dir`.  A
  short-hand function `setup_standard_excludes()` can be used to set
  up the standard set of exclude settings.

* Set options described in the Data Structure section above.

* Call `read_directory()`.

* Use `dir.entries[]`.

* Call `clear_directory()` when none of the contained elements are no longer in use.

(JC)
