]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Special case marchdeps filtering on a repo or all packages.
authorMichael Schroeder <mls@suse.de>
Thu, 16 Nov 2017 13:20:33 +0000 (14:20 +0100)
committerMichael Schroeder <mls@suse.de>
Thu, 16 Nov 2017 13:20:33 +0000 (14:20 +0100)
src/selection.c
src/selection.h

index e9ef3b53d86229c53997199dd4c8abaa1ece2f26..1fdaa46bcc07755783ea8890ff581c8ce741f3a6 100644 (file)
@@ -1202,14 +1202,10 @@ setup_limiter(Pool *pool, int flags, struct limiter *limiter)
   limiter->repofilter = 0;
   if ((flags & SELECTION_INSTALLED_ONLY) != 0)
     {
-      if (!pool->installed)
-       limiter->end = 0;
-      else
-       {
-         limiter->repofilter = pool->installed;
-         limiter->start = pool->installed->start;
-         limiter->end = pool->installed->end;
-       }
+      Repo *repo = pool->installed;
+      limiter->repofilter = repo;
+      limiter->start = repo ? repo->start : 0;
+      limiter->end = repo ? repo->end : 0;
     }
 }
 
@@ -1455,7 +1451,23 @@ selection_make_matchdeps_common(Pool *pool, Queue *selection, const char *name,
       Queue q, qlimit;
       queue_init(&q);
       queue_init(&qlimit);
-      if ((flags & SELECTION_MODEBITS) == SELECTION_SUBTRACT || (flags & SELECTION_MODEBITS) == SELECTION_FILTER)
+      /* deal with special filter cases */
+      if ((flags & SELECTION_MODEBITS) == SELECTION_FILTER && selection->count == 2 && limiter.end)
+       {
+         if ((selection->elements[0] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_ALL)
+           flags = (flags & ~SELECTION_MODEBITS) | SELECTION_REPLACE;
+         else if ((selection->elements[0] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_REPO)
+           {
+             Repo *repo = pool_id2repo(pool, selection->elements[1]);
+             if (limiter.repofilter && repo != limiter.repofilter)
+               repo = 0;
+             limiter.repofilter = repo;
+             limiter.start = repo ? repo->start : 0;
+             limiter.end = repo ? repo->end : 0;
+             flags = (flags & ~SELECTION_MODEBITS) | SELECTION_REPLACE;
+           }
+       }
+      if (limiter.end && ((flags & SELECTION_MODEBITS) == SELECTION_SUBTRACT || (flags & SELECTION_MODEBITS) == SELECTION_FILTER))
        {
          selection_solvables(pool, selection, &qlimit);
          limiter.start = 0;
@@ -1468,8 +1480,21 @@ selection_make_matchdeps_common(Pool *pool, Queue *selection, const char *name,
        selection_add(pool, selection, &q);
       else if ((flags & SELECTION_MODEBITS) == SELECTION_SUBTRACT)
        selection_subtract(pool, selection, &q);
+      else if ((flags & SELECTION_MODEBITS) == SELECTION_FILTER)
+       {
+          if (ret || !(flags & SELECTION_FILTER_KEEP_IFEMPTY))
+           selection_filter(pool, selection, &q);
+       }
       else if (ret || !(flags & SELECTION_FILTER_KEEP_IFEMPTY))
-       selection_filter(pool, selection, &q);
+       {
+         /* special filter case from above */
+         int i;
+         Id f = selection->elements[0] & ~(SOLVER_SELECTMASK|SOLVER_NOAUTOSET);        /* job, jobflags, setflags */
+         queue_free(selection);
+         queue_init_clone(selection, &q);
+         for (i = 0; i < selection->count; i += 2)
+           selection->elements[i] = (selection->elements[i] & (SOLVER_SELECTMASK | SOLVER_SETMASK)) | f;
+       }
       queue_free(&q);
       return ret;
     }
index c809d5538572e8052ce3d2e3422008401129a6ff..8fe2d7944236b522afc7b8d95c26bc4d4c4989a6 100644 (file)
@@ -31,10 +31,10 @@ extern "C" {
 
 /* string comparison modifiers */
 #define SELECTION_GLOB                 (1 << 9)
-#define SELECTION_FLAT                 (1 << 10)
 #define SELECTION_NOCASE               (1 << 11)
 
 /* extra flags */
+#define SELECTION_FLAT                 (1 << 10)       /* flatten the resulting selection */
 #define SELECTION_SKIP_KIND            (1 << 14)       /* remove kind: name prefix in SELECTION_NAME matches */
 #define SELECTION_MATCH_DEPSTR         (1 << 15)       /* match dep2str result */