X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Fmergesolv.c;h=6719c8c607a457487d3019159d0eb16d0f92c362;hb=c8e2acdc6c28d39193d24c9ca0a934ee43225648;hp=11272172958ffa2aa170b1480a02972a3ca6b42c;hpb=a00b22fc21692242f0582ae6d9ff4e27d927c09d;p=platform%2Fupstream%2Flibsolv.git diff --git a/tools/mergesolv.c b/tools/mergesolv.c index 1127217..6719c8c 100644 --- a/tools/mergesolv.c +++ b/tools/mergesolv.c @@ -1,9 +1,17 @@ /* + * Copyright (c) 2007, Novell Inc. + * + * This program is licensed under the BSD license, read LICENSE.BSD + * for further information + */ + +/* * mergesolv * */ #include +#include #include #include #include @@ -13,84 +21,103 @@ #include "pool.h" #include "repo_solv.h" -#include "repo_write.h" +#ifdef SUSE +#include "repo_autopattern.h" +#endif +#include "common_write.h" + +static void +usage() +{ + fprintf(stderr, "\nUsage:\n" + "mergesolv [file] [file] [...]\n" + " merges multiple solv files into one and writes it to stdout\n" + ); + exit(0); +} + +static int +loadcallback (Pool *pool, Repodata *data, void *vdata) +{ + FILE *fp; + const char *location = repodata_lookup_str(data, SOLVID_META, REPOSITORY_LOCATION); + int r; + + if (!location) + return 0; + fprintf(stderr, "Loading SOLV file %s\n", location); + fp = fopen (location, "r"); + if (!fp) + { + perror(location); + return 0; + } + r = repo_add_solv(data->repo, fp, REPO_USE_LOADING|REPO_LOCALPOOL); + fclose(fp); + return r ? 0 : 1; +} int main(int argc, char **argv) { - Pool *pool = pool_create(); - int i; - int new_id_size; - Id *new_id; + Pool *pool; + Repo *repo; + const char *basefile = 0; + int with_attr = 0; +#ifdef SUSE + int add_auto = 0; +#endif + int c; - while (argc-- > 1) + pool = pool_create(); + repo = repo_create(pool, ""); + + while ((c = getopt(argc, argv, "ahb:X")) >= 0) { - FILE *fp; - argv++; - if ((fp = fopen(*argv, "r")) == NULL) - { - perror(argv[1]); - exit(0); - } - pool_addrepo_solv(pool, fp, ""); - fclose(fp); + switch (c) + { + case 'h': + usage(); + break; + case 'a': + with_attr = 1; + break; + case 'b': + basefile = optarg; + break; + case 'X': +#ifdef SUSE + add_auto = 1; +#endif + break; + default: + usage(); + exit(1); + } } - if (!pool->nrepos) - return 0; + if (with_attr) + pool_setloadcallback(pool, loadcallback, 0); - new_id_size = 0; - for (i = 0; i < pool->nrepos; i++) - new_id_size += pool->repos[i]->idarraysize; - new_id = (Id*) malloc (sizeof (Id) * new_id_size); - new_id_size = 0; - for (i = 0; i < pool->nrepos; i++) + for (; optind < argc; optind++) { - Repo *repo = pool->repos[i]; - int si; - memcpy (new_id + new_id_size, repo->idarraydata, - repo->idarraysize * sizeof (new_id[0])); - for (si = repo->start; si < repo->start + repo->nsolvables; si++) - { - Solvable *s = pool->solvables + si; - if (s->provides) - s->provides += new_id_size; - if (s->obsoletes) - s->obsoletes += new_id_size; - if (s->conflicts) - s->conflicts += new_id_size; - if (s->requires) - s->requires += new_id_size; - if (s->recommends) - s->recommends += new_id_size; - if (s->suggests) - s->suggests+= new_id_size; - if (s->supplements) - s->supplements += new_id_size; - if (s->enhances) - s->enhances += new_id_size; - if (s->freshens) - s->freshens += new_id_size; + FILE *fp; + if ((fp = fopen(argv[optind], "r")) == NULL) + { + perror(argv[optind]); + exit(1); } - new_id_size += repo->idarraysize; - if (i > 0) - { - pool->repos[0]->nsolvables += repo->nsolvables; - repo->nsolvables = 0; - repo->start = pool->nsolvables; - free (repo->idarraydata); - repo->idarraydata = 0; + if (repo_add_solv(repo, fp, 0)) + { + fprintf(stderr, "repo %s: %s\n", argv[optind], pool_errstr(pool)); + exit(1); } + fclose(fp); } - while (pool->nrepos > 1) - { - pool_freerepo (pool, pool->repos[1]); - } - free (pool->repos[0]->idarraydata); - pool->repos[0]->idarraydata = new_id; - pool->repos[0]->idarraysize = new_id_size; - - pool_writerepo(pool, pool->repos[0], stdout); +#ifdef SUSE + if (add_auto) + repo_add_autopattern(repo, 0); +#endif + tool_write(repo, basefile, 0); pool_free(pool); - return 0; }