Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 1 | #ifndef DIR_H |
| 2 | #define DIR_H |
| 3 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 4 | /* See Documentation/technical/api-directory-listing.txt */ |
| 5 | |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 6 | #include "strbuf.h" |
| 7 | |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 8 | struct dir_entry { |
Jeff King | e96980e | 2007-06-12 23:42:14 +0200 | [diff] [blame] | 9 | unsigned int len; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 10 | char name[FLEX_ARRAY]; /* more */ |
| 11 | }; |
| 12 | |
Lars Knoll | 68492fc | 2007-10-28 21:27:13 +0100 | [diff] [blame] | 13 | #define EXC_FLAG_NODIR 1 |
Lars Knoll | 68492fc | 2007-10-28 21:27:13 +0100 | [diff] [blame] | 14 | #define EXC_FLAG_ENDSWITH 4 |
Junio C Hamano | d6b8fc3 | 2008-01-31 01:17:48 -0800 | [diff] [blame] | 15 | #define EXC_FLAG_MUSTBEDIR 8 |
Nguyễn Thái Ngọc Duy | 84460ee | 2012-10-15 13:24:38 +0700 | [diff] [blame] | 16 | #define EXC_FLAG_NEGATIVE 16 |
Lars Knoll | 68492fc | 2007-10-28 21:27:13 +0100 | [diff] [blame] | 17 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 18 | /* |
| 19 | * Each .gitignore file will be parsed into patterns which are then |
| 20 | * appended to the relevant exclude_list (either EXC_DIRS or |
| 21 | * EXC_FILE). exclude_lists are also used to represent the list of |
| 22 | * --exclude values passed via CLI args (EXC_CMDL). |
| 23 | */ |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 24 | struct exclude_list { |
| 25 | int nr; |
| 26 | int alloc; |
| 27 | struct exclude { |
| 28 | const char *pattern; |
Lars Knoll | 68492fc | 2007-10-28 21:27:13 +0100 | [diff] [blame] | 29 | int patternlen; |
Nguyễn Thái Ngọc Duy | f9f6e2c | 2012-06-07 14:53:36 +0700 | [diff] [blame] | 30 | int nowildcardlen; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 31 | const char *base; |
| 32 | int baselen; |
Lars Knoll | 68492fc | 2007-10-28 21:27:13 +0100 | [diff] [blame] | 33 | int flags; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 34 | } **excludes; |
| 35 | }; |
| 36 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 37 | /* |
| 38 | * The contents of the per-directory exclude files are lazily read on |
| 39 | * demand and then cached in memory, one per exclude_stack struct, in |
| 40 | * order to avoid opening and parsing each one every time that |
| 41 | * directory is traversed. |
| 42 | */ |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 43 | struct exclude_stack { |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 44 | struct exclude_stack *prev; /* the struct exclude_stack for the parent directory */ |
| 45 | char *filebuf; /* remember pointer to per-directory exclude file contents so we can free() */ |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 46 | int baselen; |
| 47 | int exclude_ix; |
| 48 | }; |
| 49 | |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 50 | struct dir_struct { |
| 51 | int nr, alloc; |
Jeff King | 2abd31b | 2007-06-11 09:39:50 -0400 | [diff] [blame] | 52 | int ignored_nr, ignored_alloc; |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 53 | enum { |
| 54 | DIR_SHOW_IGNORED = 1<<0, |
| 55 | DIR_SHOW_OTHER_DIRECTORIES = 1<<1, |
| 56 | DIR_HIDE_EMPTY_DIRECTORIES = 1<<2, |
| 57 | DIR_NO_GITLINKS = 1<<3, |
| 58 | DIR_COLLECT_IGNORED = 1<<4 |
| 59 | } flags; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 60 | struct dir_entry **entries; |
Jeff King | 2abd31b | 2007-06-11 09:39:50 -0400 | [diff] [blame] | 61 | struct dir_entry **ignored; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 62 | |
| 63 | /* Exclude info */ |
| 64 | const char *exclude_per_dir; |
| 65 | struct exclude_list exclude_list[3]; |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 66 | /* |
| 67 | * We maintain three exclude pattern lists: |
| 68 | * EXC_CMDL lists patterns explicitly given on the command line. |
| 69 | * EXC_DIRS lists patterns obtained from per-directory ignore files. |
| 70 | * EXC_FILE lists patterns from fallback ignore files. |
| 71 | */ |
| 72 | #define EXC_CMDL 0 |
| 73 | #define EXC_DIRS 1 |
| 74 | #define EXC_FILE 2 |
| 75 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 76 | /* |
| 77 | * Temporary variables which are used during loading of the |
| 78 | * per-directory exclude lists. |
| 79 | * |
| 80 | * exclude_stack points to the top of the exclude_stack, and |
| 81 | * basebuf contains the full path to the current |
| 82 | * (sub)directory in the traversal. |
| 83 | */ |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 84 | struct exclude_stack *exclude_stack; |
| 85 | char basebuf[PATH_MAX]; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 86 | }; |
| 87 | |
Junio C Hamano | e813d50 | 2006-12-25 03:09:52 -0800 | [diff] [blame] | 88 | #define MATCHED_RECURSIVELY 1 |
| 89 | #define MATCHED_FNMATCH 2 |
| 90 | #define MATCHED_EXACTLY 3 |
Clemens Buchacher | f950eb9 | 2011-09-04 12:42:01 +0200 | [diff] [blame] | 91 | extern char *common_prefix(const char **pathspec); |
Linus Torvalds | 3c6a370 | 2006-05-19 16:07:51 -0700 | [diff] [blame] | 92 | extern int match_pathspec(const char **pathspec, const char *name, int namelen, int prefix, char *seen); |
Nguyễn Thái Ngọc Duy | 61cf282 | 2010-12-15 22:02:48 +0700 | [diff] [blame] | 93 | extern int match_pathspec_depth(const struct pathspec *pathspec, |
| 94 | const char *name, int namelen, |
| 95 | int prefix, char *seen); |
Nguyễn Thái Ngọc Duy | bc96cc8 | 2010-12-15 22:02:44 +0700 | [diff] [blame] | 96 | extern int within_depth(const char *name, int namelen, int depth, int max_depth); |
Linus Torvalds | 3c6a370 | 2006-05-19 16:07:51 -0700 | [diff] [blame] | 97 | |
Linus Torvalds | 1d8842d | 2009-05-14 13:22:36 -0700 | [diff] [blame] | 98 | extern int fill_directory(struct dir_struct *dir, const char **pathspec); |
Linus Torvalds | dba2e20 | 2009-07-08 19:24:39 -0700 | [diff] [blame] | 99 | extern int read_directory(struct dir_struct *, const char *path, int len, const char **pathspec); |
Junio C Hamano | f8a9d42 | 2006-12-04 16:00:46 -0800 | [diff] [blame] | 100 | |
Adam Spiers | 0795805 | 2012-12-27 02:32:24 +0000 | [diff] [blame] | 101 | extern int is_excluded_from_list(const char *pathname, int pathlen, const char *basename, |
| 102 | int *dtype, struct exclude_list *el); |
Jens Lehmann | 108da0d | 2010-07-10 00:18:38 +0200 | [diff] [blame] | 103 | struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len); |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 104 | |
| 105 | /* |
Nguyễn Thái Ngọc Duy | 82dce99 | 2012-10-15 13:24:39 +0700 | [diff] [blame] | 106 | * these implement the matching logic for dir.c:excluded_from_list and |
| 107 | * attr.c:path_matches() |
| 108 | */ |
| 109 | extern int match_basename(const char *, int, |
| 110 | const char *, int, int, int); |
| 111 | extern int match_pathname(const char *, int, |
| 112 | const char *, int, |
| 113 | const char *, int, int, int); |
| 114 | |
| 115 | /* |
Adam Spiers | 6d24e7a | 2012-12-27 02:32:25 +0000 | [diff] [blame] | 116 | * The is_excluded() API is meant for callers that check each level of leading |
| 117 | * directory hierarchies with is_excluded() to avoid recursing into excluded |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 118 | * directories. Callers that do not do so should use this API instead. |
| 119 | */ |
| 120 | struct path_exclude_check { |
| 121 | struct dir_struct *dir; |
Adam Spiers | a35341a | 2012-12-27 02:32:28 +0000 | [diff] [blame] | 122 | struct exclude *exclude; |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 123 | struct strbuf path; |
| 124 | }; |
| 125 | extern void path_exclude_check_init(struct path_exclude_check *, struct dir_struct *); |
| 126 | extern void path_exclude_check_clear(struct path_exclude_check *); |
Adam Spiers | a35341a | 2012-12-27 02:32:28 +0000 | [diff] [blame] | 127 | extern struct exclude *last_exclude_matching_path(struct path_exclude_check *, const char *, |
| 128 | int namelen, int *dtype); |
Adam Spiers | 9013089 | 2012-12-27 02:32:23 +0000 | [diff] [blame] | 129 | extern int is_path_excluded(struct path_exclude_check *, const char *, int namelen, int *dtype); |
Junio C Hamano | 782cd4c | 2012-06-05 21:17:52 -0700 | [diff] [blame] | 130 | |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 131 | |
Nguyễn Thái Ngọc Duy | cb09753 | 2009-08-20 20:47:04 +0700 | [diff] [blame] | 132 | extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, |
Adam Spiers | 840fc33 | 2012-12-27 02:32:22 +0000 | [diff] [blame] | 133 | char **buf_p, struct exclude_list *el, int check_index); |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 134 | extern void add_excludes_from_file(struct dir_struct *, const char *fname); |
Nguyễn Thái Ngọc Duy | 82dce99 | 2012-10-15 13:24:39 +0700 | [diff] [blame] | 135 | extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen); |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 136 | extern void add_exclude(const char *string, const char *base, |
Adam Spiers | 840fc33 | 2012-12-27 02:32:22 +0000 | [diff] [blame] | 137 | int baselen, struct exclude_list *el); |
Adam Spiers | f619881 | 2012-12-27 02:32:29 +0000 | [diff] [blame] | 138 | extern void clear_exclude_list(struct exclude_list *el); |
Jeff King | c91f0d9 | 2006-09-08 04:05:34 -0400 | [diff] [blame] | 139 | extern int file_exists(const char *); |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 140 | |
Johannes Schindelin | e663674 | 2007-08-01 01:29:17 +0100 | [diff] [blame] | 141 | extern int is_inside_dir(const char *dir); |
Nguyễn Thái Ngọc Duy | 9b125da | 2011-03-26 16:04:24 +0700 | [diff] [blame] | 142 | extern int dir_inside_of(const char *subdir, const char *dir); |
Johannes Schindelin | e663674 | 2007-08-01 01:29:17 +0100 | [diff] [blame] | 143 | |
Alexander Potashev | 8ca12c0 | 2009-01-10 15:07:50 +0300 | [diff] [blame] | 144 | static inline int is_dot_or_dotdot(const char *name) |
| 145 | { |
| 146 | return (name[0] == '.' && |
| 147 | (name[1] == '\0' || |
| 148 | (name[1] == '.' && name[2] == '\0'))); |
| 149 | } |
| 150 | |
Alexander Potashev | 55892d2 | 2009-01-11 15:19:12 +0300 | [diff] [blame] | 151 | extern int is_empty_dir(const char *dir); |
| 152 | |
Junio C Hamano | 039bc64 | 2007-11-14 00:05:00 -0800 | [diff] [blame] | 153 | extern void setup_standard_excludes(struct dir_struct *dir); |
Junio C Hamano | a0f4afb | 2009-06-30 15:33:45 -0700 | [diff] [blame] | 154 | |
| 155 | #define REMOVE_DIR_EMPTY_ONLY 01 |
| 156 | #define REMOVE_DIR_KEEP_NESTED_GIT 02 |
Junio C Hamano | c844a80 | 2012-03-15 15:58:54 +0100 | [diff] [blame] | 157 | #define REMOVE_DIR_KEEP_TOPLEVEL 04 |
Junio C Hamano | a0f4afb | 2009-06-30 15:33:45 -0700 | [diff] [blame] | 158 | extern int remove_dir_recursively(struct strbuf *path, int flag); |
Johannes Schindelin | 7155b72 | 2007-09-28 16:28:54 +0100 | [diff] [blame] | 159 | |
Alex Riesen | 4a92d1b | 2008-09-27 00:56:46 +0200 | [diff] [blame] | 160 | /* tries to remove the path with empty directories along it, ignores ENOENT */ |
| 161 | extern int remove_path(const char *path); |
| 162 | |
Joshua Jensen | 8cf2a84 | 2010-10-03 09:56:41 +0000 | [diff] [blame] | 163 | extern int strcmp_icase(const char *a, const char *b); |
| 164 | extern int strncmp_icase(const char *a, const char *b, size_t count); |
| 165 | extern int fnmatch_icase(const char *pattern, const char *string, int flags); |
| 166 | |
Nguyễn Thái Ngọc Duy | 5d74762 | 2012-11-24 11:33:49 +0700 | [diff] [blame] | 167 | /* |
| 168 | * The prefix part of pattern must not contains wildcards. |
| 169 | */ |
| 170 | #define GFNM_PATHNAME 1 /* similar to FNM_PATHNAME */ |
Nguyễn Thái Ngọc Duy | 8c6abbc | 2012-11-24 11:33:50 +0700 | [diff] [blame] | 171 | #define GFNM_ONESTAR 2 /* there is only _one_ wildcard, a star */ |
Nguyễn Thái Ngọc Duy | 5d74762 | 2012-11-24 11:33:49 +0700 | [diff] [blame] | 172 | |
| 173 | extern int git_fnmatch(const char *pattern, const char *string, |
| 174 | int flags, int prefix); |
| 175 | |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 176 | #endif |