diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2015-06-01 14:20:09 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2015-06-05 12:54:45 +0000 |
commit | 4ed27e048453a018fbc17d53f56a36c121085cc3 (patch) | |
tree | bf7d839b86ee64c484052ddfafd7ca4186ff62e1 /morphlib | |
parent | d873baa12f36e07e3f6d3b7f808d7f2f10763605 (diff) | |
download | morph-4ed27e048453a018fbc17d53f56a36c121085cc3.tar.gz |
sourceresolver: Use context managers for cleanup and cache writeback
Change-Id: I895776bfd57ca6a14997c5535355b259d827b3a6
Diffstat (limited to 'morphlib')
-rw-r--r-- | morphlib/sourceresolver.py | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/morphlib/sourceresolver.py b/morphlib/sourceresolver.py index 150dc49b..36f8b752 100644 --- a/morphlib/sourceresolver.py +++ b/morphlib/sourceresolver.py @@ -14,6 +14,7 @@ import collections +import contextlib import cPickle import logging import os @@ -80,6 +81,16 @@ class PickleCacheManager(object): # pragma: no cover except (IOError, cPickle.PickleError) as e: logging.warning('Failed to save cache to %s: %s', self.filename, e) + @contextlib.contextmanager + def open(self): + cache = self.load_cache() + try: + yield cache + except BaseException as e: + raise + else: + self.save_cache(cache) + class SourceResolverError(cliapp.AppException): pass @@ -551,10 +562,6 @@ class SourceResolver(object): system_filenames, visit=lambda rn, rf, fn, arf, m: None, definitions_original_ref=None): # pragma: no cover - self._resolved_trees = self.tree_cache_manager.load_cache() - self._resolved_buildsystems = \ - self.buildsystem_cache_manager.load_cache() - # Resolve the (repo, ref) pair for the definitions repo, cache result. definitions_absref, definitions_tree = self._resolve_ref( definitions_repo, definitions_ref) @@ -562,10 +569,13 @@ class SourceResolver(object): if definitions_original_ref: definitions_ref = definitions_original_ref - self._definitions_checkout_dir = tempfile.mkdtemp() - - try: + with morphlib.util.temp_dir() as definitions_checkout_dir, \ + self.tree_cache_manager.open() as resolved_trees, \ + self.buildsystem_cache_manager.open() as resolved_buildsystems: # FIXME: not an ideal way of passing this info across + self._definitions_checkout_dir = definitions_checkout_dir + self._resolved_trees = resolved_trees + self._resolved_buildsystems = resolved_buildsystems self._definitions_repo = definitions_repo self._definitions_absref = definitions_absref try: @@ -587,16 +597,6 @@ class SourceResolver(object): for repo, ref, filename in chunk_queue: self.process_chunk(definitions_repo, definitions_absref, repo, ref, filename, visit) - finally: - shutil.rmtree(self._definitions_checkout_dir) - self._definitions_checkout_dir = None - - logging.debug('Saving contents of resolved tree cache') - self.tree_cache_manager.save_cache(self._resolved_trees) - - logging.debug('Saving contents of build systems cache') - self.buildsystem_cache_manager.save_cache( - self._resolved_buildsystems) def create_source_pool(lrc, rrc, repo, ref, filenames, cachedir, |