]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Better support of complex deps in pool_match_dep and selection_make_matchdeps
authorMichael Schroeder <mls@suse.de>
Fri, 8 Apr 2016 13:33:57 +0000 (15:33 +0200)
committerMichael Schroeder <mls@suse.de>
Fri, 8 Apr 2016 13:33:57 +0000 (15:33 +0200)
src/pool.c
src/selection.c

index 34fd7873f0f8e50e7521f976e195c18d1fd8ce01..ecc3686ef688ae0809f00d8a431c9cd526815baa 100644 (file)
@@ -813,6 +813,45 @@ pool_match_dep(Pool *pool, Id d1, Id d2)
 
   if (d1 == d2)
     return 1;
+
+  if (ISRELDEP(d1))
+    {
+      /* we use potentially matches for complex deps */
+      rd1 = GETRELDEP(pool, d1);
+      if (rd1->flags == REL_AND || rd1->flags == REL_OR || rd1->flags == REL_WITH || rd1->flags == REL_COND)
+       {
+         if (pool_match_dep(pool, rd1->name, d2))
+           return 1;
+         if (rd1->flags == REL_COND && ISRELDEP(rd1->evr))
+           {
+             rd1 = GETRELDEP(pool, rd1->evr);
+             if (rd1->flags != REL_ELSE)
+               return 0;
+           }
+         if (rd1->flags != REL_COND && pool_match_dep(pool, rd1->evr, d2))
+           return 1;
+         return 0;
+       }
+    }
+  if (ISRELDEP(d2))
+    {
+      /* we use potentially matches for complex deps */
+      rd2 = GETRELDEP(pool, d2);
+      if (rd2->flags == REL_AND || rd2->flags == REL_OR || rd2->flags == REL_WITH || rd2->flags == REL_COND)
+       {
+         if (pool_match_dep(pool, d1, rd2->name))
+           return 1;
+         if (rd2->flags == REL_COND && ISRELDEP(rd2->evr))
+           {
+             rd2 = GETRELDEP(pool, rd2->evr);
+             if (rd2->flags != REL_ELSE)
+               return 0;
+           }
+         if (rd2->flags != REL_COND && pool_match_dep(pool, d1, rd2->evr))
+           return 1;
+         return 0;
+       }
+    }
   if (!ISRELDEP(d1))
     {
       if (!ISRELDEP(d2))
index 8856436f3d3a2c1d9c7acf02863457324cd086d8..7d9a918cd67a5af48d984b93222af5c7834ea705 100644 (file)
@@ -873,11 +873,17 @@ matchdep(Pool *pool, Id id, char *rname, int rflags, char *revr, int flags)
   if (ISRELDEP(id))
     {
       Reldep *rd = GETRELDEP(pool, id);
-      if (rd->flags == REL_AND || rd->flags == REL_OR || rd->flags == REL_WITH)
+      if (rd->flags == REL_AND || rd->flags == REL_OR || rd->flags == REL_WITH || rd->flags == REL_COND)
        {
          if (matchdep(pool, rd->name, rname, rflags, revr, flags))
            return 1;
-         if (matchdep(pool, rd->evr, rname, rflags, revr, flags))
+         if (rd->flags == REL_COND && ISRELDEP(rd->evr))
+           {
+             rd = GETRELDEP(pool, rd->evr);
+             if (rd->flags != REL_ELSE)
+               return 0;
+           }
+         if (rd->flags != REL_COND && matchdep(pool, rd->evr, rname, rflags, revr, flags))
            return 1;
          return 0;
        }