@@ -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