dir.c: refactor is_excluded()
In a similar way to the previous commit, this extracts a new helper function last_exclude_matching() which returns the last exclude_list element which matched, or NULL if no match was found. is_excluded() becomes a wrapper around this, and just returns 0 or 1 depending on whether any matching exclude_list element was found. This allows callers to find out _why_ a given path was excluded, rather than just whether it was or not, paving the way for a new git sub-command which allows users to test their exclude lists from the command line. Signed-off-by: Adam Spiers <git@adamspiers.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
578cd7c3ea
commit
f4cd69a674
38
dir.c
38
dir.c
@ -664,24 +664,44 @@ int is_excluded_from_list(const char *pathname,
|
|||||||
return -1; /* undecided */
|
return -1; /* undecided */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_excluded(struct dir_struct *dir, const char *pathname, int *dtype_p)
|
/*
|
||||||
|
* Loads the exclude lists for the directory containing pathname, then
|
||||||
|
* scans all exclude lists to determine whether pathname is excluded.
|
||||||
|
* Returns the exclude_list element which matched, or NULL for
|
||||||
|
* undecided.
|
||||||
|
*/
|
||||||
|
static struct exclude *last_exclude_matching(struct dir_struct *dir,
|
||||||
|
const char *pathname,
|
||||||
|
int *dtype_p)
|
||||||
{
|
{
|
||||||
int pathlen = strlen(pathname);
|
int pathlen = strlen(pathname);
|
||||||
int st;
|
int st;
|
||||||
|
struct exclude *exclude;
|
||||||
const char *basename = strrchr(pathname, '/');
|
const char *basename = strrchr(pathname, '/');
|
||||||
basename = (basename) ? basename+1 : pathname;
|
basename = (basename) ? basename+1 : pathname;
|
||||||
|
|
||||||
prep_exclude(dir, pathname, basename-pathname);
|
prep_exclude(dir, pathname, basename-pathname);
|
||||||
for (st = EXC_CMDL; st <= EXC_FILE; st++) {
|
for (st = EXC_CMDL; st <= EXC_FILE; st++) {
|
||||||
switch (is_excluded_from_list(pathname, pathlen,
|
exclude = last_exclude_matching_from_list(
|
||||||
basename, dtype_p,
|
pathname, pathlen, basename, dtype_p,
|
||||||
&dir->exclude_list[st])) {
|
&dir->exclude_list[st]);
|
||||||
case 0:
|
if (exclude)
|
||||||
return 0;
|
return exclude;
|
||||||
case 1:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Loads the exclude lists for the directory containing pathname, then
|
||||||
|
* scans all exclude lists to determine whether pathname is excluded.
|
||||||
|
* Returns 1 if true, otherwise 0.
|
||||||
|
*/
|
||||||
|
static int is_excluded(struct dir_struct *dir, const char *pathname, int *dtype_p)
|
||||||
|
{
|
||||||
|
struct exclude *exclude =
|
||||||
|
last_exclude_matching(dir, pathname, dtype_p);
|
||||||
|
if (exclude)
|
||||||
|
return exclude->flags & EXC_FLAG_NEGATIVE ? 0 : 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user