]> git.saurik.com Git - apt.git/commitdiff
create debIFTypeDscFile type
authorMichael Vogt <mvo@ubuntu.com>
Wed, 23 Apr 2014 11:51:48 +0000 (13:51 +0200)
committerMichael Vogt <mvo@ubuntu.com>
Thu, 24 Apr 2014 05:33:59 +0000 (07:33 +0200)
apt-pkg/deb/debindexfile.cc
apt-pkg/deb/debindexfile.h
apt-pkg/deb/debsrcrecords.cc
apt-pkg/deb/debsrcrecords.h
apt-pkg/indexfile.h
apt-pkg/pkgsystem.h
apt-pkg/sourcelist.h
cmdline/apt-get.cc

index eee758b7a124d388ac1d1fe1c9cb84c38d6fe806..e7e764dd4ccfe1e3299fc74569cec64d8d78e33b 100644 (file)
@@ -667,6 +667,42 @@ APT_CONST bool debStatusIndex::Exists() const
 }
                                                                        /*}}}*/
 
+
+// debDscFileIndex stuff
+debDscFileIndex::debDscFileIndex(std::string &DscFile) 
+   : pkgIndexFile(true), DscFile(DscFile)
+{
+}
+
+bool debDscFileIndex::Exists() const
+{
+   return FileExists(DscFile);
+}
+
+unsigned long debDscFileIndex::Size() const
+{
+   struct stat buf;
+   if(stat(DscFile.c_str(), &buf) == 0)
+      return buf.st_size;
+   return 0;
+}
+
+// DscFileIndex::CreateSrcParser - Get a parser for the .dsc file      /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+pkgSrcRecords::Parser *debDscFileIndex::CreateSrcParser() const
+{
+   if (!FileExists(DscFile))
+      return NULL;
+
+   return new debDscRecordParser(DscFile,this);
+}
+                                                                       /*}}}*/
+
+
+
+
+// ---------------------------------------------------------------------
 // Index File types for Debian                                         /*{{{*/
 class debIFTypeSrc : public pkgIndexFile::Type
 {
@@ -699,10 +735,22 @@ class debIFTypeStatus : public pkgIndexFile::Type
    };
    debIFTypeStatus() {Label = "Debian dpkg status file";};
 };
+class debIFTypeDscFile : public pkgIndexFile::Type
+{
+   public:
+   virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string DscFile) const
+   {
+      return new debDscRecordParser(DscFile, NULL);
+   };
+   debIFTypeDscFile() {Label = "dsc File Source Index";};
+};
+
 static debIFTypeSrc _apt_Src;
 static debIFTypePkg _apt_Pkg;
 static debIFTypeTrans _apt_Trans;
 static debIFTypeStatus _apt_Status;
+// file based pseudo indexes
+static debIFTypeDscFile _apt_DscFile;
 
 const pkgIndexFile::Type *debSourcesIndex::GetType() const
 {
@@ -720,5 +768,9 @@ const pkgIndexFile::Type *debStatusIndex::GetType() const
 {
    return &_apt_Status;
 }
+const pkgIndexFile::Type *debDscFileIndex::GetType() const
+{
+   return &_apt_DscFile;
+}
 
                                                                        /*}}}*/
index 017c69a0a907c67c36ad35f66128945dd1beef5a..88abfdd9d06c197c200fc171595ac83e21db6d3b 100644 (file)
@@ -164,4 +164,22 @@ class debSourcesIndex : public pkgIndexFile
    virtual ~debSourcesIndex() {};
 };
 
+class debDscFileIndex : public pkgIndexFile
+{
+ private:
+   std::string DscFile;
+ public:
+   virtual const Type *GetType() const APT_CONST;
+   virtual pkgSrcRecords::Parser *CreateSrcParser() const;
+   virtual bool Exists() const;
+   virtual bool HasPackages() const {return false;};
+   virtual unsigned long Size() const;
+   virtual std::string Describe(bool /*Short*/) const {
+      return DscFile;
+   };
+
+   debDscFileIndex(std::string &DscFile);
+   virtual ~debDscFileIndex() {};
+};
+
 #endif
index fc748c40f9b6518df9bb6caa337a11cc9e96db9b..8aad81e3cfd839d029f96efe0147d88e61e8e6d5 100644 (file)
@@ -192,8 +192,8 @@ debSrcRecordParser::~debSrcRecordParser()
                                                                        /*}}}*/
 
 
-debDscRecordParser::debDscRecordParser(std::string const &DscFile)
-   : debSrcRecordParser(DscFile, NULL)
+debDscRecordParser::debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index)
+   : debSrcRecordParser(DscFile, Index)
 {
    // support clear signed files
    if (OpenMaybeClearSignedFile(DscFile, Fd) == false)
index 0cd6648189defe558648f9b927fadc58d6396b16..a0a15187529643ce410aff5605473d2d433b349b 100644 (file)
@@ -64,7 +64,7 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
 class debDscRecordParser : public debSrcRecordParser
 {
  public:
-   debDscRecordParser(std::string const &DscFile);
+   debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index);
 };
 
 #endif
index b5c9ac77e7aa751d979ea8f48f62da39dd3a79c6..817165f087a4393655b314c95bf55a574bf2835b 100644 (file)
@@ -59,6 +59,7 @@ class pkgIndexFile
       const char *Label;
 
       virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator /*File*/) const {return 0;};
+      virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string /*File*/) const {return 0;};
       Type();
       virtual ~Type() {};
    };
index 6e33c67ed338944bf6a7c328741621c030b440d8..f88ffa7c82ab2980a55328e9fd56837b0e7f1883 100644 (file)
@@ -85,10 +85,12 @@ class pkgSystem
    virtual bool AddStatusFiles(std::vector<pkgIndexFile *> &List) = 0;   
    virtual bool FindIndex(pkgCache::PkgFileIterator File,
                          pkgIndexFile *&Found) const = 0;
-   
+
    /* Evauluate how 'right' we are for this system based on the filesystem
       etc.. */
-   virtual signed Score(Configuration const &/*Cnf*/) {return 0;};
+   virtual signed Score(Configuration const &/*Cnf*/) {
+      return 0;
+   };
    
    pkgSystem();
    virtual ~pkgSystem() {};
index 9df0c1d7419c3fbd46e38fef1d113fbd8e06b067..0ebf4e0807ec7d326fe49bce377564374920d21c 100644 (file)
@@ -86,7 +86,7 @@ class pkgSourceList
    
    typedef std::vector<metaIndex *>::const_iterator const_iterator;
    
-   protected:
+   public:
 
    std::vector<metaIndex *> SrcList;
 
index 92384931b07900e625ce13a8c4db575d36830cb3..5418c351bd7ac63b83bb8a41e056a9ad34bd550e 100644 (file)
@@ -57,9 +57,6 @@
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/upgrade.h>
 
-// FIXME: direct include of deb specific header
-#include <apt-pkg/debsrcrecords.h>
-
 #include <apt-private/acqprogress.h>
 #include <apt-private/private-cacheset.h>
 #include <apt-private/private-cachefile.h>
@@ -1057,22 +1054,25 @@ static bool DoBuildDep(CommandLine &CmdL)
    {
       string Src;
       pkgSrcRecords::Parser *Last = 0;
-      vector<pkgSrcRecords::Parser::BuildDepRec> BuildDeps;
 
-      // support local .dsc files
-      if (FileExists(*I) && flExtension(*I) == "dsc")
+      // if its a local file (e.g. .dsc) use this
+      if (FileExists(*I))
       {
-         // FIXME: add a layer of abstraction
-         Last = new debDscRecordParser(*I);
-         Src = *I;
+         // see if we can get a parser for this pkgIndexFile type
+         string TypeName = flExtension(*I) + " File Source Index";
+         pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(TypeName.c_str());
+         if(Type != NULL)
+            Last = Type->CreateSrcPkgParser(*I);
       } else {
+         // normal case, search the cache for the source file
          Last = FindSrc(*I,Recs,SrcRecs,Src,Cache);
       }
+
       if (Last == 0)
         return _error->Error(_("Unable to find a source package for %s"),Src.c_str());
             
       // Process the build-dependencies
-
+      vector<pkgSrcRecords::Parser::BuildDepRec> BuildDeps;
       // FIXME: Can't specify architecture to use for [wildcard] matching, so switch default arch temporary
       if (hostArch.empty() == false)
       {