Skip to content

Commit d9ebbcf

Browse files
committed
Improve handling of dirs in repo_write
Again, what was I thinking?
1 parent bbe1280 commit d9ebbcf

1 file changed

Lines changed: 27 additions & 41 deletions

File tree

src/repo_write.c

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -535,31 +535,6 @@ putinowndirpool(struct cbdata *cbdata, Repodata *data, Id dir)
535535
return cbdata->lastdirid_own;
536536
}
537537

538-
/*
539-
* collect usage information about the dirs
540-
* 1: dir used, no child of dir used
541-
* 2: dir used as parent of another used dir
542-
*/
543-
static inline void
544-
setdirused(struct cbdata *cbdata, Dirpool *dp, Id dir)
545-
{
546-
if (cbdata->dirused[dir])
547-
return;
548-
cbdata->dirused[dir] = 1;
549-
while ((dir = dirpool_parent(dp, dir)) != 0)
550-
{
551-
if (cbdata->dirused[dir] == 2)
552-
return;
553-
if (cbdata->dirused[dir])
554-
{
555-
cbdata->dirused[dir] = 2;
556-
return;
557-
}
558-
cbdata->dirused[dir] = 2;
559-
}
560-
cbdata->dirused[0] = 2;
561-
}
562-
563538
/*
564539
* pass 1 callback:
565540
* collect key/id/dirid usage information, create needed schemas
@@ -601,7 +576,7 @@ collect_needed_cb(void *vcbdata, Solvable *s, Repodata *data, Repokey *key, KeyV
601576
if (cbdata->owndirpool)
602577
putinowndirpool(cbdata, data, id);
603578
else
604-
setdirused(cbdata, &data->dirpool, id);
579+
cbdata->dirused[id] = 1;
605580
break;
606581
case REPOKEY_TYPE_FIXARRAY:
607582
case REPOKEY_TYPE_FLEXARRAY:
@@ -1707,41 +1682,49 @@ for (i = 1; i < target.nkeys; i++)
17071682

17081683
/********************************************************************/
17091684

1710-
if (dirpool && cbdata.dirused && !cbdata.dirused[0])
1711-
{
1712-
/* no dirs used at all */
1713-
cbdata.dirused = solv_free(cbdata.dirused);
1714-
dirpool = 0;
1715-
}
1716-
17171685
/* increment need id for used dir components */
1718-
if (dirpool)
1686+
if (cbdata.owndirpool)
17191687
{
17201688
/* if we have own dirpool, all entries in it are used.
17211689
also, all comp ids are already mapped by putinowndirpool(),
17221690
so we can simply increment needid.
17231691
(owndirpool != 0, dirused == 0, dirpooldata == 0) */
1692+
for (i = 1; i < dirpool->ndirs; i++)
1693+
{
1694+
id = dirpool->dirs[i];
1695+
if (id <= 0)
1696+
continue;
1697+
needid[id].need++;
1698+
}
1699+
}
1700+
else if (dirpool)
1701+
{
1702+
Id parent;
17241703
/* else we re-use a dirpool of repodata "dirpooldata".
17251704
dirused tells us which of the ids are used.
17261705
we need to map comp ids if we generate a new pool.
17271706
(owndirpool == 0, dirused != 0, dirpooldata != 0) */
1728-
for (i = 1; i < dirpool->ndirs; i++)
1707+
for (i = dirpool->ndirs - 1; i > 0; i--)
17291708
{
1730-
#if 0
1731-
fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1);
1732-
#endif
1733-
if (cbdata.dirused && !cbdata.dirused[i])
1709+
if (!cbdata.dirused[i])
17341710
continue;
1711+
parent = dirpool_parent(dirpool, i); /* always < i */
1712+
cbdata.dirused[parent] = 2; /* 2: used as parent */
17351713
id = dirpool->dirs[i];
17361714
if (id <= 0)
17371715
continue;
1738-
if (dirpooldata && cbdata.ownspool && id > 1)
1716+
if (cbdata.ownspool && id > 1 && (!cbdata.clonepool || dirpooldata->localpool))
17391717
{
17401718
id = putinownpool(&cbdata, dirpooldata, id);
17411719
needid = cbdata.needid;
17421720
}
17431721
needid[id].need++;
17441722
}
1723+
if (!cbdata.dirused[0])
1724+
{
1725+
cbdata.dirused = solv_free(cbdata.dirused);
1726+
dirpool = 0;
1727+
}
17451728
}
17461729

17471730

@@ -1817,7 +1800,10 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1);
18171800
* we will change this in the second step below */
18181801
/* (dirpooldata and dirused are 0 if we have our own dirpool) */
18191802
if (cbdata.dirused && !cbdata.dirused[1])
1820-
cbdata.dirused[1] = 1; /* always want / entry */
1803+
{
1804+
cbdata.dirused[1] = 1; /* always want / entry */
1805+
cbdata.dirused[0] = 2; /* always want / entry */
1806+
}
18211807
dirmap = solv_calloc(dirpool->ndirs, sizeof(Id));
18221808
dirmap[0] = 0;
18231809
ndirmap = traverse_dirs(dirpool, dirmap, 1, dirpool_child(dirpool, 0), cbdata.dirused);

0 commit comments

Comments
 (0)