From 50d2c05481ea3d29d12bab5ab2a9cc1b3e80ca12 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 15 Oct 2007 01:59:12 +0000 Subject: [PATCH] I have use for a tool to merge .solv files. --- src/source_solv.c | 1 + tools/Makefile.am | 7 ++-- tools/mergesolv.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 tools/mergesolv.c diff --git a/src/source_solv.c b/src/source_solv.c index 7212183..2d6ddd6 100644 --- a/src/source_solv.c +++ b/src/source_solv.c @@ -464,6 +464,7 @@ pool_addsource_solv(Pool *pool, FILE *fp, const char *sourcename) } if (size_idarray) source->idarraydata = (Id *)xmalloc(sizeof(Id) * size_idarray); + source->idarraysize = size_idarray; idarraydatap = source->idarraydata; /* alloc solvables */ diff --git a/tools/Makefile.am b/tools/Makefile.am index d237497..7fb94e9 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -1,9 +1,9 @@ -noinst_PROGRAMS = rpmdb2solv rpmmd2solv helix2solv susetags2solv patchxml2solv dumpsolv +noinst_PROGRAMS = rpmdb2solv rpmmd2solv helix2solv susetags2solv patchxml2solv dumpsolv mergesolv INCLUDES = \ -I$(top_srcdir)/src -LIBS = \ +LDADD = \ $(top_builddir)/src/libsatsolver.la noinst_HEADERS = source_write.h @@ -49,3 +49,6 @@ patchxml2solv_LDADD = -lexpat dumpsolv_SOURCES = \ dumpsolv.c +mergesolv_SOURCES = \ + mergesolv.c \ + source_write.c diff --git a/tools/mergesolv.c b/tools/mergesolv.c new file mode 100644 index 0000000..f466b9b --- /dev/null +++ b/tools/mergesolv.c @@ -0,0 +1,97 @@ +/* + * mergesolv + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "pool.h" +#include "source_solv.h" +#include "source_write.h" + +static void +adjust (Id **val, Id * new_id, Source *source) +{ + if (!*val) + return; + assert (source->idarraydata <= *val); + assert (*val < source->idarraydata + source->idarraysize); + *val = new_id + (*val - source->idarraydata); +} + +int +main(int argc, char **argv) +{ + Pool *pool = pool_create(); + int i; + int new_id_size; + Id *new_id; + + while (argc-- > 1) + { + FILE *fp; + argv++; + if ((fp = fopen(*argv, "r")) == NULL) + { + perror(argv[1]); + exit(0); + } + pool_addsource_solv(pool, fp, ""); + fclose(fp); + } + if (!pool->nsources) + return 0; + + new_id_size = 0; + for (i = 0; i < pool->nsources; i++) + new_id_size += pool->sources[i]->idarraysize; + new_id = (Id*) malloc (sizeof (Id) * new_id_size); + new_id_size = 0; + for (i = 0; i < pool->nsources; i++) + { + Source *source = pool->sources[i]; + int si; + memcpy (new_id + new_id_size, source->idarraydata, + source->idarraysize * sizeof (new_id[0])); + for (si = source->start; si < source->start + source->nsolvables; si++) + { + Solvable *s = pool->solvables + si; + adjust (&s->provides, new_id + new_id_size, source); + adjust (&s->obsoletes, new_id + new_id_size, source); + adjust (&s->conflicts, new_id + new_id_size, source); + adjust (&s->requires, new_id + new_id_size, source); + adjust (&s->recommends, new_id + new_id_size, source); + adjust (&s->suggests, new_id + new_id_size, source); + adjust (&s->supplements, new_id + new_id_size, source); + adjust (&s->enhances, new_id + new_id_size, source); + adjust (&s->freshens, new_id + new_id_size, source); + } + new_id_size += source->idarraysize; + if (i > 0) + { + pool->sources[0]->nsolvables += source->nsolvables; + source->nsolvables = 0; + source->start = pool->nsolvables; + free (source->idarraydata); + source->idarraydata = 0; + } + } + while (pool->nsources > 1) + { + pool_freesource (pool, pool->sources[1]); + } + free (pool->sources[0]->idarraydata); + pool->sources[0]->idarraydata = new_id; + pool->sources[0]->idarraysize = new_id_size; + + pool_writesource(pool, pool->sources[0], stdout); + pool_free(pool); + + return 0; +} -- 2.7.4