X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Fsusetags2solv.c;h=19278dbf780151ced82192e5fc67c516fb0bacfa;hb=c948f862b552adbe2cdee24096357b887dfbb088;hp=753b86c8609e21618ea8cd1e6caef954e5ae2d67;hpb=62fddf51deb4b77196f7e3ccd937a91ff23b5cb9;p=platform%2Fupstream%2Flibsolv.git diff --git a/tools/susetags2solv.c b/tools/susetags2solv.c index 753b86c..19278db 100644 --- a/tools/susetags2solv.c +++ b/tools/susetags2solv.c @@ -8,70 +8,38 @@ #define _GNU_SOURCE #include -#include -#include #include #include #include #include -#include -#include +#include #include "pool.h" #include "repo.h" +#include "repo_solv.h" #include "repo_susetags.h" #include "repo_content.h" +#ifdef SUSE +#include "repo_autopattern.h" +#endif #include "common_write.h" +#include "solv_xfopen.h" static void usage(int status) { fprintf(stderr, "\nUsage:\n" - "susetags2solv [-b ][-c ][-d ][-h][-k][-n ]\n" + "susetags2solv [-b ][-c ][-d ][-h][-n ]\n" " reads a 'susetags' repository from and writes a .solv file to \n" " -b : save as multiple files starting with \n" " -c : parse given contentfile (for product information)\n" " -d : do not read from stdin, but use data in descrdir\n" " -h : print help & exit\n" - " -k : don't mix kinds (experimental!)\n" " -n : save attributes as .attr\n" ); exit(status); } -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); -} - /* content file query */ static void doquery(Pool *pool, Repo *repo, const char *arg) @@ -81,7 +49,7 @@ doquery(Pool *pool, Repo *repo, const char *arg) Id id; snprintf(qbuf, sizeof(qbuf), "susetags:%s", arg); - id = str2id(pool, qbuf, 0); + id = pool_str2id(pool, qbuf, 0); if (!id) return; str = repo_lookup_str(repo, SOLVID_META, id); @@ -97,20 +65,23 @@ main(int argc, char **argv) const char *descrdir = 0; const char *basefile = 0; const char *query = 0; + const char *mergefile = 0; Id defvendor = 0; int flags = 0; +#ifdef SUSE + int add_auto = 0; +#endif int c; + Pool *pool; + Repo *repo; - while ((c = getopt(argc, argv, "hkn:c:d:b:q:")) >= 0) + while ((c = getopt(argc, argv, "hn:c:d:b:q:M:X")) >= 0) { switch (c) { case 'h': usage(0); break; - case 'k': - flags |= SUSETAGS_KINDS_SEPARATELY; /* do not use! */ - break; case 'n': attrname = optarg; break; @@ -126,28 +97,38 @@ main(int argc, char **argv) case 'q': query = optarg; break; + case 'M': + mergefile = optarg; + break; + case 'X': +#ifdef SUSE + add_auto = 1; +#endif + break; default: usage(1); break; } } - Pool *pool = pool_create(); - Repo *repo = repo_create(pool, ""); + pool = pool_create(); + repo = repo_create(pool, ""); repo_add_repodata(repo, 0); if (contentfile) { - FILE *fp = fopen (contentfile, "r"); + FILE *fp = fopen(contentfile, "r"); if (!fp) { perror(contentfile); exit(1); } - repo_add_content(repo, fp, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); - if (repo->start < repo->end) - if (!strncmp(id2str(pool, pool->solvables[repo->start].name), "product:", 8)) - defvendor = pool->solvables[repo->start].vendor; + if (repo_add_content(repo, fp, REPO_REUSE_REPODATA)) + { + fprintf(stderr, "susetags2solv: %s: %s\n", contentfile, pool_errstr(pool)); + exit(1); + } + defvendor = repo_lookup_id(repo, SOLVID_META, SUSETAGS_DEFAULTVENDOR); fclose(fp); } @@ -201,46 +182,60 @@ main(int argc, char **argv) files[0] = de; } - fnp = sat_malloc(strlen(descrdir) + 128); + fnp = solv_malloc(strlen(descrdir) + 128); for (i = 0; i < ndirs; i++) { char *fn = files[i]->d_name; if (!strcmp(fn, "packages") || !strcmp(fn, "packages.gz")) { + FILE *fp; sprintf(fnp, "%s/%s", descrdir, fn); - FILE *fp = myfopen(fnp); + fp = solv_xfopen(fnp, 0); if (!fp) { perror(fn); exit(1); } - repo_add_susetags(repo, fp, defvendor, 0, flags | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); + if (repo_add_susetags(repo, fp, defvendor, 0, flags | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE)) + { + fprintf(stderr, "susetags2solv: %s: %s\n", fnp, pool_errstr(pool)); + exit(1); + } fclose(fp); } else if (!strcmp(fn, "packages.DU") || !strcmp(fn, "packages.DU.gz")) { + FILE *fp; sprintf(fnp, "%s/%s", descrdir, fn); - FILE *fp = myfopen(fnp); + fp = solv_xfopen(fnp, 0); if (!fp) { perror(fn); exit(1); } - repo_add_susetags(repo, fp, defvendor, 0, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); + if (repo_add_susetags(repo, fp, defvendor, 0, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE)) + { + fprintf(stderr, "susetags2solv: %s: %s\n", fnp, pool_errstr(pool)); + exit(1); + } fclose(fp); } else if (!strcmp(fn, "packages.FL") || !strcmp(fn, "packages.FL.gz")) { #if 0 sprintf(fnp, "%s/%s", descrdir, fn); - FILE *fp = myfopen(fnp); + FILE *fp = solv_xfopen(fnp, 0); if (!fp) { perror(fn); exit(1); } - repo_add_susetags(repo, fp, defvendor, 0, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); + if (repo_add_susetags(repo, fp, defvendor, 0, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE)) + { + fprintf(stderr, "susetags2solv: %s: %s\n", fnp, pool_errstr(pool)); + exit(1); + } fclose(fp); #else /* ignore for now. reactivate when filters work */ @@ -251,6 +246,7 @@ main(int argc, char **argv) { char lang[6]; char *p; + FILE *fp; sprintf(fnp, "%s/%s", descrdir, fn); p = strrchr(fnp, '.'); if (p && !strcmp(p, ".gz")) @@ -262,13 +258,17 @@ main(int argc, char **argv) continue; strcpy(lang, p + 1); sprintf(fnp, "%s/%s", descrdir, fn); - FILE *fp = myfopen(fnp); + fp = solv_xfopen(fnp, 0); if (!fp) { perror(fn); exit(1); } - repo_add_susetags(repo, fp, defvendor, lang, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); + if (repo_add_susetags(repo, fp, defvendor, lang, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE)) + { + fprintf(stderr, "susetags2solv: %s: %s\n", fnp, pool_errstr(pool)); + exit(1); + } fclose(fp); } } @@ -279,9 +279,34 @@ main(int argc, char **argv) repo_internalize(repo); } else - /* read data from stdin */ - repo_add_susetags(repo, stdin, defvendor, 0, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); + { + /* read data from stdin */ + if (repo_add_susetags(repo, stdin, defvendor, 0, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE)) + { + fprintf(stderr, "susetags2solv: %s\n", pool_errstr(pool)); + exit(1); + } + } repo_internalize(repo); + if (mergefile) + { + FILE *fp = fopen(mergefile, "r"); + if (!fp) + { + perror(mergefile); + exit(1); + } + if (repo_add_solv(repo, fp, 0)) + { + fprintf(stderr, "susetags2solv: %s\n", pool_errstr(pool)); + exit(1); + } + fclose(fp); + } +#ifdef SUSE + if (add_auto) + repo_add_autopattern(repo, 0); +#endif if (query) doquery(pool, repo, query);