summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt/cache.py18
-rw-r--r--debian/changelog3
-rw-r--r--tests/test_apt_cache.py38
3 files changed, 57 insertions, 2 deletions
diff --git a/apt/cache.py b/apt/cache.py
index f64b489a..585fca0a 100644
--- a/apt/cache.py
+++ b/apt/cache.py
@@ -327,12 +327,14 @@ class Cache(object):
@deprecated_args
def update(self, fetch_progress=None, pulse_interval=0,
- raise_on_error=True):
+ raise_on_error=True, sources_list=None):
"""Run the equivalent of apt-get update.
The first parameter *fetch_progress* may be set to an instance of
apt.progress.FetchProgress, the default is apt.progress.FetchProgress()
.
+ sources_list -- Update a alternative sources.list than the default.
+ Note that the sources.list.d directory is ignored in this case
"""
lockfile = apt_pkg.config.find_dir("Dir::State::Lists") + "lock"
lock = apt_pkg.get_lock(lockfile)
@@ -340,6 +342,15 @@ class Cache(object):
if lock < 0:
raise LockFailedException("Failed to lock %s" % lockfile)
+ if sources_list:
+ old_sources_list = apt_pkg.config.find("Dir::Etc::sourcelist")
+ old_sources_list_d = apt_pkg.config.find("Dir::Etc::sourceparts")
+ old_cleanup = apt_pkg.config.find("APT::List-Cleanup")
+ apt_pkg.config.set("Dir::Etc::sourcelist", os.path.abspath(sources_list))
+ apt_pkg.config.set("Dir::Etc::sourceparts", "xxx")
+ apt_pkg.config.set("APT::List-Cleanup", "0")
+ self._list.read_main_list()
+
try:
if fetch_progress is None:
fetch_progress = apt.progress.base.AcquireProgress()
@@ -354,6 +365,11 @@ class Cache(object):
return res
finally:
os.close(lock)
+ if sources_list:
+ apt_pkg.config.set("Dir::Etc::sourcelist", old_sources_list)
+ apt_pkg.config.set("Dir::Etc::sourceparts", old_sources_list_d)
+ apt_pkg.config.set("APT::List-Cleanup", old_cleanup)
+ self._list.read_main_list()
@deprecated_args
def install_archives(self, pm, install_progress):
diff --git a/debian/changelog b/debian/changelog
index d23bd54a..9e03434e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -26,6 +26,9 @@ python-apt (0.7.97) UNRELEASED; urgency=low
- fix error when reading binary content and add regresion test
* merged patch from Samuel Lidén Borell to fix crash if there utf8
in the control file (LP: #624290) and add test
+ * apt/cache.py:
+ - add "sources_list" parameter to cache.update() to force updating
+ a single sources.list entry only
-- Julian Andres Klode <jak@debian.org> Fri, 23 Jul 2010 16:14:39 +0200
diff --git a/tests/test_apt_cache.py b/tests/test_apt_cache.py
index 2ace0201..054ef8b2 100644
--- a/tests/test_apt_cache.py
+++ b/tests/test_apt_cache.py
@@ -16,7 +16,7 @@ sys.path.insert(0, "..")
import apt
import apt_pkg
-
+import shutil
class TestAptCache(unittest.TestCase):
""" test the apt cache """
@@ -84,7 +84,43 @@ class TestAptCache(unittest.TestCase):
self.assertTrue(cache.dpkg_journal_dirty)
# reset config value
apt_pkg.config.set("Dir::State::status", old_status)
+
+ def test_apt_update(self):
+ try:
+ os.makedirs("./data/tmp/var/lib/apt/lists/partial")
+ except OSError, e:
+ pass
+ apt_pkg.config.set("dir::state", "./data/tmp/var/lib/apt")
+
+ # test single sources.list fetching
+ sources_list = "./data/tmp/test.list"
+ f=open(sources_list,"w")
+ f.write("deb http://archive.ubuntu.com/ubuntu lucid restricted\n")
+ f.close()
+ self.assertTrue(os.path.exists(sources_list))
+ # write marker to ensure listcleaner is not run
+ open("./data/tmp/var/lib/apt/lists/marker","w")
+
+ # update a single sources.list
+ cache = apt.Cache()
+ cache.update(sources_list=sources_list)
+ # verify we just got a single source
+ files = filter(lambda f: not (f == "lock" or f == "partial"),
+ os.listdir("./data/tmp/var/lib/apt/lists"))
+ self.assertTrue("archive.ubuntu.com_ubuntu_dists_lucid_Release" in files)
+ # ensure the listcleaner was not run
+ self.assertTrue("marker" in files)
+ # ensure we don't get additional stuff from /etc/apt/sources.list
+ self.assertTrue(len(files) < 5)
+ # now run update again and verify that we got the normal sources.list
+ cache.update()
+ full_update = filter(lambda f: not (f == "lock" or f == "partial"),
+ os.listdir("./data/tmp/var/lib/apt/lists"))
+ self.assertTrue(len(files) < len(full_update))
+
+ # cleanup
+ shutil.rmtree("./data/tmp/")
if __name__ == "__main__":
unittest.main()