Imported Upstream version 0.6.7
[platform/upstream/libsolv.git] / ext / repo_autopattern.c
index 1028947..7edfc6c 100644 (file)
@@ -5,6 +5,9 @@
  * for further information
  */
 
+#define _GNU_SOURCE
+#define _XOPEN_SOURCE
+#include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdio.h>
@@ -55,6 +58,30 @@ unescape(char *p)
   *q = 0;
 }
 
+static time_t
+datestr2timestamp(const char *date)
+{
+  const char *p; 
+  struct tm tm; 
+
+  if (!date || !*date)
+    return 0;
+  for (p = date; *p >= '0' && *p <= '9'; p++)
+    ;   
+  if (!*p)
+    return atoi(date);
+  memset(&tm, 0, sizeof(tm));
+  p = strptime(date, "%F%T", &tm);
+  if (!p)
+    {   
+      memset(&tm, 0, sizeof(tm));
+      p = strptime(date, "%F", &tm);
+      if (!p || *p) 
+        return 0;
+    }   
+  return timegm(&tm);
+}
+
 int
 repo_add_autopattern(Repo *repo, int flags)
 {
@@ -105,13 +132,29 @@ repo_add_autopattern(Repo *repo, int flags)
                  continue;
                if (rd->name == pattern_id)
                  {
+                   const char *evrstr = pool_id2str(pool, rd->evr);
+                   if (evrstr[0] == '.')       /* hack to allow provides that do not create a pattern */
+                     continue;
+                   if (patq2.count && patq2.elements[patq2.count - 2] == p)
+                     {
+                       /* hmm, two provides. choose by evrstr */
+                       if (strcmp(evrstr, pool_id2str(pool, patq2.elements[patq2.count - 1])) >= 0)
+                         continue;
+                       patq2.count -= 2;
+                     }
                    queue_push2(&patq2, p, rd->evr);
-                   break;
                  }
                if (rd->name == product_id)
                  {
+                   const char *evrstr = pool_id2str(pool, rd->evr);
+                   if (prdq2.count && prdq2.elements[prdq2.count - 2] == p)
+                     {
+                       /* hmm, two provides. choose by evrstr */
+                       if (strcmp(evrstr, pool_id2str(pool, prdq2.elements[prdq2.count - 1])) >= 0)
+                         continue;
+                       prdq2.count -= 2;
+                     }
                    queue_push2(&prdq2, p, rd->evr);
-                   break;
                  }
              }
        }
@@ -332,6 +375,10 @@ repo_add_autopattern(Repo *repo, int flags)
            }
          if (!strcmp(pn, "product-label()") && evr)
            repodata_set_str(data, s2 - pool->solvables, PRODUCT_SHORTLABEL, newname);
+         else if (!strcmp(pn, "product-register-target()") && evr)
+           repodata_set_str(data, s2 - pool->solvables, PRODUCT_REGISTER_TARGET, newname);
+         else if (!strcmp(pn, "product-register-flavor()") && evr)
+           repodata_set_str(data, s2 - pool->solvables, PRODUCT_REGISTER_FLAVOR, newname);
          else if (!strcmp(pn, "product-type()") && evr)
            repodata_set_str(data, s2 - pool->solvables, PRODUCT_TYPE, newname);
          else if (!strcmp(pn, "product-cpeid()") && evr)
@@ -339,7 +386,17 @@ repo_add_autopattern(Repo *repo, int flags)
          else if (!strcmp(pn, "product-flags()") && evr)
            repodata_add_poolstr_array(data, s2 - pool->solvables, PRODUCT_FLAGS, newname);
          else if (!strcmp(pn, "product-updates-repoid()") && evr)
-           repodata_add_poolstr_array(data, s2 - pool->solvables, PRODUCT_UPDATES_REPOID, newname);
+           {
+             Id h = repodata_new_handle(data);
+             repodata_set_str(data, h, PRODUCT_UPDATES_REPOID, newname);
+             repodata_add_flexarray(data, s2 - pool->solvables, PRODUCT_UPDATES, h);
+           }
+         else if (!strcmp(pn, "product-endoflife()") && evr)
+           {
+             time_t t = datestr2timestamp(newname);
+             if (t)
+               repodata_set_num(data, s2 - pool->solvables, PRODUCT_ENDOFLIFE, t);
+           }
          else if (!strncmp(pn, "product-url(", 12) && evr && pn[12] && pn[13] && strlen(pn + 12) < 32)
            {
              char type[34];