/* Cumulated info about the current deltarpm or patchrpm */
struct deltarpm {
- Id locdir;
- Id locname;
- Id locevr;
- Id locsuffix;
+ char *location;
unsigned int buildtime;
unsigned long long downloadsize;
char *filechecksum;
return pool_str2id(pool, pd->content, 1);
}
-static void
-parse_delta_location(struct parsedata *pd, const char* str)
-{
- Pool *pool = pd->pool;
- if (str)
- {
- /* Separate the filename into its different parts.
- rpm/x86_64/alsa-1.0.14-31_31.2.x86_64.delta.rpm
- --> dir = rpm/x86_64
- name = alsa
- evr = 1.0.14-31_31.2
- suffix = x86_64.delta.rpm. */
- char *real_str = solv_strdup(str);
- char *s = real_str;
- char *s1, *s2;
- s1 = strrchr (s, '/');
- if (s1)
- {
- pd->delta.locdir = pool_strn2id(pool, s, s1 - s, 1);
- s = s1 + 1;
- }
- /* Guess suffix. */
- s1 = strrchr (s, '.');
- if (s1)
- {
- for (s2 = s1 - 1; s2 > s; s2--)
- if (*s2 == '.')
- break;
- if (!strcmp (s2, ".delta.rpm") || !strcmp (s2, ".patch.rpm"))
- {
- s1 = s2;
- /* We accept one more item as suffix. */
- for (s2 = s1 - 1; s2 > s; s2--)
- if (*s2 == '.')
- break;
- s1 = s2;
- }
- if (*s1 == '.')
- *s1++ = 0;
- pd->delta.locsuffix = pool_str2id(pool, s1, 1);
- }
- /* Last '-'. */
- s1 = strrchr (s, '-');
- if (s1)
- {
- /* Second to last '-'. */
- for (s2 = s1 - 1; s2 > s; s2--)
- if (*s2 == '-')
- break;
- }
- else
- s2 = 0;
- if (s2 > s && *s2 == '-')
- {
- *s2++ = 0;
- pd->delta.locevr = pool_str2id(pool, s2, 1);
- }
- pd->delta.locname = pool_str2id(pool, s, 1);
- free(real_str);
- }
-}
-
static void XMLCALL
startElement(void *userData, const char *name, const char **atts)
{
case STATE_FILENAME:
break;
case STATE_LOCATION:
- parse_delta_location(pd, find_attr("href", atts));
+ pd->delta.location = solv_strdup(find_attr("href", atts));
break;
case STATE_SIZE:
break;
repodata_set_id(pd->data, handle, DELTA_PACKAGE_NAME, pd->newpkgname);
repodata_set_id(pd->data, handle, DELTA_PACKAGE_EVR, pd->newpkgevr);
repodata_set_id(pd->data, handle, DELTA_PACKAGE_ARCH, pd->newpkgarch);
- repodata_set_id(pd->data, handle, DELTA_LOCATION_NAME, d->locname);
- repodata_set_id(pd->data, handle, DELTA_LOCATION_DIR, d->locdir);
- repodata_set_id(pd->data, handle, DELTA_LOCATION_EVR, d->locevr);
- repodata_set_id(pd->data, handle, DELTA_LOCATION_SUFFIX, d->locsuffix);
+ if (d->location)
+ repodata_set_deltalocation(pd->data, handle, 0, 0, d->location);
if (d->downloadsize)
repodata_set_num(pd->data, handle, DELTA_DOWNLOADSIZE, d->downloadsize);
if (d->filechecksum)
pd->delta.bevr = solv_free(pd->delta.bevr);
pd->delta.nbevr = 0;
pd->delta.seqnum = solv_free(pd->delta.seqnum);
+ pd->delta.location = solv_free(pd->delta.location);
break;
case STATE_FILENAME:
- parse_delta_location(pd, pd->content);
+ pd->delta.location = solv_strdup(pd->content);
break;
case STATE_CHECKSUM:
pd->delta.filechecksum = solv_strdup(pd->content);
repodata_set_checksum(data, handle, keyname, type, sp[1]);
}
-static void
-set_delta_location(Repodata *data, Id handle, int medianr, char *dir, char *file)
-{
- Pool *pool = data->repo->pool;
- int l = 0;
- char *p, *op;
-
- if (!dir)
- {
- if ((dir = strrchr(file, '/')) != 0)
- {
- l = dir - file;
- dir = file;
- file = dir + l + 1;
- if (!l)
- l++;
- }
- }
- else
- l = strlen(dir);
- if (l >= 2 && dir[0] == '.' && dir[1] == '/' && (l == 2 || dir[2] != '/'))
- {
- dir += 2;
- l -= 2;
- }
- if (l == 1 && dir[0] == '.')
- l = 0;
- if (dir && l)
- repodata_set_id(data, handle, DELTA_LOCATION_DIR, pool_strn2id(pool, dir, l, 1));
- if ((p = strrchr(file, '.')) != 0)
- {
- *p = 0;
- if ((op = strrchr(file, '.')) != 0)
- {
- *p = '.';
- p = op;
- *p = 0;
- if (!strcmp(p + 1, "delta.rpm") && (op = strrchr(file, '.')) != 0)
- {
- *p = '.';
- p = op;
- *p = 0;
- }
- }
- repodata_set_id(data, handle, DELTA_LOCATION_SUFFIX, pool_str2id(pool, p + 1, 1));
- }
- if ((p = strrchr(file, '-')) != 0)
- {
- *p = 0;
- if ((op = strrchr(file, '-')) != 0)
- {
- *p = '-';
- p = op;
- *p = 0;
- }
- repodata_set_id(data, handle, DELTA_LOCATION_EVR, pool_str2id(pool, p + 1, 1));
- }
- repodata_set_id(data, handle, DELTA_LOCATION_NAME, pool_str2id(pool, file, 1));
-}
-
-
/*
* id3_cmp
pd.ret = pool_error(pool, -1, "susetags: line %d: bad location line '%s'\n", pd.lineno, line);
continue;
}
- set_delta_location(data, handle, atoi(sp[0]), i == 3 ? sp[2] : 0, sp[1]);
+ repodata_set_deltalocation(data, handle, atoi(sp[0]), i == 3 ? sp[2] : 0, sp[1]);
continue;
}
case CTAG('=', 'S', 'i', 'z'):
repodata_set_constantid;
repodata_set_deleted;
repodata_set_deleted_uninternalized;
+ repodata_set_deltalocation;
repodata_set_id;
repodata_set_idarray;
repodata_set_location;
repodata_set_str(data, solvid, SOLVABLE_MEDIAFILE, file);
}
+static inline void repodata_set_poolstrn(Repodata *data, Id solvid, Id keyname, const char *str, int l)
+{
+ Id id;
+ if (data->localpool)
+ id = stringpool_strn2id(&data->spool, str, l, 1);
+ else
+ id = pool_strn2id(data->repo->pool, str, l, 1);
+ repodata_set_id(data, solvid, keyname, id);
+}
+
+/* XXX: medianr is currently not stored */
+void
+repodata_set_deltalocation(Repodata *data, Id handle, int medianr, const char *dir, const char *file)
+{
+ int l = 0;
+ const char *evr, *suf, *s;
+
+ if (!dir)
+ {
+ if ((dir = strrchr(file, '/')) != 0)
+ {
+ l = dir - file;
+ dir = file;
+ file = dir + l + 1;
+ if (!l)
+ l++;
+ }
+ }
+ else
+ l = strlen(dir);
+ if (l >= 2 && dir[0] == '.' && dir[1] == '/' && (l == 2 || dir[2] != '/'))
+ {
+ dir += 2;
+ l -= 2;
+ }
+ if (l == 1 && dir[0] == '.')
+ l = 0;
+ if (dir && l)
+ repodata_set_poolstrn(data, handle, DELTA_LOCATION_DIR, dir, l);
+ evr = strchr(file, '-');
+ if (evr)
+ {
+ for (s = evr - 1; s > file; s--)
+ if (*s == '-')
+ {
+ evr = s;
+ break;
+ }
+ }
+ suf = strrchr(file, '.');
+ if (suf)
+ {
+ for (s = suf - 1; s > file; s--)
+ if (*s == '.')
+ {
+ suf = s;
+ break;
+ }
+ if (!strcmp(suf, ".delta.rpm") || !strcmp(suf, ".patch.rpm"))
+ {
+ /* We accept one more item as suffix. */
+ for (s = suf - 1; s > file; s--)
+ if (*s == '.')
+ {
+ suf = s;
+ break;
+ }
+ }
+ }
+ if (!evr)
+ suf = 0;
+ if (suf && evr && suf < evr)
+ suf = 0;
+ repodata_set_poolstrn(data, handle, DELTA_LOCATION_NAME, file, evr ? evr - file : strlen(file));
+ if (evr)
+ repodata_set_poolstrn(data, handle, DELTA_LOCATION_EVR, evr + 1, suf ? suf - evr - 1: strlen(evr + 1));
+ if (suf)
+ repodata_set_poolstr(data, handle, DELTA_LOCATION_SUFFIX, suf + 1);
+}
+
void
repodata_set_sourcepkg(Repodata *data, Id solvid, const char *sourcepkg)
{
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_deltalocation(Repodata *data, Id handle, 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);