static enum path_treatment treat_path(struct dir_struct *dir, struct dirent *de, struct strbuf *path, int baselen, const struct path_simplify *simplify) { int dtype; if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git")) return path_ignored; strbuf_setlen(path, baselen); strbuf_addstr(path, de->d_name); if (simplify_away(path->buf, path->len, simplify)) return path_ignored; dtype = DTYPE(de); return treat_one_path(dir, path, simplify, dtype, de); }
static int treat_leading_path(struct dir_struct *dir, const char *path, int len, const struct path_simplify *simplify) { struct strbuf sb = STRBUF_INIT; int baselen, rc = 0; const char *cp; int old_flags = dir->flags; while (len && path[len - 1] == '/') len--; if (!len) return 1; baselen = 0; dir->flags &= ~DIR_SHOW_OTHER_DIRECTORIES; while (1) { cp = path + baselen + !!baselen; cp = memchr(cp, '/', path + len - cp); if (!cp) baselen = len; else baselen = cp - path; strbuf_setlen(&sb, 0); strbuf_add(&sb, path, baselen); if (!is_directory(sb.buf)) break; if (simplify_away(sb.buf, sb.len, simplify)) break; if (treat_one_path(dir, &sb, simplify, DT_DIR, NULL) == path_none) break; /* do not recurse into it */ if (len <= baselen) { rc = 1; break; /* finished checking */ } } strbuf_release(&sb); dir->flags = old_flags; return rc; }
static enum path_treatment treat_path(struct dir_struct *dir, struct dirent *de, char *path, int path_max, int baselen, const struct path_simplify *simplify, int *len) { int dtype; if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git")) return path_ignored; *len = strlen(de->d_name); /* Ignore overly long pathnames! */ if (*len + baselen + 8 > path_max) return path_ignored; memcpy(path + baselen, de->d_name, *len + 1); *len += baselen; if (simplify_away(path, *len, simplify)) return path_ignored; dtype = DTYPE(de); return treat_one_path(dir, path, len, simplify, dtype, de); }