#include "chksum.h"
#include "tools_util.h"
#include "repo_susetags.h"
+#ifdef ENABLE_COMPLEX_DEPS
+#include "pool_parserpmrichdep.h"
+#endif
struct datashare {
Id name;
/* A file dependency. Do not try to parse it */
id = pool_str2id(pool, line + 6, 1);
}
+#ifdef ENABLE_COMPLEX_DEPS
+ else if (line[6] == '(')
+ {
+ id = pool_parserpmrichdep(pool, line + 6);
+ if (!id)
+ {
+ pd->ret = pool_error(pool, -1, "susetags: line %d: bad dependency: '%s'\n", pd->lineno, line);
+ return olddeps;
+ }
+ }
+#endif
else
{
i = split(line + 6, sp, 4); /* name, <op>, evr, ? */
const char *p;
for (p = sevr; *p >= '0' && *p <= '9'; p++)
;
- if (*p == ':' && p[1])
+ if (p != sevr && *p == ':' && p[1])
sevr = p;
}
if (name == s->name)
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
}
static Hashtable
-joinhash_init(Repo *repo, Hashmask *hmp)
+joinhash_init(Repo *repo, Hashval *hmp)
{
- Hashmask hm = mkmask(repo->nsolvables);
+ Hashval hm = mkmask(repo->nsolvables);
Hashtable ht = solv_calloc(hm + 1, sizeof(*ht));
Hashval h, hh;
Solvable *s;
}
static Solvable *
-joinhash_lookup(Repo *repo, Hashtable ht, Hashmask hm, Id name, Id evr, Id arch, Id start)
+joinhash_lookup(Repo *repo, Hashtable ht, Hashval hm, Id name, Id evr, Id arch, Id start)
{
Hashval h, hh;
Repodata *data = 0;
Id handle = 0;
Hashtable joinhash = 0;
- Hashmask joinhashm = 0;
+ Hashval joinhashm = 0;
int createdpkgs = 0;
if ((flags & (SUSETAGS_EXTEND|REPO_EXTEND_SOLVABLES)) != 0 && repo->nrepodata)
{
Repodata *sdata;
int i;
-
+
FOR_REPODATAS(repo, i, sdata)
{
int p;
}
}
}
-
+
/*
* read complete file
*
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'):
break;
default:
+#if 0
pool_debug(pool, SOLV_WARN, "susetags: unknown line: %d: %s\n", pd.lineno, line);
+#endif
break;
}
- } /* for(;;) */
+ }
if (s)
finish_solvable(&pd, s, freshens);