SET(rpmmd2solv_REPOS rpmmd2solv.c repo_rpmmd.h repo_rpmmd.c repo_write.c common_write.c )
ADD_EXECUTABLE( rpmmd2solv ${rpmmd2solv_REPOS} )
-TARGET_LINK_LIBRARIES( rpmmd2solv satsolver ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES( rpmmd2solv satsolver ${EXPAT_LIBRARY} ${ZLIB_LIBRARY})
SET(helix2solv_REPOS helix2solv.c repo_write.c common_write.c )
ADD_EXECUTABLE( helix2solv ${helix2solv_REPOS} )
return olddeps;
}
+static void
+addsourcerpm(Pool *pool, Repodata *repodata, Solvable *s, char *sourcerpm, char *name, char *evr)
+{
+ Id entry;
+ const char *p, *sevr, *sarch;
+
+ p = strrchr(sourcerpm, '.');
+ if (!p || strcmp(p, ".rpm") != 0)
+ return;
+ p--;
+ while (p > sourcerpm && *p != '.')
+ p--;
+ if (*p != '.' || p == sourcerpm)
+ return;
+ sarch = p-- + 1;
+ while (p > sourcerpm && *p != '-')
+ p--;
+ if (*p != '-' || p == sourcerpm)
+ return;
+ p--;
+ while (p > sourcerpm && *p != '-')
+ p--;
+ if (*p != '-' || p == sourcerpm)
+ return;
+ sevr = p + 1;
+ entry = (s - pool->solvables) - repodata->start;
+ if (!strcmp(sarch, "src.rpm"))
+ repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_SRC);
+ else if (!strcmp(sarch, "nosrc.rpm"))
+ repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
+ else
+ repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, strn2id(pool, sarch, strlen(sarch) - 4, 1));
+ if (!strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
+ repodata_set_void(repodata, entry, SOLVABLE_SOURCEEVR);
+ else
+ repodata_set_id(repodata, entry, SOLVABLE_SOURCEEVR, strn2id(pool, sevr, sarch - sevr - 1, 1));
+ if (!strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
+ repodata_set_void(repodata, entry, SOLVABLE_SOURCENAME);
+ else
+ repodata_set_id(repodata, entry, SOLVABLE_SOURCENAME, strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
+}
+
static int
rpm2solv(Pool *pool, Repo *repo, Repodata *repodata, Solvable *s, RpmHead *rpmhead)
{
if (u32)
repodata_set_num(repodata, entry, SOLVABLE_INSTALLSIZE, (u32 + 1023) / 1024);
if (sourcerpm)
- {
- const char *p, *sevr, *sarch;
- p = strrchr(sourcerpm, '.');
- if (p && !strcmp(p, ".rpm"))
- {
- p--;
- while (p > sourcerpm && *p != '.')
- p--;
- if (*p == '.' && p > sourcerpm)
- {
- sarch = p-- + 1;
- while (p > sourcerpm && *p != '-')
- p--;
- if (*p == '-' && p > sourcerpm)
- {
- p--;
- while (p > sourcerpm && *p != '-')
- p--;
- if (*p == '-' && p > sourcerpm)
- {
- sevr = p + 1;
- if (!strcmp(sarch, "src.rpm"))
- repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_SRC);
- else if (!strcmp(sarch, "nosrc.rpm"))
- repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
- else
- repodata_set_constantid(repodata, entry, SOLVABLE_SOURCEARCH, strn2id(pool, sarch, strlen(sarch) - 4, 1));
- if (!strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
- repodata_set_void(repodata, entry, SOLVABLE_SOURCEEVR);
- else
- repodata_set_id(repodata, entry, SOLVABLE_SOURCEEVR, strn2id(pool, sevr, sarch - sevr - 1, 1));
- if (!strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
- repodata_set_void(repodata, entry, SOLVABLE_SOURCENAME);
- else
- repodata_set_id(repodata, entry, SOLVABLE_SOURCENAME, strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
- }
- }
- }
- }
- }
+ addsourcerpm(pool, repodata, s, sourcerpm, name, evr);
}
sat_free(evr);
return 1;
STATE_SUGGESTS,
STATE_ENHANCES,
STATE_FRESHENS,
+ STATE_SOURCERPM,
+ STATE_HEADERRANGE,
STATE_CAPS_FORMAT,
STATE_CAPS_VENDOR,
{ STATE_FORMAT, "rpm:suggests", STATE_SUGGESTS, 0 },
{ STATE_FORMAT, "rpm:enhances", STATE_ENHANCES, 0 },
{ STATE_FORMAT, "rpm:freshens", STATE_FRESHENS, 0 },
+ { STATE_FORMAT, "rpm:sourcerpm", STATE_SOURCERPM, 1 },
+ { STATE_FORMAT, "rpm:header-range", STATE_HEADERRANGE, 0 },
{ STATE_FORMAT, "file", STATE_FILE, 1 },
{ STATE_PROVIDES, "rpm:entry", STATE_PROVIDESENTRY, 0 },
{ STATE_REQUIRES, "rpm:entry", STATE_REQUIRESENTRY, 0 },
return str2id(pool, pd->content, 1);
}
-static const char *
+static inline const char *
find_attr(const char *txt, const char **atts)
{
for (; *atts; atts += 2)
repodata_set_str(data, entry, SOLVABLE_DESCRIPTION, str);
}
+static void
+set_sourcerpm(Repodata *data, Solvable *s, Id entry, char *sourcerpm)
+{
+ const char *p, *sevr, *sarch, *name, *evr;
+ Pool *pool;
+
+ p = strrchr(sourcerpm, '.');
+ if (!p || strcmp(p, ".rpm") != 0)
+ return;
+ p--;
+ while (p > sourcerpm && *p != '.')
+ p--;
+ if (*p != '.' || p == sourcerpm)
+ return;
+ sarch = p-- + 1;
+ while (p > sourcerpm && *p != '-')
+ p--;
+ if (*p != '-' || p == sourcerpm)
+ return;
+ p--;
+ while (p > sourcerpm && *p != '-')
+ p--;
+ if (*p != '-' || p == sourcerpm)
+ return;
+ sevr = p + 1;
+ pool = s->repo->pool;
+ name = id2str(pool, s->name);
+ evr = id2str(pool, s->evr);
+ if (!strcmp(sarch, "src.rpm"))
+ repodata_set_constantid(data, entry, SOLVABLE_SOURCEARCH, ARCH_SRC);
+ else if (!strcmp(sarch, "nosrc.rpm"))
+ repodata_set_constantid(data, entry, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
+ else
+ repodata_set_constantid(data, entry, SOLVABLE_SOURCEARCH, strn2id(pool, sarch, strlen(sarch) - 4, 1));
+ if (!strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
+ repodata_set_void(data, entry, SOLVABLE_SOURCEEVR);
+ else
+ repodata_set_id(data, entry, SOLVABLE_SOURCEEVR, strn2id(pool, sevr, sarch - sevr - 1, 1));
+ if (!strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm -
+ 1] == 0)
+ repodata_set_void(data, entry, SOLVABLE_SOURCENAME);
+ else
+ repodata_set_id(data, entry, SOLVABLE_SOURCENAME, strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
+}
+
static void XMLCALL
startElement(void *userData, const char *name, const char **atts)
{
break;
case STATE_TIME:
{
- unsigned t;
+ unsigned int t;
str = find_attr("build", atts);
if (str && (t = atoi(str)) != 0)
repodata_set_num(pd->data, entry, SOLVABLE_BUILDTIME, t);
}
case STATE_SIZE:
{
- unsigned k;
+ unsigned int k;
str = find_attr("installed", atts);
if (str && (k = atoi(str)) != 0)
repodata_set_num(pd->data, entry, SOLVABLE_INSTALLSIZE, (k + 1023) / 1024);
repodata_set_num(pd->data, entry, SOLVABLE_DOWNLOADSIZE, (k + 1023) / 1024);
break;
}
+ case STATE_HEADERRANGE:
+ {
+ unsigned int end;
+ str = find_attr("end", atts);
+ if (str && (end = atoi(str)) != 0)
+ repodata_set_num(pd->data, entry, SOLVABLE_HEADEREND, end);
+ }
default:
break;
}
pd->lang = 0;
set_desciption_author(pd->data, entry, pd->content);
break;
+ case STATE_SOURCERPM:
+ set_sourcerpm(pd->data, s, entry, pd->content);
+ break;
default:
break;
}
* for further information
*/
+#define _GNU_SOURCE
+
#include <sys/types.h>
#include <limits.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <zlib.h>
#include "pool.h"
#include "repo.h"
#include "repo_rpmmd.h"
#include "common_write.h"
+
+static ssize_t
+cookie_gzread(void *cookie, char *buf, size_t nbytes)
+{
+ return gzread((gzFile *)cookie, buf, nbytes);
+}
+
+static int
+cookie_gzclose(void *cookie)
+{
+ return gzclose((gzFile *)cookie);
+}
+
+FILE *
+myfopen(const char *fn)
+{
+ cookie_io_functions_t cio;
+ char *suf;
+ gzFile *gzf;
+
+ if (!fn)
+ return 0;
+ suf = strrchr(fn, '.');
+ if (!suf || strcmp(suf, ".gz") != 0)
+ return fopen(fn, "r");
+ gzf = gzopen(fn, "r");
+ if (!gzf)
+ return 0;
+ memset(&cio, 0, sizeof(cio));
+ cio.read = cookie_gzread;
+ cio.close = cookie_gzclose;
+ return fopencookie(gzf, "r", cio);
+}
+
static void
-usage(const char *err)
+usage(int status)
{
- if (err)
- fprintf(stderr, "\n** Error:\n %s\n", err);
fprintf(stderr, "\nUsage:\n"
"rpmmd2solv [-a][-h][-k][-n <attrname>]\n"
" reads a 'rpmmd' repository from <stdin> and writes a .solv file to <stdout>\n"
" -k : don't mix kinds (experimental!)\n"
" -n <name>: save attributes as <name>.attr\n"
);
- exit(0);
+ exit(status);
}
-
int
main(int argc, char **argv)
{
- int flags = 0;
- char *attrname = 0;
+ int c, flags = 0;
+ const char *attrname = 0;
+ const char *basefile = 0;
+ const char *dir = 0;
+
Pool *pool = pool_create();
Repo *repo = repo_create(pool, "<stdin>");
- argv++;
- argc--;
- while (argc--)
+ while ((c = getopt (argc, argv, "hkn:b:d:")) >= 0)
+ {
+ switch(c)
+ {
+ case 'h':
+ usage(0);
+ break;
+ case 'k':
+ flags |= RPMMD_KINDS_SEPARATELY; /* do not use! */
+ break;
+ case 'n':
+ attrname = optarg;
+ break;
+ case 'b':
+ basefile = optarg;
+ break;
+ case 'd':
+ dir = optarg;
+ break;
+ default:
+ usage(1);
+ break;
+ }
+ }
+ if (dir)
{
- const char *s = argv[0];
- if (*s++ == '-')
- while (*s)
- switch (*s++)
- {
- case 'h': usage(NULL); break;
- case 'n':
- if (argc)
- {
- attrname = argv[1];
- argv++;
- argc--;
- }
- else
- usage("argument required for '-n'");
- break;
- case 'k':
- flags |= RPMMD_KINDS_SEPARATELY;
- break;
- default : break;
- }
- argv++;
+ FILE *fp;
+ int l;
+ char *fnp;
+ l = strlen(dir);
+ fnp = sat_malloc(l + 20);
+ sprintf(fnp, "%s/primary.xml.gz", dir);
+ if (!(fp = myfopen(fnp)))
+ {
+ perror(fnp);
+ exit(1);
+ }
+ repo_add_rpmmd(repo, fp, flags);
+ fclose(fp);
+ sat_free(fnp);
}
- repo_add_rpmmd(repo, stdin, flags);
- tool_write(repo, 0, 0);
+ else
+ repo_add_rpmmd(repo, stdin, flags);
+ tool_write(repo, basefile, attrname);
pool_free(pool);
exit(0);
}