Parcourir la source

* apt-pkg/aptconfiguration.cc:
- remove duplicate architectures in getArchitectures()

David Kalnischkies il y a 16 ans
Parent
commit
3152f4aa4a
4 fichiers modifiés avec 82 ajouts et 1 suppressions
  1. 14 1
      apt-pkg/aptconfiguration.cc
  2. 2 0
      debian/changelog
  3. 61 0
      test/libapt/getarchitectures_test.cc
  4. 5 0
      test/libapt/makefile

+ 14 - 1
apt-pkg/aptconfiguration.cc

@@ -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;
 }
 									/*}}}*/

+ 2 - 0
debian/changelog

@@ -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
 

+ 61 - 0
test/libapt/getarchitectures_test.cc

@@ -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;
+}

+ 5 - 0
test/libapt/makefile

@@ -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