- support header-range and sourcerpm in repo_rpmmd
authorMichael Schroeder <mls@suse.de>
Wed, 5 Mar 2008 14:04:27 +0000 (14:04 +0000)
committerMichael Schroeder <mls@suse.de>
Wed, 5 Mar 2008 14:04:27 +0000 (14:04 +0000)
- support -b and -d in rpmmd2solv

tools/CMakeLists.txt
tools/repo_rpmdb.c
tools/repo_rpmmd.c
tools/rpmmd2solv.c

index 14658e4..8534514 100644 (file)
@@ -16,7 +16,7 @@ TARGET_LINK_LIBRARIES( rpms2solv satsolver ${RPMDB_LIBRARY})
 
 SET(rpmmd2solv_REPOS rpmmd2solv.c repo_rpmmd.h repo_rpmmd.c repo_write.c common_write.c )
 ADD_EXECUTABLE( rpmmd2solv ${rpmmd2solv_REPOS} )
-TARGET_LINK_LIBRARIES( rpmmd2solv satsolver ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES( rpmmd2solv satsolver ${EXPAT_LIBRARY} ${ZLIB_LIBRARY})
 
 SET(helix2solv_REPOS helix2solv.c repo_write.c common_write.c )
 ADD_EXECUTABLE( helix2solv ${helix2solv_REPOS} )
index d569ab9..1162aa5 100644 (file)
@@ -614,6 +614,48 @@ addfileprovides(Pool *pool, Repo *repo, Repodata *repodata, Solvable *s, RpmHead
   return olddeps;
 }
 
+static void
+addsourcerpm(Pool *pool, Repodata *repodata, Solvable *s, char *sourcerpm, char *name, char *evr)
+{
+  Id entry;
+  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;
+  entry = (s - pool->solvables) - repodata->start;
+  if (!strcmp(sarch, "src.rpm"))
+    repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_SRC);
+  else if (!strcmp(sarch, "nosrc.rpm"))
+    repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
+  else
+    repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, strn2id(pool, sarch, strlen(sarch) - 4, 1));
+  if (!strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
+    repodata_set_void(repodata, entry, SOLVABLE_SOURCEEVR);
+  else
+    repodata_set_id(repodata, entry, SOLVABLE_SOURCEEVR, strn2id(pool, sevr, sarch - sevr - 1, 1));
+  if (!strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
+    repodata_set_void(repodata, entry, SOLVABLE_SOURCENAME);
+  else
+    repodata_set_id(repodata, entry, SOLVABLE_SOURCENAME, strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
+}
+
 static int
 rpm2solv(Pool *pool, Repo *repo, Repodata *repodata, Solvable *s, RpmHead *rpmhead)
 {
@@ -724,46 +766,7 @@ rpm2solv(Pool *pool, Repo *repo, Repodata *repodata, Solvable *s, RpmHead *rpmhe
       if (u32)
         repodata_set_num(repodata, entry, SOLVABLE_INSTALLSIZE, (u32 + 1023) / 1024);
       if (sourcerpm)
-       {
-         const char *p, *sevr, *sarch;
-         p = strrchr(sourcerpm, '.');
-         if (p && !strcmp(p, ".rpm"))
-           {
-             p--;
-             while (p > sourcerpm && *p != '.')
-               p--;
-             if (*p == '.' && p > sourcerpm)
-               {
-                 sarch = p-- + 1;
-                 while (p > sourcerpm && *p != '-')
-                   p--;
-                 if (*p == '-' && p > sourcerpm)
-                   {
-                     p--;
-                     while (p > sourcerpm && *p != '-')
-                       p--;
-                     if (*p == '-' && p > sourcerpm)
-                       {
-                         sevr = p + 1;
-                         if (!strcmp(sarch, "src.rpm"))
-                           repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_SRC);
-                         else if (!strcmp(sarch, "nosrc.rpm"))
-                           repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
-                         else
-                           repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, strn2id(pool, sarch, strlen(sarch) - 4, 1));
-                         if (!strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
-                           repodata_set_void(repodata, entry, SOLVABLE_SOURCEEVR);
-                         else
-                           repodata_set_id(repodata, entry, SOLVABLE_SOURCEEVR, strn2id(pool, sevr, sarch - sevr - 1, 1));
-                         if (!strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
-                           repodata_set_void(repodata, entry, SOLVABLE_SOURCENAME);
-                         else
-                           repodata_set_id(repodata, entry, SOLVABLE_SOURCENAME, strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-                       }
-                   }
-               }
-           }
-       }
+       addsourcerpm(pool, repodata, s, sourcerpm, name, evr);
     }
   sat_free(evr);
   return 1;
index 8a35775..8a87836 100644 (file)
@@ -82,6 +82,8 @@ enum state {
   STATE_SUGGESTS,
   STATE_ENHANCES,
   STATE_FRESHENS,
+  STATE_SOURCERPM,
+  STATE_HEADERRANGE,
 
   STATE_CAPS_FORMAT,
   STATE_CAPS_VENDOR,
@@ -203,6 +205,8 @@ static struct stateswitch stateswitches[] = {
   { STATE_FORMAT,      "rpm:suggests",    STATE_SUGGESTS, 0 },
   { STATE_FORMAT,      "rpm:enhances",    STATE_ENHANCES, 0 },
   { STATE_FORMAT,      "rpm:freshens",    STATE_FRESHENS, 0 },
+  { STATE_FORMAT,      "rpm:sourcerpm",   STATE_SOURCERPM, 1 },
+  { STATE_FORMAT,      "rpm:header-range", STATE_HEADERRANGE, 0 },
   { STATE_FORMAT,      "file",            STATE_FILE, 1 },
   { STATE_PROVIDES,    "rpm:entry",       STATE_PROVIDESENTRY, 0 },
   { STATE_REQUIRES,    "rpm:entry",       STATE_REQUIRESENTRY, 0 },
@@ -355,7 +359,7 @@ makeevr_atts(Pool *pool, struct parsedata *pd, const char **atts)
   return str2id(pool, pd->content, 1);
 }
 
-static const char *
+static inline const char *
 find_attr(const char *txt, const char **atts)
 {
   for (; *atts; atts += 2)
@@ -474,6 +478,51 @@ set_desciption_author(Repodata *data, Id entry, char *str)
     repodata_set_str(data, entry, SOLVABLE_DESCRIPTION, str);
 }
 
+static void
+set_sourcerpm(Repodata *data, Solvable *s, Id entry, 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;
+  name = id2str(pool, s->name);
+  evr = id2str(pool, s->evr);
+  if (!strcmp(sarch, "src.rpm"))
+    repodata_set_constantid(data, entry, SOLVABLE_SOURCEARCH, ARCH_SRC);
+  else if (!strcmp(sarch, "nosrc.rpm"))
+    repodata_set_constantid(data, entry, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
+  else
+    repodata_set_constantid(data, entry, SOLVABLE_SOURCEARCH, strn2id(pool, sarch, strlen(sarch) - 4, 1));
+  if (!strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
+    repodata_set_void(data, entry, SOLVABLE_SOURCEEVR);
+  else
+    repodata_set_id(data, entry, SOLVABLE_SOURCEEVR, strn2id(pool, sevr, sarch - sevr - 1, 1));
+  if (!strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm -
+ 1] == 0)
+    repodata_set_void(data, entry, SOLVABLE_SOURCENAME);
+  else
+    repodata_set_id(data, entry, SOLVABLE_SOURCENAME, strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
+}
+
 static void XMLCALL
 startElement(void *userData, const char *name, const char **atts)
 {
@@ -627,7 +676,7 @@ startElement(void *userData, const char *name, const char **atts)
       break;
     case STATE_TIME:
       {
-        unsigned t;
+        unsigned int t;
         str = find_attr("build", atts);
         if (str && (t = atoi(str)) != 0)
           repodata_set_num(pd->data, entry, SOLVABLE_BUILDTIME, t);
@@ -635,7 +684,7 @@ startElement(void *userData, const char *name, const char **atts)
       }
     case STATE_SIZE:
       {
-        unsigned k;
+        unsigned int k;
         str = find_attr("installed", atts);
        if (str && (k = atoi(str)) != 0)
          repodata_set_num(pd->data, entry, SOLVABLE_INSTALLSIZE, (k + 1023) / 1024);
@@ -648,6 +697,13 @@ startElement(void *userData, const char *name, const char **atts)
          repodata_set_num(pd->data, entry, SOLVABLE_DOWNLOADSIZE, (k + 1023) / 1024);
         break;
       }
+    case STATE_HEADERRANGE:
+      {
+        unsigned int end;
+        str = find_attr("end", atts);
+       if (str && (end = atoi(str)) != 0)
+         repodata_set_num(pd->data, entry, SOLVABLE_HEADEREND, end);
+      }
     default:
       break;
     }
@@ -756,6 +812,9 @@ endElement(void *userData, const char *name)
       pd->lang = 0;
       set_desciption_author(pd->data, entry, pd->content);
       break;
+    case STATE_SOURCERPM:
+      set_sourcerpm(pd->data, s, entry, pd->content);
+      break;
     default:
       break;
     }
index a4a1280..88cac02 100644 (file)
@@ -5,23 +5,59 @@
  * for further information
  */
 
+#define _GNU_SOURCE
+
 #include <sys/types.h>
 #include <limits.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
+#include <zlib.h>
 
 #include "pool.h"
 #include "repo.h"
 #include "repo_rpmmd.h"
 #include "common_write.h"
 
+
+static ssize_t
+cookie_gzread(void *cookie, char *buf, size_t nbytes)
+{
+  return gzread((gzFile *)cookie, buf, nbytes);
+}
+
+static int
+cookie_gzclose(void *cookie)
+{
+  return gzclose((gzFile *)cookie);
+}
+
+FILE *
+myfopen(const char *fn)
+{
+  cookie_io_functions_t cio;
+  char *suf;
+  gzFile *gzf;
+
+  if (!fn)
+    return 0;
+  suf = strrchr(fn, '.');
+  if (!suf || strcmp(suf, ".gz") != 0)
+    return fopen(fn, "r");
+  gzf = gzopen(fn, "r");
+  if (!gzf)
+    return 0;
+  memset(&cio, 0, sizeof(cio));
+  cio.read = cookie_gzread;
+  cio.close = cookie_gzclose;
+  return  fopencookie(gzf, "r", cio);
+}
+
 static void
-usage(const char *err)
+usage(int status)
 {
-  if (err)
-    fprintf(stderr, "\n** Error:\n  %s\n", err);
   fprintf(stderr, "\nUsage:\n"
           "rpmmd2solv [-a][-h][-k][-n <attrname>]\n"
          "  reads a 'rpmmd' repository from <stdin> and writes a .solv file to <stdout>\n"
@@ -29,48 +65,65 @@ usage(const char *err)
          "  -k : don't mix kinds (experimental!)\n"
          "  -n <name>: save attributes as <name>.attr\n"
         );
-   exit(0);
+   exit(status);
 }
 
-
 int
 main(int argc, char **argv)
 {
-  int flags = 0;
-  char *attrname = 0;
+  int c, flags = 0;
+  const char *attrname = 0;
+  const char *basefile = 0;
+  const char *dir = 0;
+
   
   Pool *pool = pool_create();
   Repo *repo = repo_create(pool, "<stdin>");
 
-  argv++;
-  argc--;
-  while (argc--)
+  while ((c = getopt (argc, argv, "hkn:b:d:")) >= 0)
+    {
+      switch(c)
+       {
+        case 'h':
+          usage(0);
+          break;
+        case 'k':
+          flags |= RPMMD_KINDS_SEPARATELY;   /* do not use! */
+          break;
+        case 'n':
+          attrname = optarg;
+          break;
+        case 'b':
+          basefile = optarg;
+          break;
+        case 'd':
+          dir = optarg;
+          break;
+        default:
+          usage(1);
+          break;
+       }
+    }
+  if (dir)
     {
-      const char *s = argv[0];
-      if (*s++ == '-')
-        while (*s)
-          switch (*s++)
-           {
-             case 'h': usage(NULL); break;
-             case 'n':
-               if (argc)
-                 {
-                   attrname = argv[1];
-                   argv++;
-                   argc--;
-                 }
-               else
-                 usage("argument required for '-n'");
-               break;
-             case 'k':
-               flags |= RPMMD_KINDS_SEPARATELY;
-             break;
-             default : break;
-           }
-      argv++;
+      FILE *fp;
+      int l;
+      char *fnp;
+      l = strlen(dir);
+      fnp = sat_malloc(l + 20);
+      sprintf(fnp, "%s/primary.xml.gz", dir);
+      if (!(fp = myfopen(fnp)))
+       {
+         perror(fnp);
+         exit(1);
+       }
+      repo_add_rpmmd(repo, fp, flags);
+      fclose(fp);
+      sat_free(fnp);
     }
-  repo_add_rpmmd(repo, stdin, flags);
-  tool_write(repo, 0, 0);
+  else
+    repo_add_rpmmd(repo, stdin, flags);
+  tool_write(repo, basefile, attrname);
   pool_free(pool);
   exit(0);
 }