for (i = 0; i < newpkgs; i++)
{
unsigned int medianr;
- char *loc;
+ const char *loc;
Solvable *s;
struct repoinfo *cinfo;
const unsigned char *chksum;
return 0;
}
-static void
-set_sourcerpm(Repodata *data, Solvable *s, Id handle, const 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;
- if (!strcmp(sarch, "src.rpm"))
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_SRC);
- else if (!strcmp(sarch, "nosrc.rpm"))
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
- else
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
- evr = pool_id2str(pool, s->evr);
- if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
- repodata_set_void(data, handle, SOLVABLE_SOURCEEVR);
- else
- repodata_set_id(data, handle, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
- name = pool_id2str(pool, s->name);
- if (name && !strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
- repodata_set_void(data, handle, SOLVABLE_SOURCENAME);
- else
- repodata_set_id(data, handle, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-}
-
-
static void XMLCALL
startElement(void *userData, const char *name, const char **atts)
{
repodata_set_poolstr(pd->data, pd->solvable - pool->solvables, SOLVABLE_LICENSE, str);
str = find_attr("sourcerpm", atts);
if (str && *str)
- set_sourcerpm(pd->data, pd->solvable, pd->solvable - pool->solvables, str);
+ repodata_set_sourcepkg(pd->data, pd->solvable - pool->solvables, str);
break;
}
case STATE_FILES:
return olddeps;
}
-static void
-addsourcerpm(Pool *pool, Repodata *data, Id handle, char *sourcerpm, char *name, char *evr)
-{
- 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;
- if (!strcmp(sarch, "src.rpm"))
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_SRC);
- else if (!strcmp(sarch, "nosrc.rpm"))
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
- else
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
- if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
- repodata_set_void(data, handle, SOLVABLE_SOURCEEVR);
- else
- repodata_set_id(data, handle, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
- if (name && !strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
- repodata_set_void(data, handle, SOLVABLE_SOURCENAME);
- else
- repodata_set_id(data, handle, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-}
-
static int
rpm2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhead, int flags)
{
char *sourcerpm;
name = headstring(rpmhead, TAG_NAME);
- if (!strcmp(name, "gpg-pubkey"))
- return 0;
- s->name = pool_str2id(pool, name, 1);
- if (!s->name)
+ if (!name)
{
fprintf(stderr, "package has no name\n");
return 0;
}
+ if (!strcmp(name, "gpg-pubkey"))
+ return 0;
+ s->name = pool_str2id(pool, name, 1);
sourcerpm = headstring(rpmhead, TAG_SOURCERPM);
if (sourcerpm || (rpmhead->forcebinary && !headexists(rpmhead, TAG_SOURCEPACKAGE)))
s->arch = pool_str2id(pool, headstring(rpmhead, TAG_ARCH), 1);
repodata_set_num(data, handle, SOLVABLE_INSTALLSIZE, u32);
}
if (sourcerpm)
- addsourcerpm(pool, data, handle, sourcerpm, name, evr);
+ repodata_set_sourcepkg(data, handle, sourcerpm);
if ((flags & RPM_ADD_TRIGGERS) != 0)
{
Id id, lastid;
}
-/*
- * set_sourcerpm
- *
- */
-
-static void
-set_sourcerpm(Repodata *data, Solvable *s, Id handle, const 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;
- if (!strcmp(sarch, "src.rpm"))
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_SRC);
- else if (!strcmp(sarch, "nosrc.rpm"))
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
- else
- repodata_set_constantid(data, handle, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
- evr = pool_id2str(pool, s->evr);
- if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
- repodata_set_void(data, handle, SOLVABLE_SOURCEEVR);
- else
- repodata_set_id(data, handle, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
- name = pool_id2str(pool, s->name);
- if (name && !strncmp(sourcerpm, name, sevr - sourcerpm - 1) && name[sevr - sourcerpm - 1] == 0)
- repodata_set_void(data, handle, SOLVABLE_SOURCENAME);
- else
- repodata_set_id(data, handle, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcerpm, sevr - sourcerpm - 1, 1));
-}
-
/*-----------------------------------------------*/
/* XML callbacks */
repodata_set_poolstr(pd->data, handle, SOLVABLE_PACKAGER, pd->content);
break;
case STATE_SOURCERPM:
- set_sourcerpm(pd->data, s, handle, pd->content);
+ if (pd->content[0])
+ repodata_set_sourcepkg(pd->data, handle, pd->content);
break;
case STATE_RELNOTESURL:
if (pd->content[0])
static void
add_source(struct parsedata *pd, char *line, Solvable *s, Id handle)
{
- Repo *repo = s->repo;
- Pool *pool = repo->pool;
+ Pool *pool = s->repo->pool;
char *sp[5];
Id name;
- Id evr;
Id arch;
+ const char *evr, *sevr;
if (split(line, sp, 5) != 4)
{
}
name = pool_str2id(pool, sp[0], 1);
- evr = makeevr(pool, join2(&pd->jd, sp[1], "-", sp[2]));
- arch = pool_str2id(pool, sp[3], 1);
- /* XXX: could record a dep here, depends on where we want to store the data */
+ arch = pool_str2id(pool, sp[3], 1); /* do this before id2str */
+ evr = join2(&pd->jd, sp[1], "-", sp[2]);
+ sevr = pool_id2str(pool, s->evr);
+ if (sevr)
+ {
+ /* strip epoch */
+ const char *p;
+ for (p = sevr; *p >= '0' && *p <= '9'; p++)
+ ;
+ if (*p == ':' && p[1])
+ sevr = p;
+ }
if (name == s->name)
repodata_set_void(pd->data, handle, SOLVABLE_SOURCENAME);
else
repodata_set_id(pd->data, handle, SOLVABLE_SOURCENAME, name);
- if (evr == s->evr)
+ if (sevr && !strcmp(sevr, evr))
repodata_set_void(pd->data, handle, SOLVABLE_SOURCEEVR);
else
- repodata_set_id(pd->data, handle, SOLVABLE_SOURCEEVR, evr);
+ repodata_set_id(pd->data, handle, SOLVABLE_SOURCEEVR, pool_str2id(pool, evr, 1));
repodata_set_constantid(pd->data, handle, SOLVABLE_SOURCEARCH, arch);
}
repodata_set_location;
repodata_set_num;
repodata_set_poolstr;
+ repodata_set_sourcepkg;
repodata_set_str;
repodata_set_void;
repodata_setpos_kv;
solvable_lookup_idarray;
solvable_lookup_num;
solvable_lookup_sizek;
+ solvable_lookup_sourcepkg;
solvable_lookup_str;
solvable_lookup_str_lang;
solvable_lookup_str_poollang;
repo_lookup_deparray(Repo *repo, Id entry, Id keyname, Queue *q, Id marker)
{
int r = repo_lookup_idarray(repo, entry, keyname, q);
- if (r && marker)
+ if (r && marker && q->count)
{
int i;
if (marker < 0)
}
void
+repodata_set_sourcepkg(Repodata *data, Id solvid, const char *sourcepkg)
+{
+ Pool *pool = data->repo->pool;
+ Solvable *s = pool->solvables + solvid;
+ const char *p, *sevr, *sarch, *name, *evr;
+
+ p = strrchr(sourcepkg, '.');
+ if (!p || strcmp(p, ".rpm") != 0)
+ {
+ if (*sourcepkg)
+ repodata_set_str(data, solvid, SOLVABLE_SOURCENAME, sourcepkg);
+ return;
+ }
+ p--;
+ while (p > sourcepkg && *p != '.')
+ p--;
+ if (*p != '.' || p == sourcepkg)
+ return;
+ sarch = p-- + 1;
+ while (p > sourcepkg && *p != '-')
+ p--;
+ if (*p != '-' || p == sourcepkg)
+ return;
+ p--;
+ while (p > sourcepkg && *p != '-')
+ p--;
+ if (*p != '-' || p == sourcepkg)
+ return;
+ sevr = p + 1;
+ pool = s->repo->pool;
+
+ name = pool_id2str(pool, s->name);
+ if (name && !strncmp(sourcepkg, name, sevr - sourcepkg - 1) && name[sevr - sourcepkg - 1] == 0)
+ repodata_set_void(data, solvid, SOLVABLE_SOURCENAME);
+ else
+ repodata_set_id(data, solvid, SOLVABLE_SOURCENAME, pool_strn2id(pool, sourcepkg, sevr - sourcepkg - 1, 1));
+
+ evr = pool_id2str(pool, s->evr);
+ if (evr)
+ {
+ /* strip epoch */
+ const char *pp;
+ for (pp = evr; *pp >= '0' && *pp <= '9'; pp++)
+ ;
+ if (*pp == ':' && pp[1])
+ evr = pp + 1;
+ }
+ if (evr && !strncmp(sevr, evr, sarch - sevr - 1) && evr[sarch - sevr - 1] == 0)
+ repodata_set_void(data, solvid, SOLVABLE_SOURCEEVR);
+ else
+ repodata_set_id(data, solvid, SOLVABLE_SOURCEEVR, pool_strn2id(pool, sevr, sarch - sevr - 1, 1));
+
+ if (!strcmp(sarch, "src.rpm"))
+ repodata_set_constantid(data, solvid, SOLVABLE_SOURCEARCH, ARCH_SRC);
+ else if (!strcmp(sarch, "nosrc.rpm"))
+ repodata_set_constantid(data, solvid, SOLVABLE_SOURCEARCH, ARCH_NOSRC);
+ else
+ repodata_set_constantid(data, solvid, SOLVABLE_SOURCEARCH, pool_strn2id(pool, sarch, strlen(sarch) - 4, 1));
+}
+
+void
repodata_set_idarray(Repodata *data, Id solvid, Id keyname, Queue *q)
{
Repokey key;
const char *repodata_dir2str(Repodata *data, Id did, const char *suf);
const char *repodata_chk2str(Repodata *data, Id type, const unsigned char *buf);
void repodata_set_location(Repodata *data, Id solvid, int medianr, const char *dir, const char *file);
+void repodata_set_sourcepkg(Repodata *data, Id solvid, const char *sourcepkg);
Id repodata_lookup_id_uninternalized(Repodata *data, Id solvid, Id keyname, Id voidid);
/* stats */
return p != evr && *p == ':' ? p + 1 : evr;
}
-char *
+const char *
solvable_get_location(Solvable *s, unsigned int *medianrp)
{
Pool *pool;
return loc;
}
+const char *
+solvable_lookup_sourcepkg(Solvable *s)
+{
+ Pool *pool;
+ const char *evr, *name;
+ Id archid;
+
+ if (!s->repo)
+ return 0;
+ pool = s->repo->pool;
+ if (solvable_lookup_void(s, SOLVABLE_SOURCENAME))
+ name = pool_id2str(pool, s->name);
+ else
+ name = solvable_lookup_str(s, SOLVABLE_SOURCENAME);
+ if (!name)
+ return 0;
+ archid = solvable_lookup_id(s, SOLVABLE_SOURCEARCH);
+ if (solvable_lookup_void(s, SOLVABLE_SOURCEEVR))
+ {
+ evr = pool_id2str(pool, s->evr);
+ if (evr && (archid == ARCH_SRC || archid == ARCH_NOSRC))
+ {
+ /* assume rpm, strip epoch */
+ const char *p;
+ for (p = evr; *p >= '0' && *p <= '9'; p++)
+ ;
+ if (*p == ':' && p[1])
+ evr = p + 1;
+ }
+ }
+ else
+ evr = solvable_lookup_str(s, SOLVABLE_SOURCEEVR);
+ if (archid == ARCH_SRC || archid == ARCH_NOSRC)
+ {
+ char *str;
+ str = pool_tmpjoin(pool, name, evr ? "-" : 0, evr);
+ str = pool_tmpappend(pool, str, ".", pool_id2str(pool, archid));
+ return pool_tmpappend(pool, str, ".rpm", 0);
+ }
+ else
+ return name; /* FIXME */
+}
+
+
/*****************************************************************************/
static inline Id dep2name(Pool *pool, Id dep)
const char *solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang, int usebase);
int solvable_lookup_bool(Solvable *s, Id keyname);
int solvable_lookup_void(Solvable *s, Id keyname);
-char *solvable_get_location(Solvable *s, unsigned int *medianrp);
+const char *solvable_get_location(Solvable *s, unsigned int *medianrp);
+const char *solvable_lookup_sourcepkg(Solvable *s);
const unsigned char *solvable_lookup_bin_checksum(Solvable *s, Id keyname, Id *typep);
const char *solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep);
int solvable_lookup_idarray(Solvable *s, Id keyname, Queue *q);