From: Michael Schroeder Date: Wed, 15 Jul 2009 13:57:52 +0000 (+0200) Subject: - be more careful when merging susetags attrs X-Git-Tag: BASE-SuSE-Code-12_1-Branch~165^2~42^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65fb64052c16cc89a46e62d79b516d2a9f3fe11c;p=thirdparty%2Flibsolv.git - be more careful when merging susetags attrs --- diff --git a/ext/repo_susetags.c b/ext/repo_susetags.c index db4a590d..242e7c46 100644 --- a/ext/repo_susetags.c +++ b/ext/repo_susetags.c @@ -676,7 +676,6 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int s->arch = str2id(pool, sp[3], 1); s->vendor = defvendor; } - else last_found_pack = (s - pool->solvables) - repo->start; if (data) handle = s - pool->solvables; @@ -946,6 +945,24 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int { int i, last_found; last_found = 0; + Map keyidmap; + + map_init(&keyidmap, data->nkeys); + for (i = 1; i < data->nkeys; i++) + { + Id keyname = data->keys[i].name; + if (keyname == SOLVABLE_INSTALLSIZE || keyname == SOLVABLE_DISKUSAGE || keyname == SOLVABLE_FILELIST) + continue; + if (keyname == SOLVABLE_MEDIADIR || keyname == SOLVABLE_MEDIAFILE || keyname == SOLVABLE_MEDIANR) + continue; + if (keyname == SOLVABLE_DOWNLOADSIZE || keyname == SOLVABLE_CHECKSUM) + continue; + if (keyname == SOLVABLE_SOURCENAME || keyname == SOLVABLE_SOURCEARCH || keyname == SOLVABLE_SOURCEEVR) + continue; + if (keyname == SOLVABLE_PKGID || keyname == SOLVABLE_HDRID || keyname == SOLVABLE_LEADSIGID) + continue; + MAPSET(&keyidmap, i); + } for (i = 0; i < pd.nshare; i++) if (pd.share_with[i]) { @@ -976,10 +993,11 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int } } if (n != repo->end) - repodata_merge_attrs(data, repo->start + i, repo->start + last_found); + repodata_merge_some_attrs(data, repo->start + i, repo->start + last_found, &keyidmap, 0); free(pd.share_with[i]); } free(pd.share_with); + map_free(&keyidmap); } sat_free(joinhash); diff --git a/src/repodata.c b/src/repodata.c index 5178fe0f..747fe36a 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -2234,6 +2234,16 @@ repodata_merge_attrs(Repodata *data, Id dest, Id src) repodata_insert_keyid(data, dest, keyp[0], keyp[1], 0); } +void +repodata_merge_some_attrs(Repodata *data, Id dest, Id src, Map *keyidmap, int overwrite) +{ + Id *keyp; + if (dest == src || !(keyp = data->attrs[src - data->start])) + return; + for (; *keyp; keyp += 2) + if (!keyidmap || MAPTST(keyidmap, keyp[0])) + repodata_insert_keyid(data, dest, keyp[0], keyp[1], overwrite); +} diff --git a/src/repodata.h b/src/repodata.h index 527043d6..a224ad7a 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -231,6 +231,7 @@ void repodata_add_flexarray(Repodata *data, Id solvid, Id keyname, Id ghandle); works only if the data is not yet internalized */ void repodata_merge_attrs(Repodata *data, Id dest, Id src); +void repodata_merge_some_attrs(Repodata *data, Id dest, Id src, Map *keyidmap, int overwrite); void repodata_create_stubs(Repodata *data); void repodata_join(Repodata *data, Id joinkey);