Просмотр исходного кода

add support for apt-get build-dep foo.dsc

Michael Vogt лет назад: 12
Родитель
Сommit
feab34c521

+ 19 - 0
apt-pkg/deb/debsrcrecords.cc

@@ -18,6 +18,7 @@
 #include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/srcrecords.h>
 #include <apt-pkg/srcrecords.h>
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/tagfile.h>
+#include <apt-pkg/gpgv.h>
 
 
 #include <ctype.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <stdlib.h>
@@ -189,3 +190,21 @@ debSrcRecordParser::~debSrcRecordParser()
    delete[] Buffer;
    delete[] Buffer;
 }
 }
 									/*}}}*/
 									/*}}}*/
+
+
+debDscRecordParser::debDscRecordParser(std::string const &DscFile)
+   : debSrcRecordParser(DscFile, NULL)
+{
+   // support clear signed files
+   if (OpenMaybeClearSignedFile(DscFile, Fd) == false)
+   {
+      _error->Error("Failed to open %s", DscFile.c_str());
+      return;
+   }
+
+   // re-init to ensure the updated Fd is used
+   Tags.Init(&Fd);
+   // read the first (and only) record
+   Step();
+
+}

+ 7 - 0
apt-pkg/deb/debsrcrecords.h

@@ -26,6 +26,7 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
    /** \brief dpointer placeholder (for later in case we need it) */
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
    void *d;
 
 
+ protected:
    FileFd Fd;
    FileFd Fd;
    pkgTagFile Tags;
    pkgTagFile Tags;
    pkgTagSection Sect;
    pkgTagSection Sect;
@@ -60,4 +61,10 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
    virtual ~debSrcRecordParser();
    virtual ~debSrcRecordParser();
 };
 };
 
 
+class debDscRecordParser : public debSrcRecordParser
+{
+ public:
+   debDscRecordParser(std::string const &DscFile);
+};
+
 #endif
 #endif

+ 11 - 0
apt-pkg/tagfile.cc

@@ -51,12 +51,23 @@ public:
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
 pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long long Size)
 pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long long Size)
+   : d(NULL)
+{
+   Init(pFd, Size);
+}
+
+void pkgTagFile::Init(FileFd *pFd,unsigned long long Size)
 {
 {
    /* The size is increased by 4 because if we start with the Size of the
    /* The size is increased by 4 because if we start with the Size of the
       filename we need to try to read 1 char more to see an EOF faster, 1
       filename we need to try to read 1 char more to see an EOF faster, 1
       char the end-pointer can be on and maybe 2 newlines need to be added
       char the end-pointer can be on and maybe 2 newlines need to be added
       to the end of the file -> 4 extra chars */
       to the end of the file -> 4 extra chars */
    Size += 4;
    Size += 4;
+   if(d != NULL)
+   {
+      free(d->Buffer);
+      delete d;
+   }
    d = new pkgTagFilePrivate(pFd, Size);
    d = new pkgTagFilePrivate(pFd, Size);
 
 
    if (d->Fd.IsOpen() == false)
    if (d->Fd.IsOpen() == false)

+ 2 - 0
apt-pkg/tagfile.h

@@ -105,6 +105,8 @@ class pkgTagFile
    unsigned long Offset();
    unsigned long Offset();
    bool Jump(pkgTagSection &Tag,unsigned long long Offset);
    bool Jump(pkgTagSection &Tag,unsigned long long Offset);
 
 
+   void Init(FileFd *F,unsigned long long Size = 32*1024);
+
    pkgTagFile(FileFd *F,unsigned long long Size = 32*1024);
    pkgTagFile(FileFd *F,unsigned long long Size = 32*1024);
    virtual ~pkgTagFile();
    virtual ~pkgTagFile();
 };
 };

+ 17 - 3
cmdline/apt-get.cc

@@ -57,6 +57,9 @@
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/upgrade.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/acqprogress.h>
 #include <apt-private/private-cacheset.h>
 #include <apt-private/private-cacheset.h>
 #include <apt-private/private-cachefile.h>
 #include <apt-private/private-cachefile.h>
@@ -1053,12 +1056,23 @@ static bool DoBuildDep(CommandLine &CmdL)
    for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
    for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
    {
    {
       string Src;
       string Src;
-      pkgSrcRecords::Parser *Last = FindSrc(*I,Recs,SrcRecs,Src,Cache);
+      pkgSrcRecords::Parser *Last = 0;
+      vector<pkgSrcRecords::Parser::BuildDepRec> BuildDeps;
+
+      // support local .dsc files
+      if (FileExists(*I) && flExtension(*I) == "dsc")
+      {
+         // FIXME: add a layer of abstraction
+         Last = new debDscRecordParser(*I);
+         Src = *I;
+      } else {
+         Last = FindSrc(*I,Recs,SrcRecs,Src,Cache);
+      }
       if (Last == 0)
       if (Last == 0)
 	 return _error->Error(_("Unable to find a source package for %s"),Src.c_str());
 	 return _error->Error(_("Unable to find a source package for %s"),Src.c_str());
             
             
       // Process the build-dependencies
       // Process the build-dependencies
-      vector<pkgSrcRecords::Parser::BuildDepRec> BuildDeps;
+
       // FIXME: Can't specify architecture to use for [wildcard] matching, so switch default arch temporary
       // FIXME: Can't specify architecture to use for [wildcard] matching, so switch default arch temporary
       if (hostArch.empty() == false)
       if (hostArch.empty() == false)
       {
       {
@@ -1071,7 +1085,7 @@ static bool DoBuildDep(CommandLine &CmdL)
       }
       }
       else if (Last->BuildDepends(BuildDeps, _config->FindB("APT::Get::Arch-Only", false), StripMultiArch) == false)
       else if (Last->BuildDepends(BuildDeps, _config->FindB("APT::Get::Arch-Only", false), StripMultiArch) == false)
 	    return _error->Error(_("Unable to get build-dependency information for %s"),Src.c_str());
 	    return _error->Error(_("Unable to get build-dependency information for %s"),Src.c_str());
-   
+
       // Also ensure that build-essential packages are present
       // Also ensure that build-essential packages are present
       Configuration::Item const *Opts = _config->Tree("APT::Build-Essential");
       Configuration::Item const *Opts = _config->Tree("APT::Build-Essential");
       if (Opts) 
       if (Opts) 

+ 85 - 0
test/integration/test-apt-get-build-dep

@@ -0,0 +1,85 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+buildsimplenativepackage 'debhelper' 'i386' '7' 'stable'
+buildsimplenativepackage 'build-essential' 'i386' '1' 'stable'
+
+setupaptarchive
+cat > 2vcard_0.5-3.dsc <<EOF
+Format: 1.0
+Source: 2vcard
+Binary: 2vcard
+Architecture: all
+Version: 0.5-3
+Maintainer: Martin Albisetti <argentina@gmail.com>
+Uploaders: Marcela Tiznado <mlt@debian.org>
+Standards-Version: 3.8.0
+Build-Depends: debhelper (>= 5.0.37)
+Checksums-Sha1: 
+ b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz
+ 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz
+Checksums-Sha256: 
+ efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz
+ 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz
+Files: 
+ f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz
+ 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz
+EOF
+
+testequal "Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  build-essential debhelper
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst build-essential (1 stable [i386])
+Inst debhelper (7 stable [i386])
+Conf build-essential (1 stable [i386])
+Conf debhelper (7 stable [i386])" aptget build-dep -s 2vcard_0.5-3.dsc
+
+cat > 2vcard_0.5-3.dsc <<EOF
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: 2vcard
+Binary: 2vcard
+Architecture: all
+Version: 0.5-3
+Maintainer: Martin Albisetti <argentina@gmail.com>
+Uploaders: Marcela Tiznado <mlt@debian.org>
+Standards-Version: 3.8.0
+Build-Depends: debhelper (>= 5.0.37)
+Checksums-Sha1: 
+ b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz
+ 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz
+Checksums-Sha256: 
+ efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz
+ 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz
+Files: 
+ f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz
+ 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+iEYEARECAAYFAkijKhsACgkQsrBfRdYmq7aA2gCfaOW9riTYVQMx5ajKQVAcctlC
+z2UAn1oXgTai6opwhVfkxrlmJ+iRxzuc
+=4eRd
+-----END PGP SIGNATURE-----
+EOF
+
+testequal "Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  build-essential debhelper
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst build-essential (1 stable [i386])
+Inst debhelper (7 stable [i386])
+Conf build-essential (1 stable [i386])
+Conf debhelper (7 stable [i386])" aptget build-dep --simulate 2vcard_0.5-3.dsc