]> git.saurik.com Git - apt.git/commitdiff
Ignore :qualifiers after package name in build dependencies
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 28 Nov 2009 23:23:26 +0000 (00:23 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 28 Nov 2009 23:23:26 +0000 (00:23 +0100)
for now as long we don't understand them (Closes: #558103)

apt-pkg/deb/deblistparser.cc
apt-pkg/deb/deblistparser.h
apt-pkg/deb/debsrcrecords.cc
apt-pkg/deb/debsrcrecords.h
apt-pkg/srcrecords.cc
apt-pkg/srcrecords.h
debian/changelog
test/libapt/makefile
test/libapt/parsedepends_test.cc [new file with mode: 0644]

index 16e6ee332b1ea2dfe37ee47bc82c576e0319d6fd..25a1df3f97bae6abfd464bbc8d0eb16d6018af8a 100644 (file)
@@ -395,7 +395,8 @@ const char *debListParser::ConvertRelation(const char *I,unsigned int &Op)
    bit by bit. */
 const char *debListParser::ParseDepends(const char *Start,const char *Stop,
                                        string &Package,string &Ver,
-                                       unsigned int &Op, bool ParseArchFlags)
+                                       unsigned int &Op, bool const &ParseArchFlags,
+                                       bool const &StripMultiArch)
 {
    // Strip off leading space
    for (;Start != Stop && isspace(*Start) != 0; Start++);
@@ -414,7 +415,14 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop,
    
    // Stash the package name
    Package.assign(Start,I - Start);
-   
+
+   // We don't want to confuse library users which can't handle MultiArch
+   if (StripMultiArch == true) {
+      size_t const found = Package.rfind(':');
+      if (found != string::npos)
+        Package = Package.substr(0,found);
+   }
+
    // Skip white space to the '('
    for (;I != Stop && isspace(*I) != 0 ; I++);
    
index 34bb29c7276249162f5a7551f6bf119fa3d85c90..1c709229faa5b713d5a5d30f84a101a7ae86d4bb 100644 (file)
@@ -64,7 +64,8 @@ class debListParser : public pkgCacheGenerator::ListParser
    
    static const char *ParseDepends(const char *Start,const char *Stop,
                            string &Package,string &Ver,unsigned int &Op,
-                           bool ParseArchFlags = false);
+                           bool const &ParseArchFlags = false,
+                           bool const &StripMultiArch = false);
    static const char *ConvertRelation(const char *I,unsigned int &Op);
 
    debListParser(FileFd *File);
index bde10aa6dbb71ac8598e90cb24a37453d9fbf3bb..21336e1af0d6edd531fa39f78160ba28a56d7005 100644 (file)
@@ -54,7 +54,8 @@ const char **debSrcRecordParser::Binaries()
    package/version records representing the build dependency. The returned 
    array need not be freed and will be reused by the next call to this 
    function */
-bool debSrcRecordParser::BuildDepends(vector<pkgSrcRecords::Parser::BuildDepRec> &BuildDeps, bool ArchOnly)
+bool debSrcRecordParser::BuildDepends(vector<pkgSrcRecords::Parser::BuildDepRec> &BuildDeps,
+                                       bool const &ArchOnly, bool const &StripMultiArch)
 {
    unsigned int I;
    const char *Start, *Stop;
@@ -77,7 +78,7 @@ bool debSrcRecordParser::BuildDepends(vector<pkgSrcRecords::Parser::BuildDepRec>
       while (1)
       {
          Start = debListParser::ParseDepends(Start, Stop, 
-                    rec.Package,rec.Version,rec.Op,true);
+                    rec.Package,rec.Version,rec.Op,true, StripMultiArch);
         
          if (Start == 0) 
             return _error->Error("Problem parsing dependency: %s", fields[I]);
index a3b5a8286a7d6089ab85f552252436d665faae3b..c39d78bae66b202f1726eed515594db12f04b04e 100644 (file)
@@ -30,14 +30,14 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
 
    virtual bool Restart() {return Tags.Jump(Sect,0);};
    virtual bool Step() {iOffset = Tags.Offset(); return Tags.Step(Sect);};
-   virtual bool Jump(unsigned long Off) {iOffset = Off; return Tags.Jump(Sect,Off);};
+   virtual bool Jump(unsigned long const &Off) {iOffset = Off; return Tags.Jump(Sect,Off);};
 
    virtual string Package() const {return Sect.FindS("Package");};
    virtual string Version() const {return Sect.FindS("Version");};
    virtual string Maintainer() const {return Sect.FindS("Maintainer");};
    virtual string Section() const {return Sect.FindS("Section");};
    virtual const char **Binaries();
-   virtual bool BuildDepends(vector<BuildDepRec> &BuildDeps, bool ArchOnly);
+   virtual bool BuildDepends(vector<BuildDepRec> &BuildDeps, bool const &ArchOnly, bool const &StripMultiArch = true);
    virtual unsigned long Offset() {return iOffset;};
    virtual string AsStr() 
    {
@@ -47,7 +47,7 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
    };
    virtual bool Files(vector<pkgSrcRecords::File> &F);
 
-   debSrcRecordParser(string File,pkgIndexFile const *Index) 
+   debSrcRecordParser(string const &File,pkgIndexFile const *Index) 
       : Parser(Index), Fd(File,FileFd::ReadOnly), Tags(&Fd,102400), 
         Buffer(0), BufSize(0) {}
    ~debSrcRecordParser();
index 5e40ae6240ffdbd4b6418584b8f09064ac7e4932..46a02b55c3592abb483d0a4274918e4eff75c604 100644 (file)
@@ -77,7 +77,7 @@ 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 == Files.end())
       return 0;
@@ -116,7 +116,7 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
 // Parser::BuildDepType - Convert a build dep to a string              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-const char *pkgSrcRecords::Parser::BuildDepType(unsigned char Type)
+const char *pkgSrcRecords::Parser::BuildDepType(unsigned char const &Type)
 {
    const char *fields[] = {"Build-Depends", 
                            "Build-Depends-Indep",
index 99cbc6060221033f07ba6a1e94a944753759532f..a495338648f324de010f985d6c60f67eb965f84c 100644 (file)
@@ -59,7 +59,7 @@ class pkgSrcRecords
       
       virtual bool Restart() = 0;
       virtual bool Step() = 0;
-      virtual bool Jump(unsigned long Off) = 0;
+      virtual bool Jump(unsigned long const &Off) = 0;
       virtual unsigned long Offset() = 0;
       virtual string AsStr() = 0;
       
@@ -69,8 +69,8 @@ class pkgSrcRecords
       virtual string Section() const = 0;
       virtual const char **Binaries() = 0;   // Ownership does not transfer
 
-      virtual bool BuildDepends(vector<BuildDepRec> &BuildDeps, bool ArchOnly) = 0;
-      static const char *BuildDepType(unsigned char Type);
+      virtual bool BuildDepends(vector<BuildDepRec> &BuildDeps, bool const &ArchOnly, bool const &StripMultiArch = true) = 0;
+      static const char *BuildDepType(unsigned char const &Type);
 
       virtual bool Files(vector<pkgSrcRecords::File> &F) = 0;
       
@@ -90,7 +90,7 @@ class pkgSrcRecords
    bool Restart();
 
    // Locate a package by name
-   Parser *Find(const char *Package,bool SrcOnly = false);
+   Parser *Find(const char *Package,bool const &SrcOnly = false);
    
    pkgSrcRecords(pkgSourceList &List);
    ~pkgSrcRecords();
index 03411832ccc96fc11765fe1a8f85f4dfe126df85..056e5c1f7d57ec8a60a98c1cc42f0b8aee6e5c00 100644 (file)
@@ -19,9 +19,11 @@ apt (0.7.25) UNRELEASED; urgency=low
     Closes: #555797
 
   [ David Kalnischkies ]
-   * [BREAK] add possibility to download and use multiply
-     Translation files, configurable with Acquire::Translation
-     (Closes: #444222, #448216, #550564)
+  * [BREAK] add possibility to download and use multiply
+    Translation files, configurable with Acquire::Translation
+    (Closes: #444222, #448216, #550564)
+  * Ignore :qualifiers after package name in build dependencies
+    for now as long we don't understand them (Closes: #558103)
   * apt-pkg/packagemanager.cc:
     - better debug output for ImmediateAdd with depth and why
     - improve the message shown for failing immediate configuration
index f61a95f3d9cb5f36529d149ab9742085e3538064..5712c025a2f06fd994b9705bf3b41a4d8dc1ac7a 100644 (file)
@@ -11,3 +11,9 @@ PROGRAM = getLanguages${BASENAME}
 SLIBS = -lapt-pkg
 SOURCE = getlanguages_test.cc
 include $(PROGRAM_H)
+
+# Program for testing ParseDepends
+PROGRAM = ParseDepends${BASENAME}
+SLIBS = -lapt-pkg
+SOURCE = parsedepends_test.cc
+include $(PROGRAM_H)
diff --git a/test/libapt/parsedepends_test.cc b/test/libapt/parsedepends_test.cc
new file mode 100644 (file)
index 0000000..b7befa5
--- /dev/null
@@ -0,0 +1,128 @@
+#include <apt-pkg/deblistparser.h>
+#include <apt-pkg/configuration.h>
+
+#include "assert.h"
+
+int main(int argc,char *argv[]) {
+       string Package;
+       string Version;
+       unsigned int Op = 5;
+       unsigned int Null = 0;
+       bool StripMultiArch = true;
+       bool ParseArchFlags = false;
+       _config->Set("APT::Architecture","dsk");
+
+       const char* Depends =
+               "debhelper:any (>= 5.0), "
+               "libdb-dev:any, "
+               "gettext:native (<= 0.12), "
+               "libcurl4-gnutls-dev:native | libcurl3-gnutls-dev (>> 7.15.5), "
+               "debiandoc-sgml, "
+               "apt (>= 0.7.25), "
+               "not-for-me [ !dsk ], "
+               "only-for-me [ dsk ], "
+               "overlord-dev:any (= 7.15.3~) | overlord-dev:native (>> 7.15.5), "
+       ;
+
+       unsigned short runner = 0;
+test:
+//     std::clog << (StripMultiArch ? "NO-Multi" : "Multi") << " " << (ParseArchFlags ? "Flags" : "NO-Flags") << std::endl;
+
+       // Stripping MultiArch is currently the default setting to not confuse
+       // non-MultiArch capable users of the library with "strange" extensions.
+       const char* Start = Depends;
+       const char* End = Depends + strlen(Depends);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       if (StripMultiArch == true)
+               equals("debhelper", Package);
+       else
+               equals("debhelper:any", Package);
+       equals("5.0", Version);
+       equals(Null | pkgCache::Dep::GreaterEq, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       if (StripMultiArch == true)
+               equals("libdb-dev", Package);
+       else
+               equals("libdb-dev:any", Package);
+       equals("", Version);
+       equals(Null | pkgCache::Dep::NoOp, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       if (StripMultiArch == true)
+               equals("gettext", Package);
+       else
+               equals("gettext:native", Package);
+       equals("0.12", Version);
+       equals(Null | pkgCache::Dep::LessEq, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       if (StripMultiArch == true)
+               equals("libcurl4-gnutls-dev", Package);
+       else
+               equals("libcurl4-gnutls-dev:native", Package);
+       equals("", Version);
+       equals(Null | pkgCache::Dep::Or, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       equals("libcurl3-gnutls-dev", Package);
+       equals("7.15.5", Version);
+       equals(Null | pkgCache::Dep::Greater, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       equals("debiandoc-sgml", Package);
+       equals("", Version);
+       equals(Null | pkgCache::Dep::NoOp, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       equals("apt", Package);
+       equals("0.7.25", Version);
+       equals(Null | pkgCache::Dep::GreaterEq, Op);
+
+       if (ParseArchFlags == true) {
+               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+               equals("", Package); // not-for-me
+       } else {
+               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch));
+               Start = strstr(Start, ",");
+               Start++;
+       }
+
+       if (ParseArchFlags == true) {
+               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+               equals("only-for-me", Package);
+               equals("", Version);
+               equals(Null | pkgCache::Dep::NoOp, Op);
+       } else {
+               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch));
+               Start = strstr(Start, ",");
+               Start++;
+       }
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       if (StripMultiArch == true)
+               equals("overlord-dev", Package);
+       else
+               equals("overlord-dev:any", Package);
+       equals("7.15.3~", Version);
+       equals(Null | pkgCache::Dep::Equals | pkgCache::Dep::Or, Op);
+
+       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       if (StripMultiArch == true)
+               equals("overlord-dev", Package);
+       else
+               equals("overlord-dev:native", Package);
+       equals("7.15.5", Version);
+       equals(Null | pkgCache::Dep::Greater, Op);
+
+       if (StripMultiArch == false)
+               ParseArchFlags = true;
+       StripMultiArch = !StripMultiArch;
+
+       runner++;
+       if (runner < 4)
+               goto test; // this is the prove: tests are really evil ;)
+
+       return 0;
+}