static int filename_ignore_search(const ignores *ig, const char *filename) { size_t i; int match_pos; if (strncmp(filename, "./", 2) == 0) { filename += 2; } match_pos = binary_search(filename, ig->names, 0, ig->names_len); if (match_pos >= 0) { log_debug("file %s ignored because name matches static pattern %s", filename, ig->names[match_pos]); return 1; } if (ackmate_dir_match(filename)) { log_debug("file %s ignored because name matches ackmate regex", filename); return 1; } for (i = 0; i < ig->regexes_len; i++) { if (fnmatch(ig->regexes[i], filename, fnmatch_flags) == 0) { log_debug("file %s ignored because name matches regex pattern %s", filename, ig->regexes[i]); return 1; } log_debug("pattern %s doesn't match file %s", ig->regexes[i], filename); } log_debug("file %s not ignored", filename); return 0; }
static int path_ignore_search(const ignores *ig, const char *path, const char *filename) { char *temp; size_t i; int match_pos; if (strncmp(filename, "./", 2) == 0) { filename++; } match_pos = binary_search(filename, ig->names, 0, ig->names_len); if (match_pos >= 0) { log_debug("file %s ignored because name matches static pattern %s", filename, ig->names[match_pos]); return 1; } ag_asprintf(&temp, "%s/%s", path[0] == '.' ? path + 1 : path, filename); log_debug("temp: %s abs path: %s", temp, ig->abs_path); if (strncmp(temp, ig->abs_path, ig->abs_path_len) == 0) { char *slash_filename = temp + ig->abs_path_len; if (slash_filename[0] == '/') { slash_filename++; } match_pos = binary_search(slash_filename, ig->names, 0, ig->names_len); if (match_pos >= 0) { log_debug("file %s ignored because name matches static pattern %s", temp, ig->names[match_pos]); free(temp); return 1; } match_pos = binary_search(slash_filename, ig->slash_names, 0, ig->slash_names_len); if (match_pos >= 0) { log_debug("file %s ignored because name matches slash static pattern %s", slash_filename, ig->slash_names[match_pos]); free(temp); return 1; } for (i = 0; i < ig->names_len; i++) { char *pos = strstr(slash_filename, ig->names[i]); if (pos == slash_filename || (pos && *(pos - 1) == '/')) { pos += strlen(ig->names[i]); if (*pos == '\0' || *pos == '/') { log_debug("file %s ignored because path somewhere matches name %s", slash_filename, ig->names[i]); free(temp); return 1; } } log_debug("pattern %s doesn't match path %s", ig->names[i], slash_filename); } for (i = 0; i < ig->slash_regexes_len; i++) { if (fnmatch(ig->slash_regexes[i], slash_filename, fnmatch_flags) == 0) { log_debug("file %s ignored because name matches slash regex pattern %s", slash_filename, ig->slash_regexes[i]); free(temp); return 1; } log_debug("pattern %s doesn't match slash file %s", ig->slash_regexes[i], slash_filename); } } for (i = 0; i < ig->regexes_len; i++) { if (fnmatch(ig->regexes[i], filename, fnmatch_flags) == 0) { log_debug("file %s ignored because name matches regex pattern %s", filename, ig->regexes[i]); free(temp); return 1; } log_debug("pattern %s doesn't match file %s", ig->regexes[i], filename); } log_debug("file %s not ignored", filename); int rv = ackmate_dir_match(temp); free(temp); return rv; }