From fff7d7468ec8da18eeb982d0e077efe7feb3605d Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 5 Mar 2008 14:04:27 +0000 Subject: [PATCH] - support header-range and sourcerpm in repo_rpmmd - support -b and -d in rpmmd2solv --- tools/CMakeLists.txt | 2 +- tools/repo_rpmdb.c | 83 ++++++++++++++++++----------------- tools/repo_rpmmd.c | 65 +++++++++++++++++++++++++-- tools/rpmmd2solv.c | 121 ++++++++++++++++++++++++++++++++++++--------------- 4 files changed, 193 insertions(+), 78 deletions(-) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 14658e4..8534514 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -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} ) diff --git a/tools/repo_rpmdb.c b/tools/repo_rpmdb.c index d569ab9..1162aa5 100644 --- a/tools/repo_rpmdb.c +++ b/tools/repo_rpmdb.c @@ -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; diff --git a/tools/repo_rpmmd.c b/tools/repo_rpmmd.c index 8a35775..8a87836 100644 --- a/tools/repo_rpmmd.c +++ b/tools/repo_rpmmd.c @@ -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; } diff --git a/tools/rpmmd2solv.c b/tools/rpmmd2solv.c index a4a1280..88cac02 100644 --- a/tools/rpmmd2solv.c +++ b/tools/rpmmd2solv.c @@ -5,23 +5,59 @@ * for further information */ +#define _GNU_SOURCE + #include #include #include #include #include #include +#include +#include #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 ]\n" " reads a 'rpmmd' repository from and writes a .solv file to \n" @@ -29,48 +65,65 @@ usage(const char *err) " -k : don't mix kinds (experimental!)\n" " -n : save attributes as .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, ""); - 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); } -- 2.7.4