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)