Merge branch 'master' into next
[gitweb.git] / builtin-add.c
index 2afb82d6c1d745694f8457415e13f4f67b86ca19..02fe38b0c4c7c61bcc51544d1fd54c0b1641e2e8 100644 (file)
 static const char builtin_add_usage[] =
 "git-add [-n] [-v] <filepattern>...";
 
-static int common_prefix(const char **pathspec)
-{
-       const char *path, *slash, *next;
-       int prefix;
-
-       if (!pathspec)
-               return 0;
-
-       path = *pathspec;
-       slash = strrchr(path, '/');
-       if (!slash)
-               return 0;
-
-       prefix = slash - path + 1;
-       while ((next = *++pathspec) != NULL) {
-               int len = strlen(next);
-               if (len >= prefix && !memcmp(path, next, len))
-                       continue;
-               for (;;) {
-                       if (!len)
-                               return 0;
-                       if (next[--len] != '/')
-                               continue;
-                       if (memcmp(path, next, len+1))
-                               continue;
-                       prefix = len + 1;
-                       break;
-               }
-       }
-       return prefix;
-}
-
-static int match_one(const char *match, const char *name, int namelen)
-{
-       int matchlen;
-
-       /* If the match was just the prefix, we matched */
-       matchlen = strlen(match);
-       if (!matchlen)
-               return 1;
-
-       /*
-        * If we don't match the matchstring exactly,
-        * we need to match by fnmatch
-        */
-       if (strncmp(match, name, matchlen))
-               return !fnmatch(match, name, 0);
-
-       /*
-        * If we did match the string exactly, we still
-        * need to make sure that it happened on a path
-        * component boundary (ie either the last character
-        * of the match was '/', or the next character of
-        * the name was '/' or the terminating NUL.
-        */
-       return  match[matchlen-1] == '/' ||
-               name[matchlen] == '/' ||
-               !name[matchlen];
-}
-
-static int match(const char **pathspec, const char *name, int namelen, int prefix, char *seen)
-{
-       int retval;
-       const char *match;
-
-       name += prefix;
-       namelen -= prefix;
-
-       for (retval = 0; (match = *pathspec++) != NULL; seen++) {
-               if (retval & *seen)
-                       continue;
-               match += prefix;
-               if (match_one(match, name, namelen)) {
-                       retval = 1;
-                       *seen = 1;
-               }
-       }
-       return retval;
-}
-
 static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
 {
        char *seen;
@@ -108,7 +28,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
        i = dir->nr;
        while (--i >= 0) {
                struct dir_entry *entry = *src++;
-               if (!match(pathspec, entry->name, entry->len, prefix, seen)) {
+               if (!match_pathspec(pathspec, entry->name, entry->len, prefix, seen)) {
                        free(entry);
                        continue;
                }