From 6f4cc51023476625d97ed657073b948e8390fa01 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 6 Apr 2011 16:57:01 +0200 Subject: cherry pick -r 504..505 http://bzr.debian.org/apt/python-apt/debian-experimental --- aptsources/sourceslist.py | 24 ++++++++++++++++++++++-- debian/changelog | 6 ++++++ tests/data/aptsources/sources.list | 5 ++++- tests/test_aptsources.py | 19 +++++++++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/aptsources/sourceslist.py b/aptsources/sourceslist.py index 76bea43a..3cfe1791 100644 --- a/aptsources/sourceslist.py +++ b/aptsources/sourceslist.py @@ -81,6 +81,7 @@ class SourceEntry(object): self.invalid = False # is the source entry valid self.disabled = False # is it disabled ('#' in front) self.type = "" # what type (deb, deb-src) + self.architectures = [] # architectures self.uri = "" # base-uri self.dist = "" # distribution (dapper, edgy, etc) self.comps = [] # list of available componetns @@ -113,7 +114,7 @@ class SourceEntry(object): p_found = False space_found = False for i in range(len(line)): - if line[i] == "[": + if line[i] == "[" and not space_found: p_found=True tmp += line[i] elif line[i] == "]": @@ -169,6 +170,20 @@ class SourceEntry(object): if self.type not in ("deb", "deb-src", "rpm", "rpm-src"): self.invalid = True return + + if pieces[1].strip()[0] == "[": + options = pieces.pop(1).strip("[]").split(";") + for option in options: + try: + key, value = option.split("=", 1) + except Exception: + self.invalid = True + else: + if key == "arch": + self.architectures = value.split(",") + else: + self.invalid = True + # URI self.uri = pieces[1].strip() if len(self.uri) < 1: @@ -204,7 +219,12 @@ class SourceEntry(object): line = "" if self.disabled: line = "# " - line += "%s %s %s" % (self.type, self.uri, self.dist) + + line += self.type + + if self.architectures: + line += " [arch=%s]" % ",".join(self.architectures) + line += " %s %s" % (self.uri, self.dist) if len(self.comps) > 0: line += " " + " ".join(self.comps) if self.comment != "": diff --git a/debian/changelog b/debian/changelog index 9f2cefaa..060299e5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +python-apt (0.8.0~exp2) UNRELEASED; urgency=low + + * aptsources: Parse multi-arch sources.list files correctly + + -- Julian Andres Klode Wed, 06 Apr 2011 09:46:52 +0200 + python-apt (0.7.100.3) unstable; urgency=low [ Barry Warsaw ] diff --git a/tests/data/aptsources/sources.list b/tests/data/aptsources/sources.list index 5481d4f0..376d6961 100644 --- a/tests/data/aptsources/sources.list +++ b/tests/data/aptsources/sources.list @@ -3,4 +3,7 @@ deb http://de.archive.ubuntu.com/ubuntu/ edgy main # comment 2 deb http://de.archive.ubuntu.com/ubuntu/ edgy restricted # comment 3 -deb http://de.archive.ubuntu.com/ubuntu/ edgy universe \ No newline at end of file +deb http://de.archive.ubuntu.com/ubuntu/ edgy universe + +# multi-arch +deb [arch=amd64,i386] http://de.archive.ubuntu.com/ubuntu/ natty main diff --git a/tests/test_aptsources.py b/tests/test_aptsources.py index 331df935..aeb2ce31 100644 --- a/tests/test_aptsources.py +++ b/tests/test_aptsources.py @@ -39,11 +39,11 @@ class TestAptSources(unittest.TestCase): apt_pkg.config.set("Dir::Etc::sourcelist", "data/aptsources/" "sources.list") sources = aptsources.sourceslist.SourcesList(True, self.templates) - self.assertEqual(len(sources.list), 6) + self.assertEqual(len(sources.list), 9) # test load sources.list = [] sources.load("data/aptsources/sources.list") - self.assertEqual(len(sources.list), 6) + self.assertEqual(len(sources.list), 9) def testSourcesListAdding(self): """aptsources: Test additions to sources.list""" @@ -108,6 +108,21 @@ class TestAptSources(unittest.TestCase): if not s.template: self.fail("source entry '%s' has no matcher" % s) + def testMultiArch(self): + """aptsources: Test multi-arch parsing""" + + apt_pkg.config.set("Dir::Etc::sourcelist", "data/aptsources/" + "sources.list") + sources = aptsources.sourceslist.SourcesList(True, self.templates) + + assert sources.list[8].invalid == False + assert sources.list[8].type == "deb" + assert sources.list[8].architectures == ["amd64", "i386"] + assert sources.list[8].uri == "http://de.archive.ubuntu.com/ubuntu/" + assert sources.list[8].dist == "natty" + assert sources.list[8].comps == ["main"] + assert sources.list[8].line.strip() == str(sources.list[8]) + def testDistribution(self): """aptsources: Test distribution detection.""" apt_pkg.config.set("Dir::Etc::sourcelist", "data/aptsources/" -- cgit v1.2.3 From b2a0eb7ca6d8db6c8e4ac1875fa41f9466c78384 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 6 Apr 2011 16:58:03 +0200 Subject: cherry pick -r 505..506 http://bzr.debian.org/apt/python-apt/debian-experimental --- aptsources/sourceslist.py | 17 +++++++++++++---- debian/changelog | 1 + tests/test_aptsources.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/aptsources/sourceslist.py b/aptsources/sourceslist.py index 3cfe1791..85db2de9 100644 --- a/aptsources/sourceslist.py +++ b/aptsources/sourceslist.py @@ -275,12 +275,14 @@ class SourcesList(object): yield entry raise StopIteration - def add(self, type, uri, dist, orig_comps, comment="", pos=-1, file=None): + def add(self, type, uri, dist, orig_comps, comment="", pos=-1, file=None, architectures=[]): """ Add a new source to the sources.list. The method will search for existing matching repos and will try to reuse them as far as possible """ + + architectures = set(architectures) # create a working copy of the component list so that # we can modify it later comps = orig_comps[:] @@ -288,7 +290,8 @@ class SourcesList(object): for source in self.list: if not source.disabled and not source.invalid and \ source.type == type and uri == source.uri and \ - source.dist == dist: + source.dist == dist and \ + set(source.architectures) == architectures: for new_comp in comps: if new_comp in source.comps: # we have this component already, delete it @@ -301,19 +304,25 @@ class SourcesList(object): # components if not source.disabled and not source.invalid and \ source.type == type and uri == source.uri and \ - source.dist == dist: + source.dist == dist and \ + set(source.architectures) == architectures: comps = uniq(source.comps + comps) source.comps = comps return source # if there is a corresponding repo which is disabled, enable it elif source.disabled and not source.invalid and \ source.type == type and uri == source.uri and \ + set(source.architectures) == architectures and \ source.dist == dist and \ len(set(source.comps) & set(comps)) == len(comps): source.disabled = False return source # there isn't any matching source, so create a new line and parse it - line = "%s %s %s" % (type, uri, dist) + + line = type + if architectures: + line += " [arch=%s]" % ",".join(architectures) + line += " %s %s" % (uri, dist) for c in comps: line = line + " " + c if comment != "": diff --git a/debian/changelog b/debian/changelog index 060299e5..cd9c8251 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ python-apt (0.8.0~exp2) UNRELEASED; urgency=low * aptsources: Parse multi-arch sources.list files correctly + * aptsources: Allow insertion of new multi-arch entries -- Julian Andres Klode Wed, 06 Apr 2011 09:46:52 +0200 diff --git a/tests/test_aptsources.py b/tests/test_aptsources.py index aeb2ce31..1597674e 100644 --- a/tests/test_aptsources.py +++ b/tests/test_aptsources.py @@ -62,6 +62,14 @@ class TestAptSources(unittest.TestCase): "edgy", ["restricted"]) self.assertTrue(sources.list == before.list) + + before = copy.deepcopy(sources) + sources.add("deb", "http://de.archive.ubuntu.com/ubuntu/", + "natty", + ["main"], architectures=["amd64", "i386"]) + self.assertTrue(sources.list == before.list) + + # test to add something new: multiverse sources.add("deb", "http://de.archive.ubuntu.com/ubuntu/", "edgy", @@ -74,6 +82,34 @@ class TestAptSources(unittest.TestCase): "multiverse" in entry.comps): found = True self.assertTrue(found) + + # add a new natty entry without architecture specification + sources.add("deb", "http://de.archive.ubuntu.com/ubuntu/", + "natty", + ["multiverse"]) + found = False + for entry in sources: + if (entry.type == "deb" and + entry.uri == "http://de.archive.ubuntu.com/ubuntu/" and + entry.dist == "natty" and + entry.architectures == [] and + "multiverse" in entry.comps): + found = True + self.assertTrue(found) + + # Add universe to existing multi-arch line + sources.add("deb", "http://de.archive.ubuntu.com/ubuntu/", + "natty", + ["universe"], architectures=["i386", "amd64"]) + found = False + for entry in sources: + if (entry.type == "deb" and + entry.uri == "http://de.archive.ubuntu.com/ubuntu/" and + entry.dist == "natty" and + set(entry.architectures) == set(["amd64", "i386"]) and + set(entry.comps) == set(["main", "universe"])): + found = True + self.assertTrue(found) # test to add something new: multiverse *and* # something that is already there before = copy.deepcopy(sources) -- cgit v1.2.3