]> git.saurik.com Git - apt.git/commitdiff
Config class and source list
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:50:43 +0000 (16:50 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:50:43 +0000 (16:50 +0000)
Author: jgg
Date: 1998-07-09 05:12:27 GMT
Config class and source list

apt-pkg/contrib/configuration.cc
apt-pkg/contrib/configuration.h
apt-pkg/contrib/strutl.h
apt-pkg/deb/deblistparser.cc
apt-pkg/init.cc [new file with mode: 0644]
apt-pkg/init.h [new file with mode: 0644]
apt-pkg/pkgcachegen.cc
apt-pkg/sourcelist.cc
apt-pkg/sourcelist.h
apt-pkg/tagfile.cc
apt-pkg/templates.cc [new file with mode: 0644]

index 6d937d65716165cad239e915a594a47912dbc3a7..7694330f98ed4018ef9ffed6f3eed06ab2d0b8c8 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: configuration.cc,v 1.1 1998/07/07 04:17:10 jgg Exp $
+// $Id: configuration.cc,v 1.2 1998/07/09 05:12:33 jgg Exp $
 /* ######################################################################
 
    Configuration Class
@@ -20,7 +20,8 @@
 
 #include <stdio.h>
                                                                        /*}}}*/
-Configuration *_config;
+
+Configuration *_config = new Configuration;
 
 // Configuration::Configuration - Constructor                          /*{{{*/
 // ---------------------------------------------------------------------
@@ -41,17 +42,18 @@ Configuration::Item *Configuration::Lookup(Item *Head,const char *S,
    Item *I = Head->Child;
    Item **Last = &Head->Child;
    for (; I != 0; Last = &I->Next, I = I->Next)
-      if ((Res = stringcasecmp(I->Value.begin(),I->Value.end(),S,S + Len)) == 0)
+      if ((Res = stringcasecmp(I->Tag.begin(),I->Tag.end(),S,S + Len)) == 0)
         break;
-
+   
    if (Res == 0)
       return I;
    if (Create == false)
       return 0;
    
    I = new Item;
-   I->Value = string(S,Len);
+   I->Tag = string(S,Len);
    I->Next = *Last;
+   I->Parent = Head;
    *Last = I;
    return I;
 }
@@ -78,8 +80,6 @@ Configuration::Item *Configuration::Lookup(const char *Name,bool Create)
    }   
 
    Itm = Lookup(Itm,Start,End - Start,Create);
-   if (Itm == 0)
-      return 0;
    return Itm;
 }
                                                                        /*}}}*/
@@ -90,10 +90,39 @@ string Configuration::Find(const char *Name,const char *Default)
 {
    Item *Itm = Lookup(Name,false);
    if (Itm == 0 || Itm->Value.empty() == true)
-      return Default;
+   {
+      if (Default == 0)
+        return string();
+      else
+        return Default;
+   }
+   
    return Itm->Value;
 }
                                                                        /*}}}*/
+// Configuration::FindDir - Find a directory                           /*{{{*/
+// ---------------------------------------------------------------------
+/* Directories are stored as the base dir in the Parent node and the
+ */
+string Configuration::FindDir(const char *Name,const char *Default = 0)
+{
+   Item *Itm = Lookup(Name,false);
+   if (Itm == 0 || Itm->Value.empty() == true)
+   {
+      if (Default == 0)
+        return string();
+      else
+        return Default;
+   }
+   
+   if (Itm->Value[0] == '/' || Itm->Parent == 0)
+      return Itm->Value;
+   if (Itm->Parent->Value.end()[-1] == '/')
+      return Itm->Parent->Value + Itm->Value;
+   else
+      return Itm->Parent->Value + '/' + Itm->Value;
+}
+                                                                       /*}}}*/
 // Configuration::FindI - Find an integer value                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
index 7476346ef37d1fb4c5098e83e19edd1b6b64ab00..bd06f5e37868222ce293c238ddcb5774fba9be18 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: configuration.h,v 1.1 1998/07/07 04:17:10 jgg Exp $
+// $Id: configuration.h,v 1.2 1998/07/09 05:12:34 jgg Exp $
 /* ######################################################################
 
    Configuration Class
@@ -21,8 +21,8 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Header section: pkglib
-#ifndef PKGLIB_TAGFILE_H
-#define PKGLIB_TAGFILE_H
+#ifndef PKGLIB_CONFIGURATION_H
+#define PKGLIB_CONFIGURATION_H
 
 #ifdef __GNUG__
 #pragma interface "pkglib/configuration.h"
@@ -36,6 +36,7 @@ class Configuration
    {
       string Value;
       string Tag;
+      Item *Parent;
       Item *Child;
       Item *Next;
       Item() : Child(0), Next(0) {};
@@ -48,11 +49,12 @@ class Configuration
    public:
 
    string Find(const char *Name,const char *Default = 0);
+   string FindDir(const char *Name,const char *Default = 0);
    int FindI(const char *Name,int Default = 0);
    
    void Set(const char *Name,string Value);
    void Set(const char *Name,int Value);
-
+   
    Configuration();
 };
 
index 44a10c2f3adccaa0baff435fd75002d8207581c0..0aabf01861d79664f71ad07c7d3084fb135a2cbe 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: strutl.h,v 1.1 1998/07/07 04:17:16 jgg Exp $
+// $Id: strutl.h,v 1.2 1998/07/09 05:12:35 jgg Exp $
 /* ######################################################################
 
    String Util - These are some usefull string functions
@@ -31,6 +31,8 @@ string SubstVar(string Str,string Subst,string Contents);
 string Base64Encode(string Str);
 
 int stringcmp(const char *A,const char *AEnd,const char *B,const char *BEnd);
+inline int stringcmp(const char *A,const char *AEnd,const char *B) {return stringcmp(A,AEnd,B,B+strlen(B));};
 int stringcasecmp(const char *A,const char *AEnd,const char *B,const char *BEnd);
+inline int stringcasecmp(const char *A,const char *AEnd,const char *B) {return stringcasecmp(A,AEnd,B,B+strlen(B));};
 
 #endif
index 5fbb43a9f357e06c6e2ba2d91b7a368d34438882..3c82ee51da2dda5ceffa4d1e47fa9746c1371919 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: deblistparser.cc,v 1.4 1998/07/07 04:17:16 jgg Exp $
+// $Id: deblistparser.cc,v 1.5 1998/07/09 05:12:37 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -12,6 +12,9 @@
 // Include Files                                                       /*{{{*/
 #include <pkglib/deblistparser.h>
 #include <pkglib/error.h>
+#include <pkglib/configuration.h>
+#include <strutl.h>
+
 #include <system.h>
                                                                        /*}}}*/
 
@@ -82,13 +85,13 @@ bool debListParser::HandleFlag(const char *Tag,unsigned long &Flags,
       return true;
    
    int Set = 2;
-   if (strncasecmp(Start,"yes",Stop - Start) == 0)
+   if (stringcasecmp(Start,Stop,"yes") == 0)
       Set = 1;
-   if (strncasecmp(Start,"true",Stop - Start) == 0)
+   if (stringcasecmp(Start,Stop,"true") == 0)
       Set = 1;
-   if (strncasecmp(Start,"no",Stop - Start) == 0)
+   if (stringcasecmp(Start,Stop,"no") == 0)
       Set = 0;
-   if (strncasecmp(Start,"false",Stop - Start) == 0)
+   if (stringcasecmp(Start,Stop,"false") == 0)
       Set = 0;
    if (Set == 2)
    {
@@ -489,6 +492,7 @@ bool debListParser::GrabWord(string Word,WordList *List,int Count,
 bool debListParser::Step()
 {
    iOffset = Tags.Offset();
+   string Arch = _config->Find("APT::architecture");
    while (Tags.Step(Section) == true)
    {
       /* See if this is the correct Architecture, if it isnt then we
@@ -497,13 +501,11 @@ bool debListParser::Step()
       const char *Stop;
       if (Section.Find("Architecture",Start,Stop) == false)
         return true;
-            
-      if (strncmp(Start,"i386",Stop - Start) == 0 &&
-         strlen("i386") == (unsigned)(Stop - Start))
+
+      if (stringcmp(Start,Stop,Arch.begin(),Arch.end()) == 0)
         return true;
 
-      if (strncmp(Start,"all",Stop - Start) == 0 &&
-         3 == (unsigned)(Stop - Start))
+      if (stringcmp(Start,Stop,"all") == 0)
         return true;
 
       iOffset = Tags.Offset();
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
new file mode 100644 (file)
index 0000000..5dd7b58
--- /dev/null
@@ -0,0 +1,43 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: init.cc,v 1.1 1998/07/09 05:12:27 jgg Exp $
+/* ######################################################################
+
+   Init - Initialize the package library
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Include files                                                       /*{{{*/
+#include <pkglib/init.h>
+                                                                       /*}}}*/
+
+// pkglibInitialize - Initialize the configuration class               /*{{{*/
+// ---------------------------------------------------------------------
+/* Directories are specified in such a way that the FindDir function will
+   understand them. That is, if they don't start with a / then their parent
+   is prepended, this allows a fair degree of flexability. */
+bool pkglibInitialize(Configuration &Cnf)
+{
+   // General APT things
+   Cnf.Set("APT::Architecture","i386");
+
+   // State
+   Cnf.Set("Dir::State","/var/state/apt/");
+   Cnf.Set("Dir::State::lists","lists/");
+   Cnf.Set("Dir::State::xstatus","xstatus");
+   Cnf.Set("Dir::State::userstatus","status.user");
+   
+   // Cache
+   Cnf.Set("Dir::Cache","/etc/apt/");
+   Cnf.Set("Dir::Cache::archives","archives/");
+   Cnf.Set("Dir::Cache::srcpkgcache","srcpkgcache");
+   Cnf.Set("Dir::Cache::pkhcache","pkgcache");
+   
+   // Configuration
+   Cnf.Set("Dir::Etc","/etc/apt/");
+   Cnf.Set("Dir::Etc::sourcelist","sources.list");
+   Cnf.Set("Dir::Etc::main","apt.conf");
+   
+   return true;
+}
+                                                                       /*}}}*/
diff --git a/apt-pkg/init.h b/apt-pkg/init.h
new file mode 100644 (file)
index 0000000..bd03dd1
--- /dev/null
@@ -0,0 +1,21 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: init.h,v 1.1 1998/07/09 05:12:27 jgg Exp $
+/* ######################################################################
+
+   Init - Initialize the package library
+
+   This function must be called to configure the config class before
+   calling many APT library functions.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Header section: pkglib
+#ifndef PKGLIB_INIT_H
+#define PKGLIB_INIT_H
+
+#include <pkglib/configuration.h>
+
+bool pkglibInitialize(Configuration &Cnf);
+
+#endif
index aac3f77d9596299cc074db051daa2e898d28c927..3e37c74f3517452bb75e72083bb005b059fac9d7 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcachegen.cc,v 1.7 1998/07/07 04:17:04 jgg Exp $
+// $Id: pkgcachegen.cc,v 1.8 1998/07/09 05:12:27 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -17,6 +17,7 @@
 #include <pkglib/pkgcachegen.h>
 #include <pkglib/error.h>
 #include <pkglib/version.h>
+#include <strutl.h>
 
 #include <sys/stat.h>
 #include <unistd.h>
@@ -329,9 +330,7 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S,
    for (; I != Cache.StringItemP; Last = &I->NextItem, 
         I = Cache.StringItemP + I->NextItem)
    {
-      Res = strncmp(Cache.StrP + I->String,S,Size);
-      if (Res == 0 && *(Cache.StrP + I->String + Size) != 0)
-        Res = 1;
+      Res = stringcmp(S,S+Size,Cache.StrP + I->String);
       if (Res >= 0)
         break;
    }
index 62d5e6fcd5eb98b23757a2e2bbe9a7f30026140a..bce3e5990dcf46b8fd2a9c057cb8b2fdf5c2d6cb 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: sourcelist.cc,v 1.1 1998/07/07 04:17:06 jgg Exp $
+// $Id: sourcelist.cc,v 1.2 1998/07/09 05:12:28 jgg Exp $
 /* ######################################################################
 
    List of Sources
@@ -15,8 +15,8 @@
 #include <pkglib/sourcelist.h>
 #include <pkglib/error.h>
 #include <pkglib/fileutl.h>
+#include <pkglib/configuration.h>
 #include <strutl.h>
-#include <options.h>
 
 #include <fstream.h>
 #include <stdio.h>
@@ -41,7 +41,7 @@ pkgSourceList::pkgSourceList(string File)
 /* */
 bool pkgSourceList::ReadMainList()
 {
-   return Read(PKG_DEB_CF_SOURCELIST);
+   return Read(_config->Find("APT::Etc:sourcelist"));
 }
                                                                        /*}}}*/
 // SourceList::Read - Parse the sourcelist file                                /*{{{*/
@@ -90,7 +90,7 @@ bool pkgSourceList::Read(string File)
       {
         if (ParseQuoteWord(C,Itm.Section) == true)
            return _error->Error("Malformed line %u in source list %s (Absolute dist)",CurLine,File.c_str());
-        Itm.Dist = SubstVar(Itm.Dist,"$(ARCH)",PKG_DEB_ARCH);
+        Itm.Dist = SubstVar(Itm.Dist,"$(ARCH)",_config->Find("APT::Architecture"));
         List.push_back(Itm);
         continue;
       }
@@ -132,15 +132,15 @@ string pkgSourceList::SanitizeURI(string URI)
    file */
 pkgSourceList::const_iterator pkgSourceList::MatchPkgFile(pkgCache::VerIterator Ver)
 {
-   string Base = PKG_DEB_ST_LIST;
+   string Base = _config->Find("APT::Architecture");
    for (const_iterator I = List.begin(); I != List.end(); I++)
    {
       string URI = I->PackagesURI();
       switch (I->Type)
       {
         case Item::Deb:
-        if (Base + SanitizeURI(URI) == Ver.File().FileName())
-           return I;
+/*      if (Base + SanitizeURI(URI) == Ver.File().FileName())
+           return I;*/
         break;
       };      
    }
@@ -182,7 +182,7 @@ bool pkgSourceList::Item::SetURI(string S)
    if (S.find(':') == string::npos)
       return false;
 
-   S = SubstVar(S,"$(ARCH)",PKG_DEB_ARCH);
+   S = SubstVar(S,"$(ARCH)",_config->Find("APT::Architecture"));
    
    // Make sure that the URN is / postfixed
    URI = S;
@@ -204,8 +204,8 @@ string pkgSourceList::Item::PackagesURI() const
       if (Dist[Dist.size() - 1] == '/')
         Res = URI + Dist;
       else
-        Res = URI + "dists/" + Dist + '/' + Section + 
-        "/binary-" + PKG_DEB_ARCH + '/';
+        Res = URI + "dists/" + Dist + '/' + Section +
+        "/binary-" + _config->Find("APT::Architecture") + '/';
       
       Res += "Packages";
       break;
@@ -288,178 +288,3 @@ string pkgSourceList::Item::SiteOnly(string URI) const
    return string(URI,0,Pos);
 }
                                                                        /*}}}*/
-
-// UpdateMeta - Update the meta information                            /*{{{*/
-// ---------------------------------------------------------------------
-/* The meta information is package files, revision information and mirror
-   lists. */
-bool pkgUpdateMeta(pkgSourceList &List,pkgAquire &Engine)
-{
-   if (Engine.OutputDir(PKG_DEB_ST_LIST) == false)
-      return false;
-   
-   for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++)
-   {
-      string URI = I->PackagesURI();
-      string GetInfo = I->PackagesInfo();
-      switch (I->Type)
-      {
-        case pkgSourceList::Item::Deb:
-           if (Engine.Get(URI + ".gz",List.SanitizeURI(URI),GetInfo) == false)
-              return false;
-        break;
-      };      
-   }
-   
-   return true;
-}
-                                                                       /*}}}*/
-// MakeSrcCache - Generate a cache file of all the package files       /*{{{*/
-// ---------------------------------------------------------------------
-/* This goes over the source list and builds a cache of all the package
-   files. */
-bool pkgMakeSrcCache(pkgSourceList &List)
-{
-   // First we date check the cache
-   bool Bad = false;
-   while (Bad == false)
-   {
-      if (FileExists(PKG_DEB_CA_SRCCACHE) == false)
-         break;
-         
-      pkgCache Cache(PKG_DEB_CA_SRCCACHE,true,true);
-      if (_error->PendingError() == true)
-      {
-        _error->Discard();
-        break;
-      }
-      
-      // They are certianly out of sync
-      if (Cache.Head().PackageFileCount != List.size())
-         break;
-      
-      for (pkgCache::PkgFileIterator F(Cache); F.end() == false; F++)
-      {
-        // Search for a match in the source list
-        Bad = true;
-        for (pkgSourceList::const_iterator I = List.begin(); 
-             I != List.end(); I++)
-        {
-           string File = string(PKG_DEB_ST_LIST) + 
-              List.SanitizeURI(I->PackagesURI());
-           if (F.FileName() == File)
-           {
-              Bad = false;
-              break;
-           }
-        }
-        
-        // Check if the file matches what was cached
-        Bad |= !F.IsOk();
-        if (Bad == true)
-           break;
-      }      
-
-      if (Bad == false)
-        return true;
-   }
-   
-   unlink(PKG_DEB_CA_SRCCACHE);
-   pkgCache::MergeState Merge(PKG_DEB_CA_SRCCACHE);
-   if (_error->PendingError() == true)
-            return false;
-   
-   for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++)
-   {
-      string File = string(PKG_DEB_ST_LIST) + List.SanitizeURI(I->PackagesURI());
-      if (Merge.MergePackageFile(File,"??","??") == false)
-        return false;
-   }
-          
-   return true;
-}
-                                                                       /*}}}*/
-// MakeStatusCache - Generates a cache that includes the status files  /*{{{*/
-// ---------------------------------------------------------------------
-/* This copies the package source cache and then merges the status and 
-   xstatus files into it. */
-bool pkgMakeStatusCache()
-{
-   // Quickly check if the existing package cache is ok
-   bool Bad = false;
-   while (Bad == false)
-   {
-      if (FileExists(PKG_DEB_CA_PKGCACHE) == false)
-         break;
-      
-      /* We check the dates of the two caches. This takes care of most things
-         quickly and easially */
-      struct stat Src;
-      struct stat Pkg;
-      if (stat(PKG_DEB_CA_PKGCACHE,&Pkg) != 0 || 
-         stat(PKG_DEB_CA_SRCCACHE,&Src) != 0)
-        break;
-      if (difftime(Src.st_mtime,Pkg.st_mtime) > 0)
-        break;
-
-      pkgCache Cache(PKG_DEB_CA_PKGCACHE,true,true);
-      if (_error->PendingError() == true)
-      {
-        _error->Discard();
-        break;
-      }
-      
-      for (pkgCache::PkgFileIterator F(Cache); F.end() == false; F++)
-      {
-        if (F.IsOk() == false)
-        {
-           Bad = true;
-           break;
-        }
-      }
-      
-      if (Bad == false)
-        return true;
-   }   
-
-   // Check the integrity of the source cache.
-   {
-      pkgCache Cache(PKG_DEB_CA_SRCCACHE,true,true);
-      if (_error->PendingError() == true)
-        return false;
-   }
-   
-   // Sub scope so that merge destructs before we rename the file...
-   string Cache = PKG_DEB_CA_PKGCACHE ".new";
-   {
-      if (CopyFile(PKG_DEB_CA_SRCCACHE,Cache) == false)
-        return false;
-
-      pkgCache::MergeState Merge(Cache);
-      if (_error->PendingError() == true)
-        return false;
-      
-      // Merge in the user status file
-      if (FileExists(PKG_DEB_ST_USERSTATUS) == true)
-        if (Merge.MergePackageFile(PKG_DEB_ST_USERSTATUS,"status","0",
-                                   pkgFLAG_NotSource) == false)
-           return false;
-      
-      // Merge in the extra status file
-      if (FileExists(PKG_DEB_ST_XSTATUS) == true)
-        if (Merge.MergePackageFile(PKG_DEB_ST_XSTATUS,"status","0",
-                                   pkgFLAG_NotSource) == false)
-           return false;
-      
-      // Merge in the status file
-      if (Merge.MergePackageFile("/var/lib/dpkg/status","status","0",
-                                pkgFLAG_NotSource) == false)
-        return false;
-   }
-   
-   if (rename(Cache.c_str(),PKG_DEB_CA_PKGCACHE) != 0)
-      return false;
-   
-   return true;
-}
-                                                                       /*}}}*/
index 986d5e9e8839f32a93fcbcfba67393ad91926f67..43739fbcd1634679fa6834a40b3a3fd53beecaee 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: sourcelist.h,v 1.1 1998/07/07 04:17:06 jgg Exp $
+// $Id: sourcelist.h,v 1.2 1998/07/09 05:12:31 jgg Exp $
 /* ######################################################################
 
    SourceList - Manage a list of sources
@@ -69,10 +69,6 @@ class pkgSourceList
    pkgSourceList(string File);   
 };
 
-bool pkgUpdateMeta(pkgSourceList &List,pkgAquire &Engine);
-bool pkgMakeSrcCache(pkgSourceList &List);
-bool pkgMakeStatusCache();
-
 ostream &operator <<(ostream &O,pkgSourceList::Item &Itm);
 
 #endif
index b8845a3b12c37a0993b100fcb5bc68306b7451cb..aaef3da8b329d493f15eca8e5df03a3f6f3be959 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: tagfile.cc,v 1.5 1998/07/07 04:17:06 jgg Exp $
+// $Id: tagfile.cc,v 1.6 1998/07/09 05:12:32 jgg Exp $
 /* ######################################################################
 
    Fast scanner for RFC-822 type header information
@@ -17,6 +17,7 @@
 
 #include <pkglib/tagfile.h>
 #include <pkglib/error.h>
+#include <pkglib/init.h>
 
 #include <string>
 #include <stdio.h>
@@ -158,6 +159,10 @@ bool pkgTagSection::Find(const char *Tag,const char *&Start,
 
 int main(int argc,char *argv[])
 {
+   pkglibInitialize(*_config);
+   cout << _config->Find("APT::arch") << endl;
+   cout << _config->FindDir("DIR::Etc::sourcelist") << endl;
+   
    {
       File CacheF("./cache",File::WriteEmpty);
       DynamicMMap Map(CacheF,MMap::Public);
diff --git a/apt-pkg/templates.cc b/apt-pkg/templates.cc
new file mode 100644 (file)
index 0000000..0f86bde
--- /dev/null
@@ -0,0 +1,5 @@
+/* All template instances are explicly declared here */
+
+#include <pkglib/sourcelist.h>
+
+template vector<pkgSourceList::Item>;