int path_ignore_search(const ignores *ig, const char *path, const char *filename) { char *temp; if (filename_ignore_search(ig, filename)) { return 1; } ag_asprintf(&temp, "%s/%s", path, filename); int rv = filename_ignore_search(ig, temp); free(temp); return rv; }
/* This function is REALLY HOT. It gets called for every file */ int filename_filter(const char *path, const struct dirent *dir, void *baton) { const char *filename = dir->d_name; size_t i; ignores *ig = (ignores*) baton; if (!opts.follow_symlinks && is_symlink(path, dir)) { log_debug("File %s ignored becaused it's a symlink", dir->d_name); return 0; } for (i = 0; evil_hardcoded_ignore_files[i] != NULL; i++) { if (strcmp(filename, evil_hardcoded_ignore_files[i]) == 0) { return 0; } } if (!opts.search_hidden_files && filename[0] == '.') { return 0; } if (opts.search_all_files && !opts.path_to_agignore) { return 1; } if (filename_ignore_search(ig, filename)) { return 0; } if (is_directory(path, dir) && filename[strlen(filename) - 1] != '/') { char *temp; asprintf(&temp, "%s/", filename); int rv = filename_ignore_search(ig, temp); free(temp); if (rv) { return 0; } } if (ig->parent != NULL) { return filename_filter(path, dir, (void *)(ig->parent)); } return 1; }
static int path_ignore_search(const ignores *ig, const char *path, const char *filename, int level) { char *temp, *index; int rv = 0; ag_asprintf(&temp, "%s/%s", path, filename); if ('/' == temp[strlen(temp) - 1]) level++; for (index = temp + strlen(temp) - 1, level++; level > 0 && (!rv); index--) { if ('/' == *index) { rv = filename_ignore_search(ig, index + 1); if (! --level) { /* Cater for .gitignore patterns beginning with a slash */ rv += filename_ignore_search(ig, index); } } } free(temp); return rv; }