2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
11 * Reads rpm database (and evtl. more, like product metadata) to build
12 * a .solv file of 'installed' solvables.
13 * Writes .solv to stdout
17 #include <sys/types.h>
27 #include "repo_rpmdb.h"
28 #include "repo_products.h"
29 #include "repo_solv.h"
30 #include "common_write.h"
35 fprintf(stderr, "\nUsage:\n"
36 "rpmdb2solv [-n] [-x] [-b <basefile>] [-p <productsdir>] [-r <root>]\n"
37 " -a <attr> : Only print this attribute, no .solv generation. E.g. '-a distribution.target'\n"
38 " -n : No packages, do not read rpmdb, useful to only parse products\n"
39 " -x : use extrapool\n"
40 " -b <basefile> : Write .solv to <basefile>.solv instead of stdout\n"
41 " -p <productsdir> : Scan <productsdir> for .prod files, representing installed products\n"
42 " -r <root> : Prefix rpmdb path and <productsdir> with <root>\n"
49 main(int argc, char **argv)
51 Pool *pool = pool_create();
60 const char *basefile = 0;
62 const char *attribute = 0;
68 while ((c = getopt (argc, argv, "a:hnxb:r:p:")) >= 0)
103 refpool = pool_create();
106 if ((fp = fopen(argv[optind], "r")) == NULL)
108 perror(argv[optind]);
111 ref = repo_create(refpool, "ref");
112 repo_add_solv(ref, fp);
113 repo_disable_paging(ref);
118 * create 'installed' repository
124 repo = repo_create(pool, "installed");
125 data = repo_add_repodata(repo, 0);
128 repo_add_rpmdb(repo, ref, root, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
130 if (proddir && *proddir)
133 /* if <root> given, not '/', and proddir does not start with <root> */
136 int rootlen = strlen(root);
137 if (strncmp(root, proddir, rootlen))
139 buf = (char *)sat_malloc(rootlen + strlen(proddir) + 2); /* + '/' + \0 */
141 if (root[rootlen - 1] != '/' && *proddir != '/')
142 buf[rootlen++] = '/';
143 strcpy(buf + rootlen, proddir);
146 repo_add_products(repo, proddir, root, attribute, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
151 repodata_internalize(data);
155 if (ref->pool != pool)
156 pool_free(ref->pool);
163 tool_write(repo, basefile, 0);