simplify datamatcher code, use datamatcher_checkbasename also in repo_search
authorMichael Schroeder <mls@suse.de>
Thu, 29 Nov 2012 10:32:34 +0000 (11:32 +0100)
committerMichael Schroeder <mls@suse.de>
Thu, 29 Nov 2012 10:32:34 +0000 (11:32 +0100)
src/dataiterator.h
src/repo.c
src/repodata.c

index cf10fd9..6f8fd32 100644 (file)
@@ -74,6 +74,7 @@ typedef struct _Datamatcher {
 int  datamatcher_init(Datamatcher *ma, const char *match, int flags);
 void datamatcher_free(Datamatcher *ma);
 int  datamatcher_match(Datamatcher *ma, const char *str);
+int  datamatcher_checkbasename(Datamatcher *ma, const char *str);
 
 
 /*
index 2cc386a..c5a4a2d 100644 (file)
@@ -844,6 +844,9 @@ repo_matchvalue(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValu
 
   if (md->matcher.match)
     {
+      if (key->name == SOLVABLE_FILELIST && key->type == REPOKEY_TYPE_DIRSTRARRAY && (md->matcher.flags & SEARCH_FILES) != 0)
+       if (!datamatcher_checkbasename(&md->matcher, kv->str))
+         return 0;
       if (!repodata_stringify(md->pool, data, key, kv, md->flags))
        return 0;
       if (!datamatcher_match(&md->matcher, kv->str))
index 6cdf17b..9d3bb6b 100644 (file)
@@ -1064,16 +1064,11 @@ datamatcher_init(Datamatcher *ma, const char *match, int flags)
   if ((flags & SEARCH_FILES) != 0 && match)
     {
       /* prepare basename check */
-      if ((flags & SEARCH_STRINGMASK) == SEARCH_STRING)
+      if ((flags & SEARCH_STRINGMASK) == SEARCH_STRING || (flags & SEARCH_STRINGMASK) == SEARCH_STRINGEND)
        {
          const char *p = strrchr(match, '/');
          ma->matchdata = (void *)(p ? p + 1 : match);
        }
-      else if ((flags & SEARCH_STRINGMASK) == SEARCH_STRINGEND)
-       {
-         const char *p = strrchr(match, '/');
-         ma->matchdata = (void *)(p ? p + 1 : 0);
-       }
       else if ((flags & SEARCH_STRINGMASK) == SEARCH_GLOB)
        {
          const char *p;
@@ -1105,96 +1100,55 @@ datamatcher_match(Datamatcher *ma, const char *str)
     {
     case SEARCH_SUBSTRING:
       if (ma->flags & SEARCH_NOCASE)
-       {
-         if (!strcasestr(str, ma->match))
-           return 0;
-       }
+       return strcasestr(str, ma->match) != 0;
       else
-       {
-         if (!strstr(str, ma->match))
-           return 0;
-       }
-      break;
+       return strstr(str, ma->match) != 0;
     case SEARCH_STRING:
       if (ma->flags & SEARCH_NOCASE)
-       {
-         if (strcasecmp(ma->match, str))
-           return 0;
-       }
+       return !strcasecmp(ma->match, str);
       else
-       {
-         if (strcmp(ma->match, str))
-           return 0;
-       }
-      break;
+       return !strcmp(ma->match, str);
     case SEARCH_STRINGSTART:
       if (ma->flags & SEARCH_NOCASE)
-       {
-         if (strncasecmp(ma->match, str, strlen(ma->match)))
-           return 0;
-       }
+        return !strncasecmp(ma->match, str, strlen(ma->match));
       else
-       {
-         if (strncmp(ma->match, str, strlen(ma->match)))
-           return 0;
-       }
-      break;
+        return !strncmp(ma->match, str, strlen(ma->match));
     case SEARCH_STRINGEND:
       l = strlen(str) - strlen(ma->match);
       if (l < 0)
        return 0;
       if (ma->flags & SEARCH_NOCASE)
-       {
-         if (strcasecmp(ma->match, str + l))
-           return 0;
-       }
+       return !strcasecmp(ma->match, str + l);
       else
-       {
-         if (strcmp(ma->match, str + l))
-           return 0;
-       }
-      break;
+       return !strcmp(ma->match, str + l);
     case SEARCH_GLOB:
-      if (fnmatch(ma->match, str, (ma->flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0))
-       return 0;
-      break;
+      return !fnmatch(ma->match, str, (ma->flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0);
     case SEARCH_REGEX:
-      if (regexec((const regex_t *)ma->matchdata, str, 0, NULL, 0))
-       return 0;
-      break;
+      return !regexec((const regex_t *)ma->matchdata, str, 0, NULL, 0);
     default:
       return 0;
     }
-  return 1;
 }
 
 /* check if the matcher can match the provides basename */
 
-static int
+int
 datamatcher_checkbasename(Datamatcher *ma, const char *basename)
 {
   int l;
-  const char *match = ma->match;
+  const char *match = ma->matchdata;
+  if (!match)
+    return 1;
   switch (ma->flags & SEARCH_STRINGMASK)
     {
     case SEARCH_STRING:
-      match = ma->matchdata;
       break;
     case SEARCH_STRINGEND:
-      if (ma->matchdata)
-       {
-         match = ma->matchdata;        /* have slash */
-         break;
-       }
-      l = strlen(basename) - strlen(match);
-      if (l < 0)
-       return 0;
-      basename += l;
-      break;
+      if (match != ma->match)
+       break;          /* had slash, do exact match on basename */
+      /* FALLTHROUGH */
     case SEARCH_GLOB:
-      match = ma->matchdata;
-      if (!match)
-       return 1;
+      /* check if the basename ends with match */
       l = strlen(basename) - strlen(match);
       if (l < 0)
        return 0;
@@ -1203,8 +1157,6 @@ datamatcher_checkbasename(Datamatcher *ma, const char *basename)
     default:
       return 1;        /* maybe matches */
     }
-  if (!match)
-    return 1;
   if ((ma->flags & SEARCH_NOCASE) != 0)
     return !strcasecmp(match, basename);
   else