Imported Upstream version 0.6.20
[platform/upstream/libsolv.git] / src / selection.c
index 9e7f9eb..7d9a918 100644 (file)
@@ -551,6 +551,14 @@ selection_filelist(Pool *pool, Queue *selection, const char *name, int flags)
   Queue q;
   int type;
 
+  /* all files in the file list start with a '/' */
+  if (*name != '/')
+    {
+      if (!(flags & SELECTION_GLOB))
+       return 0;
+      if (*name != '*' && *name != '[' && *name != '?')
+       return 0;
+    }
   type = !(flags & SELECTION_GLOB) || strpbrk(name, "[*?") == 0 ? SEARCH_STRING : SEARCH_GLOB;
   if ((flags & SELECTION_NOCASE) != 0)
     type |= SEARCH_NOCASE;
@@ -576,7 +584,7 @@ selection_filelist(Pool *pool, Queue *selection, const char *name, int flags)
   dataiterator_free(&di);
   if (!q.count)
     return 0;
-  if (q.count > 1) 
+  if (q.count > 1)
     queue_push2(selection, SOLVER_SOLVABLE_ONE_OF, pool_queuetowhatprovides(pool, &q));
   else
     queue_push2(selection, SOLVER_SOLVABLE | SOLVER_NOAUTOSET, q.elements[0]);
@@ -589,19 +597,19 @@ splitrel(char *rname, char *r, int *rflagsp)
 {
   int nend = r - rname;
   int rflags = 0;
-  if (nend && *r == '=' && r[-1] == '!') 
+  if (nend && *r == '=' && r[-1] == '!')
     {
       nend--;
       r++;
       rflags = REL_LT|REL_GT;
     }
-  for (; *r; r++) 
+  for (; *r; r++)
     {
-      if (*r == '<') 
+      if (*r == '<')
        rflags |= REL_LT;
-      else if (*r == '=') 
+      else if (*r == '=')
        rflags |= REL_EQ;
-      else if (*r == '>') 
+      else if (*r == '>')
        rflags |= REL_GT;
       else
        break;
@@ -610,10 +618,10 @@ splitrel(char *rname, char *r, int *rflagsp)
     r++;
   while (nend && (rname[nend - 1] == ' ' || rname[nend - 1] == '\t'))
     nend--;
-  if (!*rname || !*r) 
+  if (!*rname || !*r)
     return 0;
   *rflagsp = rflags;
-  rname[nend] = 0; 
+  rname[nend] = 0;
   return r;
 }
 
@@ -622,7 +630,7 @@ selection_rel(Pool *pool, Queue *selection, const char *name, int flags)
 {
   int ret, rflags = 0;
   char *r, *rname;
-  
+
   /* relation case, support:
    * depglob rel
    * depglob.arch rel
@@ -803,7 +811,7 @@ selection_canon(Pool *pool, Queue *selection, const char *name, int flags)
     return 0;
   rname = solv_strdup(name);   /* so we can modify it */
   r = rname + (r - name);
-  *r = 0; 
+  *r = 0;
 
   /* split off potential arch part from version */
   if ((r2 = strrchr(r + 1, '.')) != 0 && r2[1] && (archid = str2archid(pool, r2 + 1)) != 0)
@@ -820,8 +828,8 @@ selection_canon(Pool *pool, Queue *selection, const char *name, int flags)
          solv_free(rname);
          return 0;
        }
-      *r = '-'; 
-      *r2 = 0; 
+      *r = '-';
+      *r2 = 0;
       r = r2;
       if ((ret = selection_depglob(pool, selection, rname, flags)) == 0)
        {
@@ -840,12 +848,11 @@ int
 selection_make(Pool *pool, Queue *selection, const char *name, int flags)
 {
   int ret = 0;
-  const char *r;
 
   queue_empty(selection);
-  if (*name == '/' && (flags & SELECTION_FILELIST))
+  if ((flags & SELECTION_FILELIST) != 0)
     ret = selection_filelist(pool, selection, name, flags);
-  if (!ret && (flags & SELECTION_REL) != 0 && (r = strpbrk(name, "<=>")) != 0)
+  if (!ret && (flags & SELECTION_REL) != 0 && strpbrk(name, "<=>") != 0)
     ret = selection_rel(pool, selection, name, flags);
   if (!ret)
     ret = selection_depglob_arch(pool, selection, name, flags);
@@ -866,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;
        }
@@ -967,19 +980,19 @@ pool_is_kind(Pool *pool, Id name, Id kind)
     return 1;
   n = pool_id2str(pool, name);
   if (kind != 1)
-    {    
+    {
       const char *kn = pool_id2str(pool, kind);
       int knl = strlen(kn);
-      return !strncmp(n, kn, knl) && n[knl] == ':' ? 1 : 0; 
-    }    
-  else 
-    {    
-      if (*n == ':') 
+      return !strncmp(n, kn, knl) && n[knl] == ':' ? 1 : 0;
+    }
+  else
+    {
+      if (*n == ':')
         return 1;
-      while(*n >= 'a' && *n <= 'z') 
+      while(*n >= 'a' && *n <= 'z')
         n++;
-      return *n == ':' ? 0 : 1; 
-    }    
+      return *n == ':' ? 0 : 1;
+    }
 }
 
 void
@@ -999,8 +1012,11 @@ selection_filter(Pool *pool, Queue *sel1, Queue *sel2)
   if (sel1->count == 2 && (sel1->elements[0] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_ALL)
     {
       /* XXX: not 100% correct, but very useful */
+      p = sel1->elements[0] & ~(SOLVER_SELECTMASK | SOLVER_SETMASK);   /* job & jobflags */
       queue_free(sel1);
       queue_init_clone(sel1, sel2);
+      for (i = 0; i < sel1->count; i += 2)
+        sel1->elements[i] = (sel1->elements[i] & (SOLVER_SELECTMASK | SOLVER_SETMASK)) | p ;
       return;
     }
   queue_init(&q1);
@@ -1107,7 +1123,7 @@ selection_filter(Pool *pool, Queue *sel1, Queue *sel2)
          sel1->elements[j] = sel1->elements[i] | setflags;
          sel1->elements[j + 1] = sel1->elements[i + 1];
        }
-      else if (q1.count > 1) 
+      else if (q1.count > 1)
        {
          sel1->elements[j] = (sel1->elements[i] & ~SOLVER_SELECTMASK) | SOLVER_SOLVABLE_ONE_OF | setflags;
          sel1->elements[j + 1] = pool_queuetowhatprovides(pool, &q1);