@ -8,9 +8,11 @@
# include <apt-pkg/aptconfiguration.h>
# include <apt-pkg/error.h>
# include <set>
using namespace std ;
string debReleaseIndex : : Info ( const char * Type , const string Section ) const
string debReleaseIndex : : Info ( const char * Type , string const & Section , string const & Arch ) const
{
string Info = : : URI : : SiteOnly ( URI ) + ' ' ;
if ( Dist [ Dist . size ( ) - 1 ] = = ' / ' )
@ -19,7 +21,11 @@ string debReleaseIndex::Info(const char *Type, const string Section) const
Info + = Dist ;
}
else
Info + = Dist + ' / ' + Section ;
{
Info + = Dist + ' / ' + Section ;
if ( Arch . empty ( ) = = true )
Info + = " " + Arch ;
}
Info + = " " ;
Info + = Type ;
return Info ;
@ -61,16 +67,21 @@ string debReleaseIndex::MetaIndexURI(const char *Type) const
return Res ;
}
string debReleaseIndex : : IndexURISuffix ( const char * Type , const string Section ) const
string debReleaseIndex : : IndexURISuffix ( const char * Type , string const & Section , string const & Arch ) const
{
string Res = " " ;
if ( Dist [ Dist . size ( ) - 1 ] ! = ' / ' )
Res + = Section + " /binary- " + _config - > Find ( " APT::Architecture " ) + ' / ' ;
{
if ( Arch = = " native " )
Res + = Section + " /binary- " + _config - > Find ( " APT::Architecture " ) + ' / ' ;
else
Res + = Section + " /binary- " + Arch + ' / ' ;
}
return Res + Type ;
}
string debReleaseIndex : : IndexURI ( const char * Type , const string Section ) const
string debReleaseIndex : : IndexURI ( const char * Type , string const & Section , string const & Arch ) const
{
if ( Dist [ Dist . size ( ) - 1 ] = = ' / ' )
{
@ -82,10 +93,10 @@ string debReleaseIndex::IndexURI(const char *Type, const string Section) const
return Res + Type ;
}
else
return URI + " dists/ " + Dist + ' / ' + IndexURISuffix ( Type , Section ) ;
return URI + " dists/ " + Dist + ' / ' + IndexURISuffix ( Type , Section , Arch ) ;
}
string debReleaseIndex : : SourceIndexURISuffix ( const char * Type , const string Section ) const
string debReleaseIndex : : SourceIndexURISuffix ( const char * Type , const string & Section ) const
{
string Res = " " ;
if ( Dist [ Dist . size ( ) - 1 ] ! = ' / ' )
@ -93,7 +104,7 @@ string debReleaseIndex::SourceIndexURISuffix(const char *Type, const string Sect
return Res + Type ;
}
string debReleaseIndex : : SourceIndexURI ( const char * Type , const string Section ) const
string debReleaseIndex : : SourceIndexURI ( const char * Type , const string & Section ) const
{
string Res ;
if ( Dist [ Dist . size ( ) - 1 ] = = ' / ' )
@ -108,44 +119,61 @@ string debReleaseIndex::SourceIndexURI(const char *Type, const string Section) c
return URI + " dists/ " + Dist + " / " + SourceIndexURISuffix ( Type , Section ) ;
}
debReleaseIndex : : debReleaseIndex ( string URI , string Dist )
{
this - > URI = URI ;
this - > Dist = Dist ;
this - > Indexes = NULL ;
this - > Type = " deb " ;
debReleaseIndex : : debReleaseIndex ( string const & URI , string const & Dist ) {
this - > URI = URI ;
this - > Dist = Dist ;
this - > Indexes = NULL ;
this - > Type = " deb " ;
}
debReleaseIndex : : ~ debReleaseIndex ( )
{
for ( vector < const debSectionEntry * > : : const_iterator I = SectionEntries . begin ( ) ;
I ! = SectionEntries . end ( ) ; I + + )
delete * I ;
debReleaseIndex : : ~ debReleaseIndex ( ) {
for ( map < string , vector < debSectionEntry const * > > : : const_iterator A = ArchEntries . begin ( ) ;
A ! = ArchEntries . end ( ) ; + + A )
for ( vector < const debSectionEntry * > : : const_iterator S = A - > second . begin ( ) ;
S ! = A - > second . end ( ) ; + + S )
delete * S ;
}
vector < struct IndexTarget * > * debReleaseIndex : : ComputeIndexTargets ( ) const
{
vector < struct IndexTarget * > * IndexTargets = new vector < IndexTarget * > ;
for ( vector < const debSectionEntry * > : : const_iterator I = SectionEntries . begin ( ) ;
I ! = SectionEntries . end ( ) ;
I + + )
{
IndexTarget * Target = new IndexTarget ( ) ;
Target - > ShortDesc = ( * I ) - > IsSrc ? " Sources " : " Packages " ;
Target - > MetaKey
= ( * I ) - > IsSrc ? SourceIndexURISuffix ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section )
: IndexURISuffix ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section ) ;
Target - > URI
= ( * I ) - > IsSrc ? SourceIndexURI ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section )
: IndexURI ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section ) ;
Target - > Description = Info ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section ) ;
IndexTargets - > push_back ( Target ) ;
}
return IndexTargets ;
vector < struct IndexTarget * > * debReleaseIndex : : ComputeIndexTargets ( ) const {
vector < struct IndexTarget * > * IndexTargets = new vector < IndexTarget * > ;
map < string , vector < debSectionEntry const * > > : : const_iterator const src = ArchEntries . find ( " source " ) ;
if ( src ! = ArchEntries . end ( ) ) {
vector < debSectionEntry const * > const SectionEntries = src - > second ;
for ( vector < debSectionEntry const * > : : const_iterator I = SectionEntries . begin ( ) ;
I ! = SectionEntries . end ( ) ; + + I ) {
IndexTarget * Target = new IndexTarget ( ) ;
Target - > ShortDesc = " Sources " ;
Target - > MetaKey = SourceIndexURISuffix ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section ) ;
Target - > URI = SourceIndexURI ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section ) ;
Target - > Description = Info ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section ) ;
IndexTargets - > push_back ( Target ) ;
}
}
// Only source release
if ( IndexTargets - > empty ( ) = = false & & ArchEntries . size ( ) = = 1 )
return IndexTargets ;
for ( map < string , vector < debSectionEntry const * > > : : const_iterator a = ArchEntries . begin ( ) ;
a ! = ArchEntries . end ( ) ; + + a ) {
if ( a - > first = = " source " )
continue ;
for ( vector < const debSectionEntry * > : : const_iterator I = a - > second . begin ( ) ;
I ! = a - > second . end ( ) ; + + I ) {
IndexTarget * Target = new IndexTarget ( ) ;
Target - > ShortDesc = " Packages " ;
Target - > MetaKey = IndexURISuffix ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section , a - > first ) ;
Target - > URI = IndexURI ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section , a - > first ) ;
Target - > Description = Info ( Target - > ShortDesc . c_str ( ) , ( * I ) - > Section , a - > first ) ;
IndexTargets - > push_back ( Target ) ;
}
}
return IndexTargets ;
}
/*}}}*/
bool debReleaseIndex : : GetIndexes ( pkgAcquire * Owner , bool GetAll ) const
bool debReleaseIndex : : GetIndexes ( pkgAcquire * Owner , bool const & GetAll ) const
{
// special case for --print-uris
if ( GetAll ) {
@ -170,23 +198,27 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool GetAll) const
ComputeIndexTargets ( ) ,
new indexRecords ( Dist ) ) ;
// Queue the translations
std : : vector < std : : string > const lang = APT : : Configuration : : getLanguages ( true ) ;
for ( vector < const debSectionEntry * > : : const_iterator I = SectionEntries . begin ( ) ;
I ! = SectionEntries . end ( ) ; I + + ) {
if ( ( * I ) - > IsSrc )
continue ;
for ( vector < string > : : const_iterator l = lang . begin ( ) ;
l ! = lang . end ( ) ; l + + )
{
debTranslationsIndex i = debTranslationsIndex ( URI , Dist , ( * I ) - > Section , ( * l ) . c_str ( ) ) ;
i . GetIndexes ( Owner ) ;
}
}
return true ;
// Queue the translations
std : : vector < std : : string > const lang = APT : : Configuration : : getLanguages ( true ) ;
map < string , set < string > > sections ;
for ( map < string , vector < debSectionEntry const * > > : : const_iterator a = ArchEntries . begin ( ) ;
a ! = ArchEntries . end ( ) ; + + a ) {
if ( a - > first = = " source " )
continue ;
for ( vector < debSectionEntry const * > : : const_iterator I = a - > second . begin ( ) ;
I ! = a - > second . end ( ) ; I + + )
sections [ ( * I ) - > Section ] . insert ( lang . begin ( ) , lang . end ( ) ) ;
}
for ( map < string , set < string > > : : const_iterator s = sections . begin ( ) ;
s ! = sections . end ( ) ; + + s )
for ( set < string > : : const_iterator l = s - > second . begin ( ) ;
l ! = s - > second . end ( ) ; l + + ) {
debTranslationsIndex i = debTranslationsIndex ( URI , Dist , s - > first , ( * l ) . c_str ( ) ) ;
i . GetIndexes ( Owner ) ;
}
return true ;
}
bool debReleaseIndex : : IsTrusted ( ) const
@ -203,71 +235,111 @@ bool debReleaseIndex::IsTrusted() const
return false ;
}
vector < pkgIndexFile * > * debReleaseIndex : : GetIndexFiles ( )
{
if ( Indexes ! = NULL )
return Indexes ;
Indexes = new vector < pkgIndexFile * > ;
std : : vector < std : : string > const lang = APT : : Configuration : : getLanguages ( true ) ;
for ( vector < const debSectionEntry * > : : const_iterator I = SectionEntries . begin ( ) ;
I ! = SectionEntries . end ( ) ; I + + ) {
if ( ( * I ) - > IsSrc )
Indexes - > push_back ( new debSourcesIndex ( URI , Dist , ( * I ) - > Section , IsTrusted ( ) ) ) ;
else
{
Indexes - > push_back ( new debPackagesIndex ( URI , Dist , ( * I ) - > Section , IsTrusted ( ) ) ) ;
for ( vector < string > : : const_iterator l = lang . begin ( ) ;
l ! = lang . end ( ) ; l + + )
Indexes - > push_back ( new debTranslationsIndex ( URI , Dist , ( * I ) - > Section , ( * l ) . c_str ( ) ) ) ;
}
}
vector < pkgIndexFile * > * debReleaseIndex : : GetIndexFiles ( ) {
if ( Indexes ! = NULL )
return Indexes ;
Indexes = new vector < pkgIndexFile * > ;
map < string , vector < debSectionEntry const * > > : : const_iterator const src = ArchEntries . find ( " source " ) ;
if ( src ! = ArchEntries . end ( ) ) {
vector < debSectionEntry const * > const SectionEntries = src - > second ;
for ( vector < debSectionEntry const * > : : const_iterator I = SectionEntries . begin ( ) ;
I ! = SectionEntries . end ( ) ; I + + )
Indexes - > push_back ( new debSourcesIndex ( URI , Dist , ( * I ) - > Section , IsTrusted ( ) ) ) ;
}
// Only source release
if ( Indexes - > empty ( ) = = false & & ArchEntries . size ( ) = = 1 )
return Indexes ;
std : : vector < std : : string > const lang = APT : : Configuration : : getLanguages ( true ) ;
map < string , set < string > > sections ;
for ( map < string , vector < debSectionEntry const * > > : : const_iterator a = ArchEntries . begin ( ) ;
a ! = ArchEntries . end ( ) ; + + a ) {
if ( a - > first = = " source " )
continue ;
for ( vector < debSectionEntry const * > : : const_iterator I = a - > second . begin ( ) ;
I ! = a - > second . end ( ) ; I + + ) {
Indexes - > push_back ( new debPackagesIndex ( URI , Dist , ( * I ) - > Section , IsTrusted ( ) , a - > first ) ) ;
sections [ ( * I ) - > Section ] . insert ( lang . begin ( ) , lang . end ( ) ) ;
}
}
for ( map < string , set < string > > : : const_iterator s = sections . begin ( ) ;
s ! = sections . end ( ) ; + + s )
for ( set < string > : : const_iterator l = s - > second . begin ( ) ;
l ! = s - > second . end ( ) ; l + + )
Indexes - > push_back ( new debTranslationsIndex ( URI , Dist , s - > first , ( * l ) . c_str ( ) ) ) ;
return Indexes ;
}
return Indexes ;
void debReleaseIndex : : PushSectionEntry ( vector < string > const & Archs , const debSectionEntry * Entry ) {
for ( vector < string > : : const_iterator a = Archs . begin ( ) ;
a ! = Archs . end ( ) ; + + a )
ArchEntries [ * a ] . push_back ( new debSectionEntry ( Entry - > Section , Entry - > IsSrc ) ) ;
delete Entry ;
}
void debReleaseIndex : : PushSectionEntry ( const debSectionEntry * Entry )
{
SectionEntries . push_back ( Entry ) ;
void debReleaseIndex : : PushSectionEntry ( string const & Arch , const debSectionEntry * Entry ) {
ArchEntries [ Arch ] . push_back ( Entry ) ;
}
debReleaseIndex : : debSectionEntry : : debSectionEntry ( string Section , bool IsSrc ) : Section ( Section )
{
this - > IsSrc = IsSrc ;
void debReleaseIndex : : PushSectionEntry ( const debSectionEntry * Entry ) {
if ( Entry - > IsSrc = = true )
PushSectionEntry ( " source " , Entry ) ;
else {
for ( map < string , vector < const debSectionEntry * > > : : iterator a = ArchEntries . begin ( ) ;
a ! = ArchEntries . end ( ) ; + + a ) {
a - > second . push_back ( Entry ) ;
}
}
}
debReleaseIndex : : debSectionEntry : : debSectionEntry ( string const & Section ,
bool const & IsSrc ) : Section ( Section ) , IsSrc ( IsSrc )
{ }
class debSLTypeDebian : public pkgSourceList : : Type
{
protected :
bool CreateItemInternal ( vector < metaIndex * > & List , string URI ,
string Dist , string Section ,
bool IsSrc ) const
bool CreateItemInternal ( vector < metaIndex * > & List , string const & URI ,
string const & Dist , string const & Section ,
bool const & IsSrc , map < string , string > const & Options ) const
{
for ( vector < metaIndex * > : : const_iterator I = List . begin ( ) ;
map < string , string > : : const_iterator const arch = Options . find ( " arch " ) ;
vector < string > const Archs =
( arch ! = Options . end ( ) ) ? ExplodeString ( arch - > second ) :
APT : : Configuration : : getArchitectures ( ) ;
for ( vector < metaIndex * > : : const_iterator I = List . begin ( ) ;
I ! = List . end ( ) ; I + + )
{
// This check insures that there will be only one Release file
// queued for all the Packages files and Sources files it
// corresponds to.
if ( strcmp ( ( * I ) - > GetType ( ) , " deb " ) = = 0 )
// We only worry about debian entries here
if ( strcmp ( ( * I ) - > GetType ( ) , " deb " ) ! = 0 )
continue ;
debReleaseIndex * Deb = ( debReleaseIndex * ) ( * I ) ;
/* This check insures that there will be only one Release file
queued for all the Packages files and Sources files it
corresponds to . */
if ( Deb - > GetURI ( ) = = URI & & Deb - > GetDist ( ) = = Dist )
{
debReleaseIndex * Deb = ( debReleaseIndex * ) ( * I ) ;
// This check insures that there will be only one Release file
// queued for all the Packages files and Sources files it
// corresponds to.
if ( Deb - > GetURI ( ) = = URI & & Deb - > GetDist ( ) = = Dist )
{
Deb - > PushSectionEntry ( new debReleaseIndex : : debSectionEntry ( Section , IsSrc ) ) ;
return true ;
}
if ( IsSrc = = true )
Deb - > PushSectionEntry ( " source " , new debReleaseIndex : : debSectionEntry ( Section , IsSrc ) ) ;
else
Deb - > PushSectionEntry ( Archs , new debReleaseIndex : : debSectionEntry ( Section , IsSrc ) ) ;
return true ;
}
}
// No currently created Release file indexes this entry, so we create a new one.
// XXX determine whether this release is trusted or not
debReleaseIndex * Deb = new debReleaseIndex ( URI , Dist ) ;
Deb - > PushSectionEntry ( new debReleaseIndex : : debSectionEntry ( Section , IsSrc ) ) ;
debReleaseIndex * Deb = new debReleaseIndex ( URI , Dist ) ;
if ( IsSrc = = true )
Deb - > PushSectionEntry ( " source " , new debReleaseIndex : : debSectionEntry ( Section , IsSrc ) ) ;
else
Deb - > PushSectionEntry ( Archs , new debReleaseIndex : : debSectionEntry ( Section , IsSrc ) ) ;
List . push_back ( Deb ) ;
return true ;
}
@ -277,10 +349,11 @@ class debSLTypeDeb : public debSLTypeDebian
{
public :
bool CreateItem ( vector < metaIndex * > & List , string URI ,
string Dist , string Section ) const
bool CreateItem ( vector < metaIndex * > & List , string const & URI ,
string const & Dist , string const & Section ,
std : : map < string , string > const & Options ) const
{
return CreateItemInternal ( List , URI , Dist , Section , false ) ;
return CreateItemInternal ( List , URI , Dist , Section , false , Options ) ;
}
debSLTypeDeb ( )
@ -294,10 +367,11 @@ class debSLTypeDebSrc : public debSLTypeDebian
{
public :
bool CreateItem ( vector < metaIndex * > & List , string URI ,
string Dist , string Section ) const
bool CreateItem ( vector < metaIndex * > & List , string const & URI ,
string const & Dist , string const & Section ,
std : : map < string , string > const & Options ) const
{
return CreateItemInternal ( List , URI , Dist , Section , true ) ;
return CreateItemInternal ( List , URI , Dist , Section , true , Options ) ;
}
debSLTypeDebSrc ( )