X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fsolv.c;h=fc420b3f9046ec189641b21b65b18c733b1c02b9;hb=refs%2Ftags%2Fupstream%2F0.6.12;hp=5d8e31e2c14712a5e2fbd74f34b1bca7a1b9a39e;hpb=1394005510987fd14288dcad65326c29ce25629a;p=platform%2Fupstream%2Flibsolv.git diff --git a/examples/solv.c b/examples/solv.c index 5d8e31e..fc420b3 100644 --- a/examples/solv.c +++ b/examples/solv.c @@ -64,6 +64,9 @@ #include "repo_rpmdb.h" #include "pool_fileconflicts.h" #endif +#ifdef ENABLE_PUBKEY +#include "repo_pubkey.h" +#endif #ifdef ENABLE_DEBIAN #include "repo_deb.h" #endif @@ -73,11 +76,17 @@ #include "repo_updateinfoxml.h" #include "repo_deltainfoxml.h" #endif +#ifdef ENABLE_APPDATA +#include "repo_appdata.h" +#endif #ifdef ENABLE_SUSEREPO #include "repo_products.h" #include "repo_susetags.h" #include "repo_content.h" #endif +#ifdef SUSE +#include "repo_autopattern.h" +#endif #include "solv_xfopen.h" #ifdef FEDORA @@ -88,6 +97,9 @@ # define PRODUCTS_PATH "/etc/products.d" # define SOFTLOCKS_PATH "/var/lib/zypp/SoftLocks" #endif +#ifdef ENABLE_APPDATA +# define APPDATA_PATH "/usr/share/appdata" +#endif #define SOLVCACHE_PATH "/var/cache/solv" @@ -112,8 +124,8 @@ struct repoinfo { int metadata_expire; char **components; int ncomponents; - unsigned char cookie[32]; + int extcookieset; unsigned char extcookie[32]; int incomplete; }; @@ -145,7 +157,7 @@ yum_substitute(Pool *pool, char *line) Queue q; queue_init(&q); - rpmstate = rpm_state_create(pool_get_rootdir(pool)); + rpmstate = rpm_state_create(pool, pool_get_rootdir(pool)); rpm_installedrpmdbids(rpmstate, "Providename", "redhat-release", &q); if (q.count) { @@ -204,7 +216,6 @@ yum_substitute(Pool *pool, char *line) #define TYPE_PLAINDIR 3 #define TYPE_DEBIAN 4 -#ifndef NOSYSTEM static int read_repoinfos_sort(const void *ap, const void *bp) { @@ -212,7 +223,6 @@ read_repoinfos_sort(const void *ap, const void *bp) const struct repoinfo *b = bp; return strcmp(a->alias, b->alias); } -#endif #if defined(SUSE) || defined(FEDORA) @@ -466,15 +476,6 @@ read_repoinfos(Pool *pool, int *nrepoinfosp) #endif -#ifdef NOSYSTEM -struct repoinfo * -read_repoinfos(Pool *pool, int *nrepoinfosp) -{ - *nrepoinfosp = 0; - return 0; -} -#endif - void free_repoinfos(struct repoinfo *repoinfos, int nrepoinfos) @@ -518,7 +519,7 @@ verify_checksum(int fd, const char *file, const unsigned char *chksum, Id chksum { char buf[1024]; const unsigned char *sum; - void *h; + Chksum *h; int l; h = solv_chksum_create(chksumtype); @@ -970,7 +971,7 @@ checksig(Pool *sigpool, FILE *fp, FILE *sigfp) lseek(fileno(fp), 0, SEEK_SET); possigfp = lseek(fileno(sigfp), 0, SEEK_CUR); lseek(fileno(sigfp), 0, SEEK_SET); - snprintf(cmd, sizeof(cmd), "gpg -q --homedir %s --verify /dev/fd/%d /dev/fd/%d >/dev/null 2>&1", gpgdir, fileno(sigfp), fileno(fp)); + snprintf(cmd, sizeof(cmd), "gpgv -q --homedir %s --keyring %s/pubring.gpg /dev/fd/%d /dev/fd/%d >/dev/null 2>&1", gpgdir, gpgdir, fileno(sigfp), fileno(fp)); fcntl(fileno(fp), F_SETFD, 0); /* clear CLOEXEC */ fcntl(fileno(sigfp), F_SETFD, 0); /* clear CLOEXEC */ r = system(cmd); @@ -1005,8 +1006,8 @@ static Pool * read_sigs() { Pool *sigpool = pool_create(); -#if defined(ENABLE_RPMDB_PUBKEY) - Repo *repo = repo_create(sigpool, "rpmdbkeys"); +#if defined(ENABLE_PUBKEY) && defined(ENABLE_RPMDB) + Repo *repo = repo_create(sigpool, "pubkeys"); repo_add_rpmdb_pubkeys(repo, 0); #endif return sigpool; @@ -1040,7 +1041,7 @@ void calc_checksum_fp(FILE *fp, Id chktype, unsigned char *out) { char buf[4096]; - void *h = solv_chksum_create(chktype); + Chksum *h = solv_chksum_create(chktype); int l; solv_chksum_add(h, CHKSUM_IDENT, strlen(CHKSUM_IDENT)); @@ -1053,7 +1054,7 @@ calc_checksum_fp(FILE *fp, Id chktype, unsigned char *out) void calc_checksum_stat(struct stat *stb, Id chktype, unsigned char *cookie, unsigned char *out) { - void *h = solv_chksum_create(chktype); + Chksum *h = solv_chksum_create(chktype); solv_chksum_add(h, CHKSUM_IDENT, strlen(CHKSUM_IDENT)); if (cookie) solv_chksum_add(h, cookie, 32); @@ -1076,10 +1077,19 @@ setarch(Pool *pool) pool_setarch(pool, un.machine); } +char *userhome; + char * -calccachepath(Repo *repo, const char *repoext) +calccachepath(Repo *repo, const char *repoext, int forcesystemloc) { - char *q, *p = pool_tmpjoin(repo->pool, SOLVCACHE_PATH, "/", repo->name); + char *q, *p; + int l; + if (!forcesystemloc && userhome && getuid()) + p = pool_tmpjoin(repo->pool, userhome, "/.solvcache/", 0); + else + p = pool_tmpjoin(repo->pool, SOLVCACHE_PATH, "/", 0); + l = strlen(p); + p = pool_tmpappend(repo->pool, p, repo->name, 0); if (repoext) { p = pool_tmpappend(repo->pool, p, "_", repoext); @@ -1087,7 +1097,7 @@ calccachepath(Repo *repo, const char *repoext) } else p = pool_tmpappend(repo->pool, p, ".solv", 0); - q = p + strlen(SOLVCACHE_PATH) + 1; + q = p + l; if (*q == '.') *q = '_'; for (; *q; q++) @@ -1104,16 +1114,26 @@ usecachedrepo(Repo *repo, const char *repoext, unsigned char *cookie, int mark) unsigned char myextcookie[32]; struct repoinfo *cinfo; int flags; + int forcesystemloc; + forcesystemloc = mark & 2 ? 0 : 1; + if (mark < 2 && userhome && getuid()) + { + /* first try home location */ + int res = usecachedrepo(repo, repoext, cookie, mark | 2); + if (res) + return res; + } + mark &= 1; cinfo = repo->appdata; - if (!(fp = fopen(calccachepath(repo, repoext), "r"))) + if (!(fp = fopen(calccachepath(repo, repoext, forcesystemloc), "r"))) return 0; if (fseek(fp, -sizeof(mycookie), SEEK_END) || fread(mycookie, sizeof(mycookie), 1, fp) != 1) { fclose(fp); return 0; } - if (cookie && memcmp(cookie, mycookie, sizeof(mycookie))) + if (cookie && memcmp(cookie, mycookie, sizeof(mycookie)) != 0) { fclose(fp); return 0; @@ -1145,6 +1165,7 @@ usecachedrepo(Repo *repo, const char *repoext, unsigned char *cookie, int mark) { memcpy(cinfo->cookie, mycookie, sizeof(mycookie)); memcpy(cinfo->extcookie, myextcookie, sizeof(myextcookie)); + cinfo->extcookieset = 1; } if (mark) futimens(fileno(fp), 0); /* try to set modification time */ @@ -1153,20 +1174,22 @@ usecachedrepo(Repo *repo, const char *repoext, unsigned char *cookie, int mark) } void -writecachedrepo(Repo *repo, Repodata *info, const char *repoext, unsigned char *cookie) +writecachedrepo(Repo *repo, Repodata *repodata, const char *repoext, unsigned char *cookie) { FILE *fp; int i, fd; - char *tmpl; + char *tmpl, *cachedir; struct repoinfo *cinfo; int onepiece; cinfo = repo->appdata; if (cinfo && cinfo->incomplete) return; - mkdir(SOLVCACHE_PATH, 0755); + cachedir = userhome && getuid() ? pool_tmpjoin(repo->pool, userhome, "/.solvcache", 0) : SOLVCACHE_PATH; + if (access(cachedir, W_OK | X_OK) != 0 && mkdir(cachedir, 0755) == 0) + printf("[created %s]\n", cachedir); /* use dupjoin instead of tmpjoin because tmpl must survive repo_write */ - tmpl = solv_dupjoin(SOLVCACHE_PATH, "/", ".newsolv-XXXXXX"); + tmpl = solv_dupjoin(cachedir, "/", ".newsolv-XXXXXX"); fd = mkstemp(tmpl); if (fd < 0) { @@ -1189,22 +1212,22 @@ writecachedrepo(Repo *repo, Repodata *info, const char *repoext, unsigned char * if (i < repo->end) onepiece = 0; - if (!info) + if (!repodata) repo_write(repo, fp); else if (repoext) - repodata_write(info, fp); + repodata_write(repodata, fp); else { int oldnrepodata = repo->nrepodata; repo->nrepodata = oldnrepodata > 2 ? 2 : oldnrepodata; /* XXX: do this right */ repo_write(repo, fp); repo->nrepodata = oldnrepodata; - onepiece = 0; + onepiece = 0; /* don't bother for the added file provides */ } if (!repoext && cinfo) { - if (!cinfo->extcookie[0]) + if (!cinfo->extcookieset) { /* create the ext cookie and append it */ /* we just need some unique ID */ @@ -1212,8 +1235,7 @@ writecachedrepo(Repo *repo, Repodata *info, const char *repoext, unsigned char * if (!fstat(fileno(fp), &stb)) memset(&stb, 0, sizeof(stb)); calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, cookie, cinfo->extcookie); - if (cinfo->extcookie[0] == 0) - cinfo->extcookie[0] = 1; + cinfo->extcookieset = 1; } if (fwrite(cinfo->extcookie, 32, 1, fp) != 1) { @@ -1259,17 +1281,17 @@ writecachedrepo(Repo *repo, Repodata *info, const char *repoext, unsigned char * int flags = REPO_USE_LOADING|REPO_EXTEND_SOLVABLES; /* make sure repodata contains complete repo */ /* (this is how repodata_write saves it) */ - repodata_extend_block(info, repo->start, repo->end - repo->start); - info->state = REPODATA_LOADING; + repodata_extend_block(repodata, repo->start, repo->end - repo->start); + repodata->state = REPODATA_LOADING; if (strcmp(repoext, "DL") != 0) flags |= REPO_LOCALPOOL; repo_add_solv(repo, fp, flags); - info->state = REPODATA_AVAILABLE; /* in case the load failed */ + repodata->state = REPODATA_AVAILABLE; /* in case the load failed */ } fclose(fp); } } - if (!rename(tmpl, calccachepath(repo, repoext))) + if (!rename(tmpl, calccachepath(repo, repoext, 0))) unlink(tmpl); free(tmpl); } @@ -1378,7 +1400,8 @@ repomd_load_ext(Repo *repo, Repodata *data) printf("%s\n", pool_errstr(repo->pool)); return 0; } - writecachedrepo(repo, data, ext, cinfo->extcookie); + if (cinfo->extcookieset) + writecachedrepo(repo, data, ext, cinfo->extcookie); return 1; } @@ -1524,7 +1547,8 @@ susetags_load_ext(Repo *repo, Repodata *data) return 0; } fclose(fp); - writecachedrepo(repo, data, ext, cinfo->extcookie); + if (cinfo->extcookieset) + writecachedrepo(repo, data, ext, cinfo->extcookie); return 1; } #endif @@ -1700,6 +1724,7 @@ read_repos(Pool *pool, struct repoinfo *repoinfos, int nrepoinfos) #endif repo = repo_create(pool, "@System"); + memset(&stb, 0, sizeof(stb)); #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA)) printf("rpm database:"); if (stat(pool_prepend_rootdir_tmp(pool, "/var/lib/rpm/Packages"), &stb)) @@ -1710,54 +1735,48 @@ read_repos(Pool *pool, struct repoinfo *repoinfos, int nrepoinfos) if (stat(pool_prepend_rootdir_tmp(pool, "/var/lib/dpkg/status"), &stb)) memset(&stb, 0, sizeof(stb)); #endif -#ifdef NOSYSTEM - printf("no installed database:"); - memset(&stb, 0, sizeof(stb)); -#endif calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, 0, installedcookie); if (usecachedrepo(repo, 0, installedcookie, 0)) printf(" cached\n"); else { #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA)) - FILE *ofp; - Repo *ref = 0; + FILE *ofp = 0; #endif printf(" reading\n"); #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA)) # if defined(ENABLE_SUSEREPO) && defined(PRODUCTS_PATH) - if (repo_add_products(repo, PRODUCTS_PATH, REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR)) + if (repo_add_products(repo, PRODUCTS_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR)) { fprintf(stderr, "product reading failed: %s\n", pool_errstr(pool)); exit(1); } # endif - if ((ofp = fopen(calccachepath(repo, 0), "r")) != 0) +# if defined(ENABLE_APPDATA) + if (repo_add_appdata_dir(repo, APPDATA_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR)) { - ref = repo_create(pool, "@System.old"); - if (repo_add_solv(ref, ofp, 0)) - { - repo_free(ref, 1); - ref = 0; - } - fclose(ofp); + fprintf(stderr, "appdata reading failed: %s\n", pool_errstr(pool)); + exit(1); } - if (repo_add_rpmdb(repo, ref, REPO_REUSE_REPODATA | REPO_USE_ROOTDIR)) +# endif + ofp = fopen(calccachepath(repo, 0, 0), "r"); + if (repo_add_rpmdb_reffp(repo, ofp, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR)) { fprintf(stderr, "installed db: %s\n", pool_errstr(pool)); exit(1); } - if (ref) - repo_free(ref, 1); + if (ofp) + fclose(ofp); #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) - if (repo_add_debdb(repo, REPO_REUSE_REPODATA | REPO_USE_ROOTDIR)) + if (repo_add_debdb(repo, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR)) { fprintf(stderr, "installed db: %s\n", pool_errstr(pool)); exit(1); } #endif + repo_internalize(repo); writecachedrepo(repo, 0, 0, installedcookie); } pool_set_installed(pool, repo); @@ -1774,7 +1793,7 @@ read_repos(Pool *pool, struct repoinfo *repoinfos, int nrepoinfos) repo->priority = 99 - cinfo->priority; dorefresh = cinfo->autorefresh; - if (dorefresh && cinfo->metadata_expire && stat(calccachepath(repo, 0), &stb) == 0) + if (dorefresh && cinfo->metadata_expire && stat(calccachepath(repo, 0, 0), &stb) == 0) { if (cinfo->metadata_expire == -1 || time(0) - stb.st_mtime < cinfo->metadata_expire) dorefresh = 0; @@ -1842,6 +1861,18 @@ read_repos(Pool *pool, struct repoinfo *repoinfos, int nrepoinfos) fclose(fp); } +#ifdef ENABLE_APPDATA + filename = repomd_find(repo, "appdata", &filechksum, &filechksumtype); + if (filename && (fp = curlfopen(cinfo, filename, iscompressed(filename), filechksum, filechksumtype, 1)) != 0) + { + if (repo_add_appdata(repo, fp, 0)) + { + printf("appdata: %s\n", pool_errstr(pool)); + cinfo->incomplete = 1; + } + fclose(fp); + } +#endif data = repo_add_repodata(repo, 0); if (!repomd_add_ext(repo, data, "deltainfo")) repomd_add_ext(repo, data, "prestodelta"); @@ -1952,6 +1983,20 @@ read_repos(Pool *pool, struct repoinfo *repoinfos, int nrepoinfos) fclose(fp); } } +#ifdef ENABLE_APPDATA + filename = susetags_find(repo, "appdata.xml.gz", &filechksum, &filechksumtype); + if (!filename) + filename = susetags_find(repo, "appdata.xml", &filechksum, &filechksumtype); + if (filename && (fp = curlfopen(cinfo, pool_tmpjoin(pool, descrdir, "/", filename), iscompressed(filename), filechksum, filechksumtype, 1)) != 0) + { + if (repo_add_appdata(repo, fp, 0)) + { + printf("appdata: %s\n", pool_errstr(pool)); + cinfo->incomplete = 1; + } + fclose(fp); + } +#endif repo_internalize(repo); data = repo_add_repodata(repo, 0); susetags_add_ext(repo, data); @@ -2084,7 +2129,7 @@ fileconflict_cb(Pool *pool, Id p, void *cbdata) rpmdbid = s->repo->rpmdbid[p - s->repo->start]; if (!rpmdbid) return 0; - return rpm_byrpmdbid(fcstate->rpmstate, rpmdbid); + return rpm_byrpmdbid(fcstate->rpmstate, rpmdbid); } for (i = 0; i < fcstate->newpkgscnt; i++) if (fcstate->checkq->elements[i] == p) @@ -2185,28 +2230,6 @@ rundpkg(const char *arg, const char *name, int dupfd3, const char *rootdir) static Id nscallback(Pool *pool, void *data, Id name, Id evr) { - if (name == NAMESPACE_PRODUCTBUDDY) - { - /* SUSE specific hack: each product has an associated rpm */ - Solvable *s = pool->solvables + evr; - Id p, pp, cap; - Id bestp = 0; - - cap = pool_str2id(pool, pool_tmpjoin(pool, "product(", pool_id2str(pool, s->name) + 8, ")"), 0); - if (!cap) - return 0; - cap = pool_rel2id(pool, cap, s->evr, REL_EQ, 0); - if (!cap) - return 0; - FOR_PROVIDES(p, pp, cap) - { - Solvable *ps = pool->solvables + p; - if (ps->repo == s->repo && ps->arch == s->arch) - if (!bestp || pool_evrcmp(pool, pool->solvables[bestp].evr, ps->evr, EVRCMP_COMPARE) < 0) - bestp = p; - } - return bestp; - } #if 0 if (name == NAMESPACE_LANGUAGE) { @@ -2288,6 +2311,8 @@ rewrite_repos(Pool *pool, Queue *addedfileprovides, Queue *addedfileprovides_ins if (repo->nrepodata < 2) continue; cinfo = repo->appdata; + if (repo != pool->installed && !cinfo) + continue; if (cinfo && cinfo->incomplete) continue; data = repo_id2repodata(repo, 1); @@ -2351,6 +2376,17 @@ addfileprovides(Pool *pool) #endif +#ifdef SUSE +static void +add_autopackages(Pool *pool) +{ + int i; + Repo *repo; + FOR_REPOS(i, repo) + repo_add_autopattern(repo, 0); +} +#endif + #if defined(SUSE) || defined(FEDORA) static void add_patchjobs(Pool *pool, Queue *job) @@ -2416,6 +2452,7 @@ showdiskusagechanges(Transaction *trans) int i; /* XXX: use mountpoints here */ + memset(duc, 0, sizeof(duc)); duc[0].path = "/"; duc[1].path = "/usr/share/man"; duc[2].path = "/sbin"; @@ -2581,12 +2618,26 @@ main(int argc, char **argv) Transaction *trans; FILE **newpkgsfps; Queue repofilter; + Queue kindfilter; + Queue archfilter; + int archfilter_src = 0; int cleandeps = 0; int forcebest = 0; char *rootdir = 0; + char *keyname = 0; + int debuglevel = 0; argc--; argv++; + userhome = getenv("HOME"); + if (userhome && userhome[0] != '/') + userhome = 0; + while (argc && !strcmp(argv[0], "-d")) + { + debuglevel++; + argc--; + argv++; + } if (!argv[0]) usage(1); if (!strcmp(argv[0], "install") || !strcmp(argv[0], "in")) @@ -2606,7 +2657,7 @@ main(int argc, char **argv) mainmode = MODE_ERASE; mode = SOLVER_ERASE; } - else if (!strcmp(argv[0], "list")) + else if (!strcmp(argv[0], "list") || !strcmp(argv[0], "ls")) { mainmode = MODE_LIST; mode = 0; @@ -2652,7 +2703,6 @@ main(int argc, char **argv) argc -= 2; argv += 2; } - else if (argc > 1 && !strcmp(argv[1], "--clean")) { cleandeps = 1; @@ -2665,6 +2715,12 @@ main(int argc, char **argv) argc--; argv++; } + if (argc > 2 && !strcmp(argv[1], "--keyname")) + { + keyname = argv[2]; + argc -= 2; + argv += 2; + } else break; } @@ -2683,8 +2739,10 @@ main(int argc, char **argv) #ifdef SUSE pool->nscallback = nscallback; #endif - // pool_setdebuglevel(pool, 2); + if (debuglevel) + pool_setdebuglevel(pool, debuglevel); setarch(pool); + pool_set_flag(pool, POOL_FLAG_ADDFILEPROVIDESFILTERED, 1); repoinfos = read_repoinfos(pool, &nrepoinfos); if (mainmode == MODE_REPOLIST) @@ -2702,47 +2760,89 @@ main(int argc, char **argv) read_repos(pool, repoinfos, nrepoinfos); - /* setup repofilter */ + /* setup filters */ queue_init(&repofilter); - while (argc > 2 && !strcmp(argv[1], "-r")) + queue_init(&kindfilter); + queue_init(&archfilter); + while (argc > 1) { - const char *rname = argv[2], *rp; - Id repoid = 0; - for (rp = rname; *rp; rp++) - if (*rp <= '0' || *rp >= '9') - break; - if (!*rp) + if (!strcmp(argv[1], "-i")) { - /* repo specified by number */ - int rnum = atoi(rname); - for (i = 0; i < nrepoinfos; i++) - { - struct repoinfo *cinfo = repoinfos + i; - if (!cinfo->enabled) - continue; - if (--rnum == 0) - repoid = cinfo->repo->repoid; - } + queue_push2(&repofilter, SOLVER_SOLVABLE_REPO | SOLVER_SETREPO, pool->installed->repoid); + argc--; + argv++; } - else + else if (argc > 2 && (!strcmp(argv[1], "-r") || !strcmp(argv[1], "--repo"))) { - /* repo specified by alias */ - Repo *repo; - FOR_REPOS(i, repo) + const char *rname = argv[2], *rp; + Id repoid = 0; + for (rp = rname; *rp; rp++) + if (*rp <= '0' || *rp >= '9') + break; + if (!*rp) + { + /* repo specified by number */ + int rnum = atoi(rname); + for (i = 0; i < nrepoinfos; i++) + { + struct repoinfo *cinfo = repoinfos + i; + if (!cinfo->enabled) + continue; + if (--rnum == 0) + repoid = cinfo->repo->repoid; + } + } + else + { + /* repo specified by alias */ + Repo *repo; + FOR_REPOS(i, repo) + { + if (!strcasecmp(rname, repo->name)) + repoid = repo->repoid; + } + } + if (!repoid) { - if (!strcasecmp(rname, repo->name)) - repoid = repo->repoid; + fprintf(stderr, "%s: no such repo\n", rname); + exit(1); } + /* SETVENDOR is actually wrong but useful */ + queue_push2(&repofilter, SOLVER_SOLVABLE_REPO | SOLVER_SETREPO | SOLVER_SETVENDOR, repoid); + argc -= 2; + argv += 2; } - if (!repoid) + else if (argc > 2 && !strcmp(argv[1], "--arch")) { - fprintf(stderr, "%s: no such repo\n", rname); - exit(1); + if (!strcmp(argv[2], "src") || !strcmp(argv[2], "nosrc")) + archfilter_src = 1; + queue_push2(&archfilter, SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, 0, pool_str2id(pool, argv[2], 1), REL_ARCH, 1)); + argc -= 2; + argv += 2; + } + else if (argc > 2 && (!strcmp(argv[1], "-t") || !strcmp(argv[1], "--type"))) + { + const char *kind = argv[2]; + if (!strcmp(kind, "srcpackage")) + { + /* hey! should use --arch! */ + queue_push2(&archfilter, SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, 0, ARCH_SRC, REL_ARCH, 1)); + archfilter_src = 1; + argc -= 2; + argv += 2; + continue; + } + if (!strcmp(kind, "package")) + kind = ""; + if (!strcmp(kind, "all")) + queue_push2(&kindfilter, SOLVER_SOLVABLE_ALL, 0); + else + queue_push2(&kindfilter, SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, 0, pool_str2id(pool, kind, 1), REL_KIND, 1)); + argc -= 2; + argv += 2; } - /* SETVENDOR is actually wrong but useful */ - queue_push2(&repofilter, SOLVER_SOLVABLE_REPO | SOLVER_SETREPO | SOLVER_SETVENDOR, repoid); - argc -= 2; - argv += 2; + else + break; } if (mainmode == MODE_SEARCH) @@ -2783,7 +2883,7 @@ main(int argc, char **argv) } /* process command line packages */ - if (mainmode == MODE_LIST || mainmode == MODE_INSTALL) + if (mainmode == MODE_LIST || mainmode == MODE_INFO || mainmode == MODE_INSTALL) { for (i = 1; i < argc; i++) { @@ -2828,10 +2928,16 @@ main(int argc, char **argv) // printf("%s: %d solvables\n", repo->name, repo->nsolvables); #if defined(ENABLE_RPMDB) - addfileprovides(pool); + if (pool->disttype == DISTTYPE_RPM) + addfileprovides(pool); +#endif +#ifdef SUSE + add_autopackages(pool); #endif pool_createwhatprovides(pool); + if (keyname) + keyname = solv_dupjoin("solvable:", keyname, 0); queue_init(&job); for (i = 1; i < argc; i++) { @@ -2846,19 +2952,35 @@ main(int argc, char **argv) queue_init(&job2); flags = SELECTION_NAME|SELECTION_PROVIDES|SELECTION_GLOB; flags |= SELECTION_CANON|SELECTION_DOTARCH|SELECTION_REL; - if (mode == MODE_LIST) + if (kindfilter.count) + flags |= SELECTION_SKIP_KIND; + if (mode == MODE_LIST || archfilter_src) flags |= SELECTION_WITH_SOURCE; if (argv[i][0] == '/') flags |= SELECTION_FILELIST | (mode == MODE_ERASE ? SELECTION_INSTALLED_ONLY : 0); - rflags = selection_make(pool, &job2, argv[i], flags); + if (!keyname) + rflags = selection_make(pool, &job2, argv[i], flags); + else + rflags = selection_make_matchdeps(pool, &job2, argv[i], flags, pool_str2id(pool, keyname, 1), 0); if (repofilter.count) selection_filter(pool, &job2, &repofilter); + if (archfilter.count) + selection_filter(pool, &job2, &archfilter); + if (kindfilter.count) + selection_filter(pool, &job2, &kindfilter); if (!job2.count) { flags |= SELECTION_NOCASE; - rflags = selection_make(pool, &job2, argv[i], flags); + if (!keyname) + rflags = selection_make(pool, &job2, argv[i], flags); + else + rflags = selection_make_matchdeps(pool, &job2, argv[i], flags, pool_str2id(pool, keyname, 1), 0); if (repofilter.count) selection_filter(pool, &job2, &repofilter); + if (archfilter.count) + selection_filter(pool, &job2, &archfilter); + if (kindfilter.count) + selection_filter(pool, &job2, &kindfilter); if (job2.count) printf("[ignoring case for '%s']\n", argv[i]); } @@ -2875,14 +2997,21 @@ main(int argc, char **argv) queue_push(&job, job2.elements[j]); queue_free(&job2); } + keyname = solv_free(keyname); - if (!job.count && (mainmode == MODE_UPDATE || mainmode == MODE_DISTUPGRADE || mainmode == MODE_VERIFY || repofilter.count)) + if (!job.count && (mainmode == MODE_UPDATE || mainmode == MODE_DISTUPGRADE || mainmode == MODE_VERIFY || repofilter.count || archfilter.count || kindfilter.count)) { queue_push2(&job, SOLVER_SOLVABLE_ALL, 0); if (repofilter.count) selection_filter(pool, &job, &repofilter); + if (archfilter.count) + selection_filter(pool, &job, &archfilter); + if (kindfilter.count) + selection_filter(pool, &job, &kindfilter); } queue_free(&repofilter); + queue_free(&archfilter); + queue_free(&kindfilter); if (!job.count && mainmode != MODE_PATCH) { @@ -2915,6 +3044,11 @@ main(int argc, char **argv) str = solvable_lookup_str(s, SOLVABLE_LICENSE); if (str) printf("License: %s\n", str); +#if 0 + str = solvable_lookup_sourcepkg(s); + if (str) + printf("Source: %s\n", str); +#endif printf("Description:\n%s\n", solvable_lookup_str(s, SOLVABLE_DESCRIPTION)); printf("\n"); } @@ -3114,6 +3248,8 @@ rerunsolver: if (s->repo == commandlinerepo) { loc = solvable_lookup_location(s, &medianr); + if (!loc) + continue; if (!(newpkgsfps[i] = fopen(loc, "r"))) { perror(loc); @@ -3171,7 +3307,7 @@ rerunsolver: printf("Searching for file conflicts\n"); queue_init(&conflicts); - fcstate.rpmstate = rpm_state_create(rootdir); + fcstate.rpmstate = rpm_state_create(pool, rootdir); fcstate.newpkgscnt = newpkgs; fcstate.checkq = &checkq; fcstate.newpkgsfps = newpkgsfps;