* apt-pkg/aptconfiguration.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Fri, 28 May 2010 21:11:36 +0000 (23:11 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Fri, 28 May 2010 21:11:36 +0000 (23:11 +0200)
  - remove duplicate architectures in getArchitectures()

apt-pkg/aptconfiguration.cc
debian/changelog
test/libapt/getarchitectures_test.cc [new file with mode: 0644]
test/libapt/makefile

index 2acf8dd..0c050d9 100644 (file)
@@ -327,11 +327,24 @@ std::vector<std::string> const Configuration::getArchitectures(bool const &Cache
        if (likely(Cached == true) && archs.empty() == false)
                return archs;
 
-       string const arch = _config->Find("APT::Architecture");
        archs = _config->FindVector("APT::Architectures");
+       string const arch = _config->Find("APT::Architecture");
+       if (unlikely(arch.empty() == true))
+               return archs;
+
        if (archs.empty() == true ||
            std::find(archs.begin(), archs.end(), arch) == archs.end())
                archs.push_back(arch);
+
+       // erase duplicates and empty strings
+       for (std::vector<string>::reverse_iterator a = archs.rbegin();
+            a != archs.rend(); ++a) {
+               if (a->empty() == true || std::find(a + 1, archs.rend(), *a) != archs.rend())
+                       archs.erase(a.base()-1);
+               if (a == archs.rend())
+                       break;
+       }
+
        return archs;
 }
                                                                        /*}}}*/
index c1ee360..66c41ef 100644 (file)
@@ -10,6 +10,8 @@ apt (0.7.26~exp6) UNRELEASED; urgency=low
     - do the autoremove mark process also for required packages to handle
       these illegally depending on lower priority packages (Closes: #583517)
     - try harder to find the other pseudo versions for autoremove multiarch
+  * apt-pkg/aptconfiguration.cc:
+    - remove duplicate architectures in getArchitectures()
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 28 May 2010 19:03:30 +0200
 
diff --git a/test/libapt/getarchitectures_test.cc b/test/libapt/getarchitectures_test.cc
new file mode 100644 (file)
index 0000000..1500cae
--- /dev/null
@@ -0,0 +1,61 @@
+#include <apt-pkg/aptconfiguration.h>
+#include <apt-pkg/configuration.h>
+
+#include "assert.h"
+#include <string>
+#include <vector>
+
+#include <iostream>
+
+// simple helper to quickly output a vector of strings
+void dumpVector(std::vector<std::string> vec) {
+       for (std::vector<std::string>::const_iterator v = vec.begin();
+            v != vec.end(); v++)
+               std::cout << *v << std::endl;
+}
+
+int main(int argc,char *argv[])
+{
+       std::vector<std::string> vec;
+
+       _config->Set("APT::Architectures::1", "i386");
+       _config->Set("APT::Architectures::2", "amd64");
+       vec = APT::Configuration::getArchitectures(false);
+       equals(vec.size(), 2);
+       equals(vec[0], "i386");
+       equals(vec[1], "amd64");
+
+       _config->Set("APT::Architecture", "i386");
+       vec = APT::Configuration::getArchitectures(false);
+       equals(vec.size(), 2);
+       equals(vec[0], "i386");
+       equals(vec[1], "amd64");
+
+       _config->Set("APT::Architectures::2", "");
+       vec = APT::Configuration::getArchitectures(false);
+       equals(vec.size(), 1);
+       equals(vec[0], "i386");
+
+       _config->Set("APT::Architecture", "armel");
+       vec = APT::Configuration::getArchitectures(false);
+       equals(vec.size(), 2);
+       equals(vec[0], "i386");
+       equals(vec[1], "armel");
+
+       _config->Set("APT::Architectures::2", "amd64");
+       _config->Set("APT::Architectures::3", "i386");
+       _config->Set("APT::Architectures::4", "armel");
+       _config->Set("APT::Architectures::5", "i386");
+       _config->Set("APT::Architectures::6", "amd64");
+       _config->Set("APT::Architectures::7", "armel");
+       _config->Set("APT::Architectures::8", "armel");
+       _config->Set("APT::Architectures::9", "amd64");
+       _config->Set("APT::Architectures::10", "amd64");
+       vec = APT::Configuration::getArchitectures(false);
+       equals(vec.size(), 3);
+       equals(vec[0], "i386");
+       equals(vec[1], "amd64");
+       equals(vec[2], "armel");
+
+       return 0;
+}
index 98bdb33..ee3401b 100644 (file)
@@ -12,6 +12,11 @@ SLIBS = -lapt-pkg
 SOURCE = getlanguages_test.cc
 include $(PROGRAM_H)
 
+PROGRAM = getArchitectures${BASENAME}
+SLIBS = -lapt-pkg
+SOURCE = getarchitectures_test.cc
+include $(PROGRAM_H)
+
 # Program for testing ParseDepends
 PROGRAM = ParseDepends${BASENAME}
 SLIBS = -lapt-pkg