X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=tools%2Frpmdb2solv.c;h=1a04adf85d66ec165b797030b488e86e7ee4dda6;hb=f078975d65d0cace665590f3cf60025e6f2c7a0a;hp=33796ff464c03b3a465498f8ab3d80127de257b0;hpb=03c154a682036cbfee22bc62e21cef2a2fe74649;p=platform%2Fupstream%2Flibsolv.git diff --git a/tools/rpmdb2solv.c b/tools/rpmdb2solv.c index 33796ff..1a04adf 100644 --- a/tools/rpmdb2solv.c +++ b/tools/rpmdb2solv.c @@ -15,8 +15,6 @@ */ #include -#include -#include #include #include #include @@ -25,21 +23,31 @@ #include "pool.h" #include "repo.h" #include "repo_rpmdb.h" +#ifdef ENABLE_PUBKEY +#include "repo_pubkey.h" +#endif #include "repo_products.h" #include "repo_solv.h" #include "common_write.h" +#ifdef ENABLE_APPDATA +#include "repo_appdata.h" +#endif +#ifdef SUSE +#include "repo_autopattern.h" +#endif + static void usage(int status) { fprintf(stderr, "\nUsage:\n" - "rpmdb2solv [-n] [-x] [-b ] [-p ] [-r ]\n" + "rpmdb2solv [-P] [-C] [-n] [-b ] [-p ] [-r ]\n" " -n : No packages, do not read rpmdb, useful to only parse products\n" - " -x : use extrapool\n" - " -b : Write .solv to .solv instead of stdout\n" " -p : Scan for .prod files, representing installed products\n" " -r : Prefix rpmdb path and with \n" " -o : Write .solv to file instead of stdout\n" + " -P : print percentage done\n" + " -C : include the changelog\n" ); exit(status); } @@ -48,26 +56,34 @@ usage(int status) int main(int argc, char **argv) { + FILE *reffp = 0; Pool *pool = pool_create(); - Repo *repo, *ref = 0; + Repo *repo; Repodata *data; - Pool *refpool; int c, percent = 0; - int extrapool = 0; int nopacks = 0; + int add_changelog = 0; const char *root = 0; - const char *basefile = 0; const char *refname = 0; #ifdef ENABLE_SUSEREPO char *proddir = 0; #endif char *outfile = 0; +#ifdef ENABLE_PUBKEY + int pubkeys = 0; +#endif +#ifdef ENABLE_APPDATA + int add_appdata = 0; +#endif +#ifdef SUSE + int add_auto = 0; +#endif /* * parse arguments */ - while ((c = getopt(argc, argv, "Phnxb:r:p:o:")) >= 0) + while ((c = getopt(argc, argv, "ACPhnkxXr:p:o:")) >= 0) switch (c) { case 'h': @@ -76,9 +92,6 @@ main(int argc, char **argv) case 'r': root = optarg; break; - case 'b': - basefile = optarg; - break; case 'n': nopacks = 1; break; @@ -91,11 +104,29 @@ main(int argc, char **argv) #endif break; case 'x': - extrapool = 1; - break; + break; /* extrapool no longer supported */ + case 'X': +#ifdef SUSE + add_auto = 1; +#endif + break; + case 'A': +#ifdef ENABLE_APPDATA + add_appdata = 1; +#endif + break; case 'o': outfile = optarg; break; +#ifdef ENABLE_PUBKEY + case 'k': + nopacks = 1; + pubkeys = 1; + break; +#endif + case 'C': + add_changelog = 1; + break; default: usage(1); } @@ -114,24 +145,10 @@ main(int argc, char **argv) if (optind < argc) refname = argv[optind]; - if (refname) + if (refname && !nopacks) { - FILE *fp; - if ((fp = fopen(refname, "r")) == NULL) - { - perror(refname); - } - else - { - if (extrapool) - refpool = pool_create(); - else - refpool = pool; - ref = repo_create(refpool, "ref"); - repo_add_solv(ref, fp, 0); - repo_disable_paging(ref); - fclose(fp); - } + if ((reffp = fopen(refname, "r")) == NULL) + perror(refname); } /* @@ -141,46 +158,75 @@ main(int argc, char **argv) * write .solv */ + if (root && *root) + pool_set_rootdir(pool, root); + repo = repo_create(pool, "installed"); data = repo_add_repodata(repo, 0); if (!nopacks) - repo_add_rpmdb(repo, ref, root, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | (percent ? RPMDB_REPORT_PROGRESS : 0)); + { + int flags = REPO_USE_ROOTDIR | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE; + if (percent) + flags |= RPMDB_REPORT_PROGRESS; + if (add_changelog) + flags |= RPM_ADD_WITH_CHANGELOG; + if (repo_add_rpmdb_reffp(repo, reffp, flags)) + { + fprintf(stderr, "rpmdb2solv: %s\n", pool_errstr(pool)); + exit(1); + } + } +#ifdef ENABLE_PUBKEY + if (pubkeys) + { + if (repo_add_rpmdb_pubkeys(repo, REPO_USE_ROOTDIR | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | ADD_WITH_KEYSIGNATURES)) + { + fprintf(stderr, "rpmdb2solv: %s\n", pool_errstr(pool)); + exit(1); + } + } +#endif #ifdef ENABLE_SUSEREPO if (proddir && *proddir) { - char *buf = proddir; - /* if given, not '/', and proddir does not start with */ if (root && *root) { int rootlen = strlen(root); - if (strncmp(root, proddir, rootlen)) + if (!strncmp(root, proddir, rootlen)) { - buf = (char *)solv_malloc(rootlen + strlen(proddir) + 2); /* + '/' + \0 */ - strcpy(buf, root); - if (root[rootlen - 1] != '/' && *proddir != '/') - buf[rootlen++] = '/'; - strcpy(buf + rootlen, proddir); + proddir += rootlen; + if (*proddir != '/' && proddir[-1] == '/') + proddir--; } } - repo_add_products(repo, buf, root, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); - if (buf != proddir) - solv_free(buf); + if (repo_add_products(repo, proddir, REPO_USE_ROOTDIR | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE)) + { + fprintf(stderr, "rpmdb2solv: %s\n", pool_errstr(pool)); + exit(1); + } } #endif - repodata_internalize(data); - if (ref) +#ifdef ENABLE_APPDATA + if (add_appdata) { - if (ref->pool != pool) - pool_free(ref->pool); - else - repo_free(ref, 1); - ref = 0; + repo_add_appdata_dir(repo, "/usr/share/metainfo", REPO_USE_ROOTDIR | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | APPDATA_SEARCH_UNINTERNALIZED_FILELIST); + repo_add_appdata_dir(repo, "/usr/share/appdata", REPO_USE_ROOTDIR | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | APPDATA_SEARCH_UNINTERNALIZED_FILELIST); } +#endif + repodata_internalize(data); + + if (reffp) + fclose(reffp); + +#ifdef SUSE + if (add_auto) + repo_add_autopattern(repo, ADD_NO_AUTOPRODUCTS); +#endif - tool_write(repo, basefile, 0); + tool_write(repo, stdout); pool_free(pool); exit(0); }