add repodata_set_sourcepkg and solvable_lookup_sourcepkg, fix solvable_get_location...
authorMichael Schroeder <mls@suse.de>
Mon, 8 Oct 2012 13:16:42 +0000 (15:16 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 8 Oct 2012 13:16:42 +0000 (15:16 +0200)
examples/solv.c
ext/repo_mdk.c
ext/repo_rpmdb.c
ext/repo_rpmmd.c
ext/repo_susetags.c
src/libsolv.ver
src/repo.c
src/repodata.c
src/repodata.h
src/solvable.c
src/solvable.h

index 221a59c..f2738a3 100644 (file)
@@ -3264,7 +3264,7 @@ rerunsolver:
       for (i = 0; i < newpkgs; i++)
        {
          unsigned int medianr;
-         char *loc;
+         const char *loc;
          Solvable *s;
          struct repoinfo *cinfo;
          const unsigned char *chksum;
index 7fa0abd..82d3265 100644 (file)
@@ -391,51 +391,6 @@ joinhash_lookup(Repo *repo, Hashtable ht, Hashmask hm, const char *fn, const cha
   return 0;
 }
 
-static void
-set_sourcerpm(Repodata *data, Solvable *s, Id handle, const char *sourcerpm)
-{
-  const char *p, *sevr, *sarch, *name, *evr;
-  Pool *pool;
-
-  p = strrchr(sourcerpm, '.');
-  if (!p || strcmp(p, ".rpm") != 0)
-    return;
-  p--;
-  while (p > sourcerpm && *p != '.')
-    p--;
-  if (*p != '.' || p == sourcerpm)
-    return;
-  sarch = p-- + 1;
-  while (p > sourcerpm && *p != '-')
-    p--;
-  if (*p != '-' || p == sourcerpm)
-    return;
-  p--;
-  while (p > sourcerpm && *p != '-')
-    p--;
-  if (*p != '-' || p == sourcerpm)
-    return;
-  sevr = p + 1;
-  pool = s->repo->pool;
-  if (!strcmp(sarch, "src.rpm"))
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_SRC);
-  else if (!strcmp(sarch, "nosrc.rpm"))
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
-  else
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
-  evr = pool_id2str(pool, s->evr);
-  if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
-    repodata_set_void(data, handle, SOLVABLE_SOURCEEVR);
-  else
-    repodata_set_id(data, handle, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
-  name = pool_id2str(pool, s->name);
-  if (name && !strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
-    repodata_set_void(data, handle, SOLVABLE_SOURCENAME);
-  else
-    repodata_set_id(data, handle, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-}
-
-
 static void XMLCALL
 startElement(void *userData, const char *name, const char **atts)
 {
@@ -479,7 +434,7 @@ startElement(void *userData, const char *name, const char **atts)
          repodata_set_poolstr(pd->data, pd->solvable - pool->solvables, SOLVABLE_LICENSE, str);
        str = find_attr("sourcerpm", atts);
        if (str && *str)
-         set_sourcerpm(pd->data, pd->solvable, pd->solvable - pool->solvables, str);
+         repodata_set_sourcepkg(pd->data, pd->solvable - pool->solvables, str);
         break;
       }
     case STATE_FILES:
index 982acda..61c31f2 100644 (file)
@@ -833,46 +833,6 @@ addfileprovides(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rp
   return olddeps;
 }
 
-static void
-addsourcerpm(Pool *pool, Repodata *data, Id handle, char *sourcerpm, char *name, char *evr)
-{
-  const char *p, *sevr, *sarch;
-
-  p = strrchr(sourcerpm, '.');
-  if (!p || strcmp(p, ".rpm") != 0)
-    return;
-  p--;
-  while (p > sourcerpm && *p != '.')
-    p--;
-  if (*p != '.' || p == sourcerpm)
-    return;
-  sarch = p-- + 1;
-  while (p > sourcerpm && *p != '-')
-    p--;
-  if (*p != '-' || p == sourcerpm)
-    return;
-  p--;
-  while (p > sourcerpm && *p != '-')
-    p--;
-  if (*p != '-' || p == sourcerpm)
-    return;
-  sevr = p + 1;
-  if (!strcmp(sarch, "src.rpm"))
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_SRC);
-  else if (!strcmp(sarch, "nosrc.rpm"))
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
-  else
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
-  if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
-    repodata_set_void(data, handle, SOLVABLE_SOURCEEVR);
-  else
-    repodata_set_id(data, handle, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
-  if (name && !strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
-    repodata_set_void(data, handle, SOLVABLE_SOURCENAME);
-  else
-    repodata_set_id(data, handle, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-}
-
 static int
 rpm2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhead, int flags)
 {
@@ -881,14 +841,14 @@ rpm2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhead,
   char *sourcerpm;
 
   name = headstring(rpmhead, TAG_NAME);
-  if (!strcmp(name, "gpg-pubkey"))
-    return 0;
-  s->name = pool_str2id(pool, name, 1);
-  if (!s->name)
+  if (!name)
     {
       fprintf(stderr, "package has no name\n");
       return 0;
     }
+  if (!strcmp(name, "gpg-pubkey"))
+    return 0;
+  s->name = pool_str2id(pool, name, 1);
   sourcerpm = headstring(rpmhead, TAG_SOURCERPM);
   if (sourcerpm || (rpmhead->forcebinary && !headexists(rpmhead, TAG_SOURCEPACKAGE)))
     s->arch = pool_str2id(pool, headstring(rpmhead, TAG_ARCH), 1);
@@ -1022,7 +982,7 @@ rpm2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhead,
            repodata_set_num(data, handle, SOLVABLE_INSTALLSIZE, u32);
        }
       if (sourcerpm)
-       addsourcerpm(pool, data, handle, sourcerpm, name, evr);
+       repodata_set_sourcepkg(data, handle, sourcerpm);
       if ((flags & RPM_ADD_TRIGGERS) != 0)
        {
          Id id, lastid;
index 80e54c6..b8bd904 100644 (file)
@@ -573,55 +573,6 @@ set_description_author(Repodata *data, Id handle, char *str, struct parsedata *p
 }
 
 
-/*
- * set_sourcerpm
- *
- */
-
-static void
-set_sourcerpm(Repodata *data, Solvable *s, Id handle, const char *sourcerpm)
-{
-  const char *p, *sevr, *sarch, *name, *evr;
-  Pool *pool;
-
-  p = strrchr(sourcerpm, '.');
-  if (!p || strcmp(p, ".rpm") != 0)
-    return;
-  p--;
-  while (p > sourcerpm && *p != '.')
-    p--;
-  if (*p != '.' || p == sourcerpm)
-    return;
-  sarch = p-- + 1;
-  while (p > sourcerpm && *p != '-')
-    p--;
-  if (*p != '-' || p == sourcerpm)
-    return;
-  p--;
-  while (p > sourcerpm && *p != '-')
-    p--;
-  if (*p != '-' || p == sourcerpm)
-    return;
-  sevr = p + 1;
-  pool = s->repo->pool;
-  if (!strcmp(sarch, "src.rpm"))
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_SRC);
-  else if (!strcmp(sarch, "nosrc.rpm"))
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
-  else
-    repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
-  evr = pool_id2str(pool, s->evr);
-  if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
-    repodata_set_void(data, handle, SOLVABLE_SOURCEEVR);
-  else
-    repodata_set_id(data, handle, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
-  name = pool_id2str(pool, s->name);
-  if (name && !strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
-    repodata_set_void(data, handle, SOLVABLE_SOURCENAME);
-  else
-    repodata_set_id(data, handle, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-}
-
 /*-----------------------------------------------*/
 /* XML callbacks */
 
@@ -1065,7 +1016,8 @@ endElement(void *userData, const char *name)
        repodata_set_poolstr(pd->data, handle, SOLVABLE_PACKAGER, pd->content);
       break;
     case STATE_SOURCERPM:
-      set_sourcerpm(pd->data, s, handle, pd->content);
+      if (pd->content[0])
+       repodata_set_sourcepkg(pd->data, handle, pd->content);
       break;
     case STATE_RELNOTESURL:
       if (pd->content[0])
index f6fd833..2eb42e0 100644 (file)
@@ -130,12 +130,11 @@ adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, char *line, Id ma
 static void
 add_source(struct parsedata *pd, char *line, Solvable *s, Id handle)
 {
-  Repo *repo = s->repo;
-  Pool *pool = repo->pool;
+  Pool *pool = s->repo->pool;
   char *sp[5];
   Id name;
-  Id evr;
   Id arch;
+  const char *evr, *sevr;
 
   if (split(line, sp, 5) != 4)
     {
@@ -144,17 +143,26 @@ add_source(struct parsedata *pd, char *line, Solvable *s, Id handle)
     }
 
   name = pool_str2id(pool, sp[0], 1);
-  evr = makeevr(pool, join2(&pd->jd, sp[1], "-", sp[2]));
-  arch = pool_str2id(pool, sp[3], 1);
-  /* XXX: could record a dep here, depends on where we want to store the data */
+  arch = pool_str2id(pool, sp[3], 1);  /* do this before id2str */
+  evr = join2(&pd->jd, sp[1], "-", sp[2]);
+  sevr = pool_id2str(pool, s->evr);
+  if (sevr)
+    {
+      /* strip epoch */
+      const char *p;
+      for (p = sevr; *p >= '0' && *p <= '9'; p++)
+       ;
+      if (*p == ':' && p[1])
+       sevr = p;
+    }
   if (name == s->name)
     repodata_set_void(pd->data, handle, SOLVABLE_SOURCENAME);
   else
     repodata_set_id(pd->data, handle, SOLVABLE_SOURCENAME, name);
-  if (evr == s->evr)
+  if (sevr && !strcmp(sevr, evr))
     repodata_set_void(pd->data, handle, SOLVABLE_SOURCEEVR);
   else
-    repodata_set_id(pd->data, handle, SOLVABLE_SOURCEEVR, evr);
+    repodata_set_id(pd->data, handle, SOLVABLE_SOURCEEVR, pool_str2id(pool, evr, 1));
   repodata_set_constantid(pd->data, handle, SOLVABLE_SOURCEARCH, arch);
 }
 
index 6a275b5..a0e7980 100644 (file)
@@ -206,6 +206,7 @@ SOLV_1.0 {
                repodata_set_location;
                repodata_set_num;
                repodata_set_poolstr;
+               repodata_set_sourcepkg;
                repodata_set_str;
                repodata_set_void;
                repodata_setpos_kv;
@@ -261,6 +262,7 @@ SOLV_1.0 {
                solvable_lookup_idarray;
                solvable_lookup_num;
                solvable_lookup_sizek;
+               solvable_lookup_sourcepkg;
                solvable_lookup_str;
                solvable_lookup_str_lang;
                solvable_lookup_str_poollang;
index 9f6d426..594295f 100644 (file)
@@ -1236,7 +1236,7 @@ int
 repo_lookup_deparray(Repo *repo, Id entry, Id keyname, Queue *q, Id marker)
 {
   int r = repo_lookup_idarray(repo, entry, keyname, q);
-  if (r && marker)
+  if (r && marker && q->count)
     {
       int i;
       if (marker < 0)
index 15ed0b5..1574eb5 100644 (file)
@@ -2294,6 +2294,67 @@ repodata_set_location(Repodata *data, Id solvid, int medianr, const char *dir, c
 }
 
 void
+repodata_set_sourcepkg(Repodata *data, Id solvid, const char *sourcepkg)
+{
+  Pool *pool = data->repo->pool;
+  Solvable *s = pool->solvables + solvid;
+  const char *p, *sevr, *sarch, *name, *evr;
+
+  p = strrchr(sourcepkg, '.');
+  if (!p || strcmp(p, ".rpm") != 0)
+    {
+      if (*sourcepkg)
+        repodata_set_str(data, solvid, SOLVABLE_SOURCENAME, sourcepkg);
+      return;
+    }
+  p--;
+  while (p > sourcepkg && *p != '.')
+    p--;
+  if (*p != '.' || p == sourcepkg)
+    return;
+  sarch = p-- + 1;
+  while (p > sourcepkg && *p != '-')
+    p--;
+  if (*p != '-' || p == sourcepkg)
+    return;
+  p--;
+  while (p > sourcepkg && *p != '-')
+    p--;
+  if (*p != '-' || p == sourcepkg)
+    return;
+  sevr = p + 1;
+  pool = s->repo->pool;
+
+  name = pool_id2str(pool, s->name);
+  if (name && !strncmp(sourcepkg, name, sevr - sourcepkg - 1) && name[sevr - sourcepkg - 1] == 0)
+    repodata_set_void(data, solvid, SOLVABLE_SOURCENAME);
+  else
+    repodata_set_id(data, solvid, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcepkg, sevr - sourcepkg - 1, 1));
+
+  evr = pool_id2str(pool, s->evr);
+  if (evr)
+    {
+      /* strip epoch */
+      const char *pp;
+      for (pp = evr; *pp >= '0' && *pp <= '9'; pp++)
+        ;
+      if (*pp == ':' && pp[1])
+        evr = pp + 1;
+    }
+  if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
+    repodata_set_void(data, solvid, SOLVABLE_SOURCEEVR);
+  else
+    repodata_set_id(data, solvid, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
+
+  if (!strcmp(sarch, "src.rpm"))
+    repodata_set_constantid(data, solvid, SOLVABLE_SOURCEARCH, ARCH_SRC);
+  else if (!strcmp(sarch, "nosrc.rpm"))
+    repodata_set_constantid(data, solvid, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
+  else
+    repodata_set_constantid(data, solvid, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
+}
+
+void
 repodata_set_idarray(Repodata *data, Id solvid, Id keyname, Queue *q)
 {
   Repokey key;
index b224920..fb755bc 100644 (file)
@@ -288,6 +288,7 @@ Id repodata_str2dir(Repodata *data, const char *dir, int create);
 const char *repodata_dir2str(Repodata *data, Id did, const char *suf);
 const char *repodata_chk2str(Repodata *data, Id type, const unsigned char *buf);
 void repodata_set_location(Repodata *data, Id solvid, int medianr, const char *dir, const char *file);
+void repodata_set_sourcepkg(Repodata *data, Id solvid, const char *sourcepkg);
 Id repodata_lookup_id_uninternalized(Repodata *data, Id solvid, Id keyname, Id voidid);
 
 /* stats */
index 4e46eaf..99fe788 100644 (file)
@@ -268,7 +268,7 @@ evrid2vrstr(Pool *pool, Id evrid)
   return p != evr && *p == ':' ? p + 1 : evr;
 }
 
-char *
+const char *
 solvable_get_location(Solvable *s, unsigned int *medianrp)
 {
   Pool *pool;
@@ -316,6 +316,50 @@ solvable_get_location(Solvable *s, unsigned int *medianrp)
   return loc;
 }
 
+const char *
+solvable_lookup_sourcepkg(Solvable *s)
+{
+  Pool *pool;
+  const char *evr, *name;
+  Id archid;
+
+  if (!s->repo)
+    return 0;
+  pool = s->repo->pool;
+  if (solvable_lookup_void(s, SOLVABLE_SOURCENAME))
+    name = pool_id2str(pool, s->name);
+  else
+    name = solvable_lookup_str(s, SOLVABLE_SOURCENAME);
+  if (!name)
+    return 0;
+  archid = solvable_lookup_id(s, SOLVABLE_SOURCEARCH);
+  if (solvable_lookup_void(s, SOLVABLE_SOURCEEVR))
+    {
+      evr = pool_id2str(pool, s->evr);
+      if (evr && (archid == ARCH_SRC || archid == ARCH_NOSRC))
+       {
+         /* assume rpm, strip epoch */
+         const char *p;
+         for (p = evr; *p >= '0' && *p <= '9'; p++)
+           ;
+         if (*p == ':' && p[1])
+           evr = p + 1;
+       }
+    }
+  else
+    evr = solvable_lookup_str(s, SOLVABLE_SOURCEEVR);
+  if (archid == ARCH_SRC || archid == ARCH_NOSRC)
+    {
+      char *str;
+      str = pool_tmpjoin(pool, name, evr ? "-" : 0, evr);
+      str = pool_tmpappend(pool, str, ".", pool_id2str(pool, archid));
+      return pool_tmpappend(pool, str, ".rpm", 0);
+    }
+  else 
+    return name;       /* FIXME */
+}
+
+
 /*****************************************************************************/
 
 static inline Id dep2name(Pool *pool, Id dep)
index 5412712..fce2b2f 100644 (file)
@@ -52,7 +52,8 @@ const char *solvable_lookup_str_poollang(Solvable *s, Id keyname);
 const char *solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang, int usebase);
 int solvable_lookup_bool(Solvable *s, Id keyname);
 int solvable_lookup_void(Solvable *s, Id keyname);
-char *solvable_get_location(Solvable *s, unsigned int *medianrp);
+const char *solvable_get_location(Solvable *s, unsigned int *medianrp);
+const char *solvable_lookup_sourcepkg(Solvable *s);
 const unsigned char *solvable_lookup_bin_checksum(Solvable *s, Id keyname, Id *typep);
 const char *solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep);
 int solvable_lookup_idarray(Solvable *s, Id keyname, Queue *q);