summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2011-04-06 10:22:53 +0200
committerJulian Andres Klode <jak@debian.org>2011-04-06 10:22:53 +0200
commit30a0dff267d9e99c25d5902e296fd115746e05c9 (patch)
treef2da2f051419c2038b3999734e1832a9b6c673dc
parent82bd14484ffa3fbe0b68777402cb31000bd7dd22 (diff)
downloadpython-apt-30a0dff267d9e99c25d5902e296fd115746e05c9.tar.gz
aptsources: Allow insertion of new multi-arch entries
-rw-r--r--aptsources/sourceslist.py17
-rw-r--r--debian/changelog1
-rw-r--r--tests/test_aptsources.py36
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 c942278d..7ceda2ce 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 <jak@debian.org> 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)