The code now takes advantage of nowildcard_len field.
Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
builtin/commit.c | 2 +-
builtin/ls-files.c | 2 +-
dir.c | 31 +++++++++++++++----------------
dir.h | 2 +-
4 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index b5a92fa..1c4b73a 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -192,7 +192,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);
}
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 37f0392..f211539 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -551,7 +551,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 */
diff --git a/dir.c b/dir.c
index 20e6a3e..a646e55 100644
--- a/dir.c
+++ b/dir.c
@@ -60,26 +60,25 @@ inline int git_fnmatch(const char *pattern, const char
*string,
return fnmatch(pattern, string, fnm_flags);
}
-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;
-
- 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)))
+ GUARD_PATHSPEC(pathspec, PATHSPEC_FROMTOP | PATHSPEC_MAXDEPTH);
+
+ 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;
@@ -92,11 +91,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)
@@ -107,7 +106,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);
diff --git a/dir.h b/dir.h
index 70fdc98..d3f76df 100644
--- a/dir.h
+++ b/dir.h
@@ -127,7 +127,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,
--
1.8.0.rc0.19.g7bbb31d
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html