]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/srcrecords.cc
merged from the debian-sid branch
[apt.git] / apt-pkg / srcrecords.cc
index 05be79a5a59c4306477d5a348829126fa6d72f3a..d63d2c422b64b65b7d2acf233740ec113f818fd8 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: srcrecords.cc,v 1.1 1999/04/04 01:17:29 jgg Exp $
+// $Id: srcrecords.cc,v 1.7.2.2 2003/12/26 16:27:34 mdz Exp $
 /* ######################################################################
    
    Source Package Records - Allows access to source package records
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/srcrecords.h"
-#endif 
+#include<config.h>
 
 #include <apt-pkg/srcrecords.h>
 #include <apt-pkg/error.h>
-#include <apt-pkg/configuration.h>
+#include <apt-pkg/sourcelist.h>
 #include <apt-pkg/strutl.h>
-#include <apt-pkg/debsrcrecords.h>
+#include <apt-pkg/metaindex.h>
+
+#include <apti18n.h>
                                                                        /*}}}*/
 
 // SrcRecords::pkgSrcRecords - Constructor                             /*{{{*/
 // ---------------------------------------------------------------------
 /* Open all the source index files */
-pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
+pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : d(NULL), Files(0), Current(0)
 {
-   pkgSourceList::const_iterator I = List.begin();
-   
-   // Count how many items we will need
-   unsigned int Count = 0;
-   for (; I != List.end(); I++)
-      if (I->Type == pkgSourceList::Item::DebSrc)
-        Count++;
-
-   // Doesnt work without any source index files
-   if (Count == 0)
+   for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); ++I)
    {
-      _error->Error("Sorry, you must put some 'source' uris"
-                   " in your sources.list");
-      return;
-   }   
-
-   Files = new Parser *[Count+1];
-   memset(Files,0,sizeof(*Files)*(Count+1));
-   
-   // Create the parser objects
-   Count = 0;
-   string Dir = _config->FindDir("Dir::State::lists");
-   for (I = List.begin(); I != List.end(); I++)
-   {
-      if (I->Type != pkgSourceList::Item::DebSrc)
-        continue;
-
-      // Open the file
-      FileFd *FD = new FileFd(Dir + URItoFileName(I->PackagesURI()),
-                             FileFd::ReadOnly);
-      if (_error->PendingError() == true)
+      std::vector<pkgIndexFile *> *Indexes = (*I)->GetIndexFiles();
+      for (std::vector<pkgIndexFile *>::const_iterator J = Indexes->begin();
+          J != Indexes->end(); ++J)
       {
-        delete FD;
-        return;
+         Parser* P = (*J)->CreateSrcParser();
+        if (_error->PendingError() == true)
+            return;
+         if (P != 0)
+            Files.push_back(P);
       }
-      
-      Files[Count] = new debSrcRecordParser(FD);
-      Count++;
    }
    
+   // Doesn't work without any source index files
+   if (Files.size() == 0)
+   {
+      _error->Error(_("You must put some 'source' URIs"
+                   " in your sources.list"));
+      return;
+   }   
+
    Restart();
 }
                                                                        /*}}}*/
@@ -75,12 +57,9 @@ pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
 /* */
 pkgSrcRecords::~pkgSrcRecords()
 {
-   if (Files == 0)
-      return;
-
    // Blow away all the parser objects
-   for (unsigned int Count = 0; Files[Count] != 0; Count++)
-      delete Files[Count];
+   for(std::vector<Parser*>::iterator I = Files.begin(); I != Files.end(); ++I)
+      delete *I;
 }
                                                                        /*}}}*/
 // SrcRecords::Restart - Restart the search                            /*{{{*/
@@ -88,10 +67,11 @@ pkgSrcRecords::~pkgSrcRecords()
 /* Return all of the parsers to their starting position */
 bool pkgSrcRecords::Restart()
 {
-   Current = Files;
-   for (Parser **I = Files; *I != 0; I++)
-      if ((*I)->Restart() == false)
-        return false;
+   Current = Files.begin();
+   for (std::vector<Parser*>::iterator I = Files.begin();
+        I != Files.end(); ++I)
+      (*I)->Restart();
+   
    return true;
 }
                                                                        /*}}}*/
@@ -100,9 +80,9 @@ bool pkgSrcRecords::Restart()
 /* This searches on both source package names and output binary names and
    returns the first found. A 'cursor' like system is used to allow this
    function to be called multiple times to get successive entries */
-pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
+pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool const &SrcOnly)
 {
-   if (*Current == 0)
+   if (Current == Files.end())
       return 0;
    
    while (true)
@@ -112,8 +92,8 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
       {
         if (_error->PendingError() == true)
            return 0;
-        Current++;
-        if (*Current == 0)
+        ++Current;
+        if (Current == Files.end())
            return 0;
       }
       
@@ -130,10 +110,26 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
       
       // Check for a binary hit
       const char **I = (*Current)->Binaries();
-      for (; I != 0 && *I != 0; I++)
+      for (; I != 0 && *I != 0; ++I)
         if (strcmp(Package,*I) == 0)
            return *Current;
    }
 }
                                                                        /*}}}*/
+// Parser::BuildDepType - Convert a build dep to a string              /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+const char *pkgSrcRecords::Parser::BuildDepType(unsigned char const &Type)
+{
+   const char *fields[] = {"Build-Depends", 
+                           "Build-Depends-Indep",
+                          "Build-Conflicts",
+                          "Build-Conflicts-Indep"};
+   if (Type < 4) 
+      return fields[Type]; 
+   else 
+      return "";
+}
+                                                                       /*}}}*/
+