* apt-pkg/cdrom.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 2 Sep 2012 19:32:40 +0000 (21:32 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 2 Sep 2012 19:32:40 +0000 (21:32 +0200)
  - handle Components in the reduction for the source.list as multi-arch cds
    otherwise create duplicated source entries (e.g. "wheezy main main")

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

index 699f66f..8e746ee 100644 (file)
@@ -363,6 +363,7 @@ void pkgCdrom::ReduceSourcelist(string CD,vector<string> &List)
 
       string Word1 = string(*I,Space,SSpace-Space);
       string Prefix = string(*I,0,Space);
+      string Component = string(*I,SSpace);
       for (vector<string>::iterator J = List.begin(); J != I; ++J)
       {
         // Find a space..
@@ -377,9 +378,11 @@ void pkgCdrom::ReduceSourcelist(string CD,vector<string> &List)
            continue;
         if (string(*J,Space2,SSpace2-Space2) != Word1)
            continue;
-        
-        *J += string(*I,SSpace);
-        *I = string();
+
+        string Component2 = string(*J, SSpace2) + " ";
+        if (Component2.find(Component + " ") == std::string::npos)
+           *J += Component;
+        I->clear();
       }
    }   
 
index 4533d27..703764d 100644 (file)
@@ -18,6 +18,9 @@ apt (0.9.7.5) UNRELEASED; urgency=low
   * apt-pkg/indexcopy.cc:
     - do not create duplicated flat-archive cdrom sources for foreign
       architectures on multi-arch cdroms
+  * apt-pkg/cdrom.cc:
+    - handle Components in the reduction for the source.list as multi-arch cds
+      otherwise create duplicated source entries (e.g. "wheezy main main")
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Sun, 26 Aug 2012 10:49:17 +0200
 
diff --git a/test/libapt/cdromreducesourcelist_test.cc b/test/libapt/cdromreducesourcelist_test.cc
new file mode 100644 (file)
index 0000000..729da23
--- /dev/null
@@ -0,0 +1,86 @@
+#include <apt-pkg/cdrom.h>
+#include <apt-pkg/error.h>
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "assert.h"
+
+class Cdrom : public pkgCdrom {
+public:
+   std::vector<std::string> ReduceSourcelist(std::string CD,std::vector<std::string> List) {
+      pkgCdrom::ReduceSourcelist(CD, List);
+      return List;
+   }
+};
+
+int main(int argc, char const *argv[]) {
+   Cdrom cd;
+   std::vector<std::string> List;
+   std::string CD("/media/cdrom/");
+
+   std::vector<std::string> R = cd.ReduceSourcelist(CD, List);
+   equals(R.empty(), true);
+
+   List.push_back(" wheezy main");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 1);
+   equals(R[0], " wheezy main");
+
+   List.push_back(" wheezy main");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 1);
+   equals(R[0], " wheezy main");
+
+   List.push_back(" wheezy contrib");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 1);
+   equals(R[0], " wheezy contrib main");
+
+   List.push_back(" wheezy-update contrib");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 2);
+   equals(R[0], " wheezy contrib main");
+   equals(R[1], " wheezy-update contrib");
+
+   List.push_back(" wheezy-update contrib");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 2);
+   equals(R[0], " wheezy contrib main");
+   equals(R[1], " wheezy-update contrib");
+
+   List.push_back(" wheezy-update non-free");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 2);
+   equals(R[0], " wheezy contrib main");
+   equals(R[1], " wheezy-update contrib non-free");
+
+   List.push_back(" wheezy-update main");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 2);
+   equals(R[0], " wheezy contrib main");
+   equals(R[1], " wheezy-update contrib main non-free");
+
+   List.push_back(" wheezy non-free");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 2);
+   equals(R[0], " wheezy contrib main non-free");
+   equals(R[1], " wheezy-update contrib main non-free");
+
+   List.push_back(" sid main");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 3);
+   equals(R[0], " sid main");
+   equals(R[1], " wheezy contrib main non-free");
+   equals(R[2], " wheezy-update contrib main non-free");
+
+   List.push_back(" sid main-reduce");
+   R = cd.ReduceSourcelist(CD, List);
+   equals(R.size(), 3);
+   equals(R[0], " sid main main-reduce");
+   equals(R[1], " wheezy contrib main non-free");
+   equals(R[2], " wheezy-update contrib main non-free");
+
+   return 0;
+}
index d4d7f17..5e225f2 100644 (file)
@@ -87,6 +87,12 @@ SLIBS = -lapt-pkg
 SOURCE = cdromfindpackages_test.cc
 include $(PROGRAM_H)
 
+# test cdroms index reduction for source.list
+PROGRAM = CdromReduceSourceList${BASENAME}
+SLIBS = -lapt-pkg
+SOURCE = cdromreducesourcelist_test.cc
+include $(PROGRAM_H)
+
 # text IndexCopy::ConvertToSourceList
 PROGRAM = IndexCopyToSourceList${BASENAME}
 SLIBS = -lapt-pkg