From e37fdd53853b3e1f6e52d1e9f6670e798b5947e9 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Fri, 14 Mar 2008 10:04:18 +0000 Subject: [PATCH] - add repodata_dir2str function --- src/poolid.c | 2 +- src/repodata.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/repodata.h | 1 + tools/dumpsolv.c | 8 ++------ 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/poolid.c b/src/poolid.c index 35b521d..abd859f 100644 --- a/src/poolid.c +++ b/src/poolid.c @@ -233,7 +233,7 @@ dep2str(Pool *pool, Id id) dep2strcpy(pool, p, id); return p; } - + void pool_shrink_strings(Pool *pool) { diff --git a/src/repodata.c b/src/repodata.c index 53571c7..fe64c30 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -1487,6 +1487,52 @@ repodata_str2dir(Repodata *data, const char *dir, int create) return parent; } +const char * +repodata_dir2str(Repodata *data, Id did, const char *suf) +{ + Pool *pool = data->repo->pool; + int l = 0; + Id parent, comp; + const char *comps; + char *p; + + if (!did) + return suf ? suf : ""; + parent = did; + while (parent) + { + comp = dirpool_compid(&data->dirpool, parent); + comps = stringpool_id2str(data->localpool ? &data->spool : &pool->ss, comp); + l += strlen(comps); + parent = dirpool_parent(&data->dirpool, parent); + if (parent) + l++; + } + if (suf) + l += strlen(suf) + 1; + p = pool_alloctmpspace(pool, l + 1) + l; + *p = 0; + if (suf) + { + p -= strlen(suf); + strcpy(p, suf); + *--p = '/'; + } + parent = did; + while (parent) + { + comp = dirpool_compid(&data->dirpool, parent); + comps = stringpool_id2str(data->localpool ? &data->spool : &pool->ss, comp); + l = strlen(comps); + p -= l; + strncpy(p, comps, l); + parent = dirpool_parent(&data->dirpool, parent); + if (parent) + *--p = '/'; + } + return p; +} + unsigned int repodata_compress_page(unsigned char *page, unsigned int len, unsigned char *cpage, unsigned int max) { diff --git a/src/repodata.h b/src/repodata.h index a1c8bc9..49d8e0c 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -140,6 +140,7 @@ void repodata_internalize(Repodata *data); void repodata_disable_paging(Repodata *data); Id repodata_str2dir(Repodata *data, const char *dir, int create); +const char *repodata_dir2str(Repodata *data, Id did, const char *suf); unsigned int repodata_compress_page(unsigned char *, unsigned int, unsigned char *, unsigned int); void repodata_read_or_setup_pages(Repodata *data, unsigned int pagesz, unsigned int blobsz); diff --git a/tools/dumpsolv.c b/tools/dumpsolv.c index c3d5c68..480d300 100644 --- a/tools/dumpsolv.c +++ b/tools/dumpsolv.c @@ -104,14 +104,10 @@ dump_repoattrs_cb(void *vcbdata, Solvable *s, Repodata *data, Repokey *key, KeyV printf("%s: %d\n", keyname, kv->num); break; case REPOKEY_TYPE_DIRNUMNUMARRAY: - printf("%s: ", keyname); - printdir(data, kv->id); - printf(" %d %d\n", kv->num, kv->num2); + printf("%s: %s %d %d\n", keyname, repodata_dir2str(data, kv->id, 0), kv->num, kv->num2); break; case REPOKEY_TYPE_DIRSTRARRAY: - printf("%s: ", keyname); - printdir(data, kv->id); - printf("/%s\n", kv->str); + printf("%s: %s\n", keyname, repodata_dir2str(data, kv->id, kv->str)); break; default: printf("%s: ?\n", keyname); -- 2.7.4