static void iterate_solvable_dirs(Pool *pool, Id p, void (*cb)(void *, const char *, struct filelistinfo *), void *cbdata) { Repodata *lastdata = 0; Id lastdirid = -1; Dataiterator di; dataiterator_init(&di, pool, 0, p, SOLVABLE_FILELIST, 0, SEARCH_COMPLETE_FILELIST); while (dataiterator_step(&di)) { if (di.data == lastdata && di.kv.id == lastdirid) continue; lastdata = di.data; lastdirid = di.kv.id; cb(cbdata, repodata_dir2str(di.data, di.kv.id, ""), 0); } dataiterator_free(&di); }
static int dump_attr(Repo *repo, Repodata *data, Repokey *key, KeyValue *kv) { const char *keyname; KeyValue *kvp; int indent = 0; keyname = pool_id2str(repo->pool, key->name); for (kvp = kv; (kvp = kvp->parent) != 0; indent += 2) printf(" "); switch(key->type) { case REPOKEY_TYPE_ID: if (data && data->localpool) kv->str = stringpool_id2str(&data->spool, kv->id); else kv->str = pool_dep2str(repo->pool, kv->id); printf("%s: %s\n", keyname, kv->str); break; case REPOKEY_TYPE_CONSTANTID: printf("%s: %s\n", keyname, pool_dep2str(repo->pool, kv->id)); break; case REPOKEY_TYPE_IDARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); if (data && data->localpool) printf(" %s\n", stringpool_id2str(&data->spool, kv->id)); else printf(" %s\n", pool_dep2str(repo->pool, kv->id)); break; case REPOKEY_TYPE_STR: printf("%s: %s\n", keyname, kv->str); break; case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: case REPOKEY_TYPE_SHA256: printf("%s: %s (%s)\n", keyname, repodata_chk2str(data, key->type, (unsigned char *)kv->str), pool_id2str(repo->pool, key->type)); break; case REPOKEY_TYPE_VOID: printf("%s: (void)\n", keyname); break; case REPOKEY_TYPE_U32: case REPOKEY_TYPE_CONSTANT: printf("%s: %u\n", keyname, kv->num); break; case REPOKEY_TYPE_NUM: printf("%s: %llu\n", keyname, SOLV_KV_NUM64(kv)); break; case REPOKEY_TYPE_BINARY: if (kv->num) printf("%s: %02x..%02x len %u\n", keyname, (unsigned char)kv->str[0], (unsigned char)kv->str[kv->num - 1], kv->num); else printf("%s: len 0\n", keyname); break; case REPOKEY_TYPE_DIRNUMNUMARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); printf(" %s %u %u\n", repodata_dir2str(data, kv->id, 0), kv->num, kv->num2); break; case REPOKEY_TYPE_DIRSTRARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); printf(" %s\n", repodata_dir2str(data, kv->id, kv->str)); break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: if (!kv->entry) printf("%s:\n", keyname); else printf("\n"); break; default: printf("%s: ?\n", keyname); break; } return 0; }
static int dump_attr_json(Repo *repo, Repodata *data, Repokey *key, KeyValue *kv, struct cbdata *cbdata) { Pool *pool = repo->pool; const char *keyname; KeyValue *kvp; int indent = cbdata->baseindent; int isarray = 0; const char *str; int depth = 0; keyname = pool_id2str(repo->pool, key->name); for (kvp = kv; (kvp = kvp->parent) != 0; indent += 4) depth++; if (cbdata->nfirst < depth + 1) { cbdata->first = solv_realloc(cbdata->first, depth + 16); memset(cbdata->first + cbdata->nfirst, 0, depth + 16 - cbdata->nfirst); cbdata->nfirst = depth + 16; } switch(key->type) { case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_DIRNUMNUMARRAY: case REPOKEY_TYPE_DIRSTRARRAY: isarray = 1; break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: isarray = 2; break; default: break; } if (!isarray || !kv->entry) { if (cbdata->first[depth]) printf(",\n"); printf("%*s%s: ", indent, "", jsonstring(pool, keyname)); cbdata->first[depth] = 1; } if (isarray == 1 && !kv->entry) printf("[\n%*s", indent + 2, ""); else if (isarray == 1 && kv->entry) printf("%*s", indent + 2, ""); switch(key->type) { case REPOKEY_TYPE_ID: if (data && data->localpool) str = stringpool_id2str(&data->spool, kv->id); else str = pool_dep2str(repo->pool, kv->id); printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_CONSTANTID: str = pool_dep2str(repo->pool, kv->id); printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_IDARRAY: if (data && data->localpool) str = stringpool_id2str(&data->spool, kv->id); else str = pool_dep2str(repo->pool, kv->id); printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_STR: str = kv->str; printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: case REPOKEY_TYPE_SHA256: printf("{\n"); printf("%*s \"value\": %s,\n", indent, "", jsonstring(pool, repodata_chk2str(data, key->type, (unsigned char *)kv->str))); printf("%*s \"type\": %s\n", indent, "", jsonstring(pool, pool_id2str(repo->pool, key->type))); printf("%*s}", indent, ""); break; case REPOKEY_TYPE_VOID: printf("null"); break; case REPOKEY_TYPE_U32: case REPOKEY_TYPE_CONSTANT: printf("%u", kv->num); break; case REPOKEY_TYPE_NUM: printf("%llu", SOLV_KV_NUM64(kv)); break; case REPOKEY_TYPE_BINARY: printf("\"<binary>\""); break; case REPOKEY_TYPE_DIRNUMNUMARRAY: printf("{\n"); printf("%*s \"dir\": %s,\n", indent, "", jsonstring(pool, repodata_dir2str(data, kv->id, 0))); printf("%*s \"num1\": %u,\n", indent, "", kv->num); printf("%*s \"num2\": %u\n", indent, "", kv->num2); printf("%*s }", indent, ""); break; case REPOKEY_TYPE_DIRSTRARRAY: printf("%s", jsonstring(pool, repodata_dir2str(data, kv->id, kv->str))); break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: cbdata->first[depth + 1] = 0; if (!kv->entry) printf("[\n"); else { if (kv->eof != 2) printf("\n%*s },\n", indent, ""); else printf("\n%*s }\n", indent, ""); } if (kv->eof != 2) printf("%*s {\n", indent, ""); else printf("%*s]", indent, ""); break; default: printf("\"?\""); break; } if (isarray == 1) { if (!kv->eof) printf(",\n"); else printf("\n%*s]", indent, ""); } return 0; }
/* before calling the expensive findfileconflicts_cb we check if any of * the files match. This only makes sense when cbdata->create is off. */ static int precheck_solvable_files(struct cbdata *cbdata, Pool *pool, Id p) { Dataiterator di; Id hx, qx; Hashval h, hh; int found = 0; int aliases = cbdata->aliases; unsigned int lastdirid = -1; Hashval lastdirhash = 0; int lastdirlen = 0; int checkthisdir = 0; Repodata *lastrepodata = 0; dataiterator_init(&di, pool, 0, p, SOLVABLE_FILELIST, 0, SEARCH_COMPLETE_FILELIST); while (dataiterator_step(&di)) { if (aliases) { /* hash just the basename */ hx = strhash(di.kv.str); if (!hx) hx = strlen(di.kv.str) + 1; } else { /* hash the full path */ if (di.data != lastrepodata || di.kv.id != lastdirid) { const char *dir; lastrepodata = di.data; lastdirid = di.kv.id; dir = repodata_dir2str(lastrepodata, lastdirid, ""); lastdirlen = strlen(dir); lastdirhash = strhash(dir); checkthisdir = isindirmap(cbdata, lastdirhash ? lastdirhash : lastdirlen + 1); } if (!checkthisdir) continue; hx = strhash_cont(di.kv.str, lastdirhash); if (!hx) hx = lastdirlen + strlen(di.kv.str) + 1; } h = hx & cbdata->cflmapn; hh = HASHCHAIN_START; for (;;) { qx = cbdata->cflmap[2 * h]; if (!qx) break; if (qx == hx) { found = 1; break; } h = HASHCHAIN_NEXT(h, hh, cbdata->cflmapn); } if (found) break; } dataiterator_free(&di); return found; }