1#ifndef PATHSPEC_H 2#define PATHSPEC_H 3 4/* Pathspec magic */ 5#define PATHSPEC_FROMTOP (1<<0) 6#define PATHSPEC_MAXDEPTH (1<<1) 7#define PATHSPEC_LITERAL (1<<2) 8#define PATHSPEC_GLOB (1<<3) 9#define PATHSPEC_ICASE (1<<4) 10#define PATHSPEC_EXCLUDE (1<<5) 11#define PATHSPEC_ALL_MAGIC \ 12 (PATHSPEC_FROMTOP | \ 13 PATHSPEC_MAXDEPTH | \ 14 PATHSPEC_LITERAL | \ 15 PATHSPEC_GLOB | \ 16 PATHSPEC_ICASE | \ 17 PATHSPEC_EXCLUDE) 18 19#define PATHSPEC_ONESTAR 1/* the pathspec pattern satisfies GFNM_ONESTAR */ 20 21struct pathspec { 22int nr; 23unsigned int has_wildcard:1; 24unsigned int recursive:1; 25unsigned magic; 26int max_depth; 27struct pathspec_item { 28char*match; 29char*original; 30unsigned magic; 31int len, prefix; 32int nowildcard_len; 33int flags; 34} *items; 35}; 36 37#define GUARD_PATHSPEC(ps, mask) \ 38 do { \ 39 if ((ps)->magic & ~(mask)) \ 40 die("BUG:%s:%d: unsupported magic%x", \ 41 __FILE__, __LINE__, (ps)->magic & ~(mask)); \ 42 } while (0) 43 44/* parse_pathspec flags */ 45#define PATHSPEC_PREFER_CWD (1<<0)/* No args means match cwd */ 46#define PATHSPEC_PREFER_FULL (1<<1)/* No args means match everything */ 47#define PATHSPEC_MAXDEPTH_VALID (1<<2)/* max_depth field is valid */ 48/* strip the trailing slash if the given path is a gitlink */ 49#define PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP (1<<3) 50/* die if a symlink is part of the given path's directory */ 51#define PATHSPEC_SYMLINK_LEADING_PATH (1<<4) 52/* 53 * This is like a combination of ..LEADING_PATH and .._SLASH_CHEAP 54 * (but not the same): it strips the trailing slash if the given path 55 * is a gitlink but also checks and dies if gitlink is part of the 56 * leading path (i.e. the given path goes beyond a submodule). It's 57 * safer than _SLASH_CHEAP and also more expensive. 58 */ 59#define PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE (1<<5) 60#define PATHSPEC_PREFIX_ORIGIN (1<<6) 61#define PATHSPEC_KEEP_ORDER (1<<7) 62/* 63 * For the callers that just need pure paths from somewhere else, not 64 * from command line. Global --*-pathspecs options are ignored. No 65 * magic is parsed in each pathspec either. If PATHSPEC_LITERAL is 66 * allowed, then it will automatically set for every pathspec. 67 */ 68#define PATHSPEC_LITERAL_PATH (1<<8) 69 70externvoidparse_pathspec(struct pathspec *pathspec, 71unsigned magic_mask, 72unsigned flags, 73const char*prefix, 74const char**args); 75externvoidcopy_pathspec(struct pathspec *dst,const struct pathspec *src); 76externvoidclear_pathspec(struct pathspec *); 77 78staticinlineintps_strncmp(const struct pathspec_item *item, 79const char*s1,const char*s2,size_t n) 80{ 81if(item->magic & PATHSPEC_ICASE) 82returnstrncasecmp(s1, s2, n); 83else 84returnstrncmp(s1, s2, n); 85} 86 87staticinlineintps_strcmp(const struct pathspec_item *item, 88const char*s1,const char*s2) 89{ 90if(item->magic & PATHSPEC_ICASE) 91returnstrcasecmp(s1, s2); 92else 93returnstrcmp(s1, s2); 94} 95 96externchar*find_pathspecs_matching_against_index(const struct pathspec *pathspec); 97externvoidadd_pathspec_matches_against_index(const struct pathspec *pathspec,char*seen); 98 99#endif/* PATHSPEC_H */