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 withDIR_SHOW_IGNORED_TOO
. -
DIR_SHOW_IGNORED_TOO
-
Similar to
DIR_SHOW_IGNORED
, but return ignored files inignored[]
in addition to untracked files inentries[]
. This flag is mutually exclusive withDIR_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 inentries[]
. -
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. Implicitly 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 inentries[]
. 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 theDIR_SHOW_IGNORED_TOO
andDIR_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 withmemset(&dir, 0, sizeof(dir))
. -
To add single exclude pattern, call
add_exclude_list()
and thenadd_exclude()
. -
To add patterns from a file (e.g.
.git/info/exclude
), calladd_excludes_from_file()
, and/or setdir.exclude_per_dir
. A short-hand functionsetup_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)