convert common_prefix() to use struct pathspec
The code now takes advantage of nowildcard_len field. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3efe8e4381
commit
827f4d6c21
@ -199,7 +199,7 @@ static int list_paths(struct string_list *list, const char *with_tree,
|
||||
m = xcalloc(1, pattern->nr);
|
||||
|
||||
if (with_tree) {
|
||||
char *max_prefix = common_prefix(pattern->raw);
|
||||
char *max_prefix = common_prefix(pattern);
|
||||
overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
|
||||
free(max_prefix);
|
||||
}
|
||||
|
@ -546,7 +546,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
|
||||
prefix, argv);
|
||||
|
||||
/* Find common prefix for all pathspec's */
|
||||
max_prefix = common_prefix(pathspec.raw);
|
||||
max_prefix = common_prefix(&pathspec);
|
||||
max_prefix_len = max_prefix ? strlen(max_prefix) : 0;
|
||||
|
||||
/* Treat unmatching pathspec elements as errors */
|
||||
|
29
dir.c
29
dir.c
@ -103,26 +103,25 @@ static int fnmatch_icase_mem(const char *pattern, int patternlen,
|
||||
return match_status;
|
||||
}
|
||||
|
||||
static size_t common_prefix_len(const char **pathspec)
|
||||
static size_t common_prefix_len(const struct pathspec *pathspec)
|
||||
{
|
||||
const char *n, *first;
|
||||
int n;
|
||||
size_t max = 0;
|
||||
int literal = limit_pathspec_to_literal();
|
||||
|
||||
if (!pathspec)
|
||||
return max;
|
||||
GUARD_PATHSPEC(pathspec, PATHSPEC_FROMTOP | PATHSPEC_MAXDEPTH);
|
||||
|
||||
first = *pathspec;
|
||||
while ((n = *pathspec++)) {
|
||||
size_t i, len = 0;
|
||||
for (i = 0; first == n || i < max; i++) {
|
||||
char c = n[i];
|
||||
if (!c || c != first[i] || (!literal && is_glob_special(c)))
|
||||
for (n = 0; n < pathspec->nr; n++) {
|
||||
size_t i = 0, len = 0;
|
||||
while (i < pathspec->items[n].nowildcard_len &&
|
||||
(n == 0 || i < max)) {
|
||||
char c = pathspec->items[n].match[i];
|
||||
if (c != pathspec->items[0].match[i])
|
||||
break;
|
||||
if (c == '/')
|
||||
len = i + 1;
|
||||
i++;
|
||||
}
|
||||
if (first == n || len < max) {
|
||||
if (n == 0 || len < max) {
|
||||
max = len;
|
||||
if (!max)
|
||||
break;
|
||||
@ -135,11 +134,11 @@ static size_t common_prefix_len(const char **pathspec)
|
||||
* Returns a copy of the longest leading path common among all
|
||||
* pathspecs.
|
||||
*/
|
||||
char *common_prefix(const char **pathspec)
|
||||
char *common_prefix(const struct pathspec *pathspec)
|
||||
{
|
||||
unsigned long len = common_prefix_len(pathspec);
|
||||
|
||||
return len ? xmemdupz(*pathspec, len) : NULL;
|
||||
return len ? xmemdupz(pathspec->items[0].match, len) : NULL;
|
||||
}
|
||||
|
||||
int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
|
||||
@ -150,7 +149,7 @@ int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
|
||||
* Calculate common prefix for the pathspec, and
|
||||
* use that to optimize the directory walk
|
||||
*/
|
||||
len = common_prefix_len(pathspec->raw);
|
||||
len = common_prefix_len(pathspec);
|
||||
|
||||
/* Read the directory and prune it */
|
||||
read_directory(dir, pathspec->nr ? pathspec->raw[0] : "", len, pathspec);
|
||||
|
2
dir.h
2
dir.h
@ -130,7 +130,7 @@ struct dir_struct {
|
||||
#define MATCHED_EXACTLY 3
|
||||
extern int simple_length(const char *match);
|
||||
extern int no_wildcard(const char *string);
|
||||
extern char *common_prefix(const char **pathspec);
|
||||
extern char *common_prefix(const struct pathspec *pathspec);
|
||||
extern int match_pathspec(const char **pathspec, const char *name, int namelen, int prefix, char *seen);
|
||||
extern int match_pathspec_depth(const struct pathspec *pathspec,
|
||||
const char *name, int namelen,
|
||||
|
Loading…
Reference in New Issue
Block a user