Imported Upstream version 2.22.4
[platform/upstream/git.git] / pathspec.c
index 82eb39c..12c2b32 100644 (file)
@@ -1,4 +1,3 @@
-#define NO_THE_INDEX_COMPATIBILITY_MACROS
 #include "cache.h"
 #include "config.h"
 #include "dir.h"
@@ -37,7 +36,7 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec,
                return;
        for (i = 0; i < istate->cache_nr; i++) {
                const struct cache_entry *ce = istate->cache[i];
-               ce_path_match(ce, pathspec, seen);
+               ce_path_match(istate, ce, pathspec, seen);
        }
 }
 
@@ -198,7 +197,7 @@ static void parse_pathspec_attr_match(struct pathspec_item *item, const char *va
        }
 
        if (item->attr_check->nr != item->attr_match_nr)
-               die("BUG: should have same number of entries");
+               BUG("should have same number of entries");
 
        string_list_clear(&list, 0);
 }
@@ -422,7 +421,7 @@ static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
 
        if (pathspec_prefix >= 0 &&
            (prefixlen || (prefix && *prefix)))
-               die("BUG: 'prefix' magic is supposed to be used at worktree's root");
+               BUG("'prefix' magic is supposed to be used at worktree's root");
 
        if ((magic & PATHSPEC_LITERAL) && (magic & PATHSPEC_GLOB))
                die(_("%s: 'literal' and 'glob' are incompatible"), elt);
@@ -486,7 +485,7 @@ static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
        /* sanity checks, pathspec matchers assume these are sane */
        if (item->nowildcard_len > item->len ||
            item->prefix         > item->len) {
-               die ("BUG: error initializing pathspec_item");
+               BUG("error initializing pathspec_item");
        }
 }
 
@@ -545,7 +544,7 @@ void parse_pathspec(struct pathspec *pathspec,
 
        if ((flags & PATHSPEC_PREFER_CWD) &&
            (flags & PATHSPEC_PREFER_FULL))
-               die("BUG: PATHSPEC_PREFER_CWD and PATHSPEC_PREFER_FULL are incompatible");
+               BUG("PATHSPEC_PREFER_CWD and PATHSPEC_PREFER_FULL are incompatible");
 
        /* No arguments with prefix -> prefix pathspec */
        if (!entry) {
@@ -553,7 +552,7 @@ void parse_pathspec(struct pathspec *pathspec,
                        return;
 
                if (!(flags & PATHSPEC_PREFER_CWD))
-                       die("BUG: PATHSPEC_PREFER_CWD requires arguments");
+                       BUG("PATHSPEC_PREFER_CWD requires arguments");
 
                pathspec->items = item = xcalloc(1, sizeof(*item));
                item->match = xstrdup(prefix);
@@ -609,7 +608,7 @@ void parse_pathspec(struct pathspec *pathspec,
 
        if (pathspec->magic & PATHSPEC_MAXDEPTH) {
                if (flags & PATHSPEC_KEEP_ORDER)
-                       die("BUG: PATHSPEC_MAXDEPTH_VALID and PATHSPEC_KEEP_ORDER are incompatible");
+                       BUG("PATHSPEC_MAXDEPTH_VALID and PATHSPEC_KEEP_ORDER are incompatible");
                QSORT(pathspec->items, pathspec->nr, pathspec_item_cmp);
        }
 }
@@ -659,3 +658,41 @@ void clear_pathspec(struct pathspec *pathspec)
        FREE_AND_NULL(pathspec->items);
        pathspec->nr = 0;
 }
+
+int match_pathspec_attrs(const struct index_state *istate,
+                        const char *name, int namelen,
+                        const struct pathspec_item *item)
+{
+       int i;
+       char *to_free = NULL;
+
+       if (name[namelen])
+               name = to_free = xmemdupz(name, namelen);
+
+       git_check_attr(istate, name, item->attr_check);
+
+       free(to_free);
+
+       for (i = 0; i < item->attr_match_nr; i++) {
+               const char *value;
+               int matched;
+               enum attr_match_mode match_mode;
+
+               value = item->attr_check->items[i].value;
+               match_mode = item->attr_match[i].match_mode;
+
+               if (ATTR_TRUE(value))
+                       matched = (match_mode == MATCH_SET);
+               else if (ATTR_FALSE(value))
+                       matched = (match_mode == MATCH_UNSET);
+               else if (ATTR_UNSET(value))
+                       matched = (match_mode == MATCH_UNSPECIFIED);
+               else
+                       matched = (match_mode == MATCH_VALUE &&
+                                  !strcmp(item->attr_match[i].value, value));
+               if (!matched)
+                       return 0;
+       }
+
+       return 1;
+}