summaryrefslogtreecommitdiff
path: root/morphlib
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib')
-rw-r--r--morphlib/buildcommand.py13
-rw-r--r--morphlib/git.py9
-rw-r--r--morphlib/remoterepocache.py105
-rw-r--r--morphlib/remoterepocache_tests.py137
-rw-r--r--morphlib/repocache.py (renamed from morphlib/localrepocache.py)168
-rw-r--r--morphlib/repocache_tests.py (renamed from morphlib/localrepocache_tests.py)0
-rw-r--r--morphlib/util.py54
7 files changed, 168 insertions, 318 deletions
diff --git a/morphlib/buildcommand.py b/morphlib/buildcommand.py
index a2ad3301..0bd6c6cb 100644
--- a/morphlib/buildcommand.py
+++ b/morphlib/buildcommand.py
@@ -47,7 +47,7 @@ class BuildCommand(object):
def __init__(self, app, build_env = None):
self.app = app
self.lac, self.rac = self.new_artifact_caches()
- self.lrc, self.rrc = self.new_repo_caches()
+ self.repo_cache = morphlib.util.repo_cache(self.app)
def build(self, repo_name, ref, filename, original_ref=None):
'''Build a given system morphology.'''
@@ -76,9 +76,6 @@ class BuildCommand(object):
'''
return morphlib.util.new_artifact_caches(self.app.settings)
- def new_repo_caches(self):
- return morphlib.util.new_repo_caches(self.app)
-
def new_build_env(self, arch):
'''Create a new BuildEnvironment instance.'''
return morphlib.buildenvironment.BuildEnvironment(self.app.settings,
@@ -95,7 +92,7 @@ class BuildCommand(object):
'''
self.app.status(msg='Creating source pool', chatty=True)
srcpool = morphlib.sourceresolver.create_source_pool(
- self.lrc, self.rrc, repo_name, ref, filenames,
+ self.repo_cache, repo_name, ref, filenames,
cachedir=self.app.settings['cachedir'],
original_ref=original_ref,
update_repos=not self.app.settings['no-git-update'],
@@ -394,8 +391,8 @@ class BuildCommand(object):
'''Update the local git repository cache with the sources.'''
repo_name = source.repo_name
- source.repo = self.lrc.get_updated_repo(repo_name, ref=source.sha1)
- self.lrc.ensure_submodules(source.repo, source.sha1)
+ source.repo = self.repo_cache.get_updated_repo(repo_name, ref=source.sha1)
+ self.repo_cache.ensure_submodules(source.repo, source.sha1)
def cache_artifacts_locally(self, artifacts):
'''Get artifacts missing from local cache from remote cache.'''
@@ -540,7 +537,7 @@ class BuildCommand(object):
'%(sha1)s',
name=source.name, sha1=source.sha1[:7])
builder = morphlib.builder.Builder(
- self.app, staging_area, self.lac, self.rac, self.lrc,
+ self.app, staging_area, self.lac, self.rac, self.repo_cache,
self.app.settings['max-jobs'], setup_mounts)
return builder.build_and_cache(source)
diff --git a/morphlib/git.py b/morphlib/git.py
index 190544ac..cab551ef 100644
--- a/morphlib/git.py
+++ b/morphlib/git.py
@@ -58,12 +58,13 @@ class MissingSubmoduleCommitError(cliapp.AppException):
class Submodules(object):
- def __init__(self, app, repo, ref):
- self.app = app
+ def __init__(self, repo, ref, runcmd_cb=cliapp.runcmd):
self.repo = repo
self.ref = ref
self.submodules = []
+ self.runcmd_cb = runcmd_cb
+
def load(self):
content = self._read_gitmodules_file()
@@ -76,7 +77,7 @@ class Submodules(object):
def _read_gitmodules_file(self):
try:
# try to read the .gitmodules file from the repo/ref
- content = gitcmd(self.app.runcmd, 'cat-file', 'blob',
+ content = gitcmd(self.runcmd_cb, 'cat-file', 'blob',
'%s:.gitmodules' % self.ref, cwd=self.repo,
ignore_fail=True)
@@ -100,7 +101,7 @@ class Submodules(object):
try:
# list objects in the parent repo tree to find the commit
# object that corresponds to the submodule
- commit = gitcmd(self.app.runcmd, 'ls-tree', self.ref,
+ commit = gitcmd(self.runcmd_cb, 'ls-tree', self.ref,
submodule.path, cwd=self.repo)
# read the commit hash from the output
diff --git a/morphlib/remoterepocache.py b/morphlib/remoterepocache.py
deleted file mode 100644
index 4a6d9fe9..00000000
--- a/morphlib/remoterepocache.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright (C) 2012-2015 Codethink Limited
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-import cliapp
-import json
-import logging
-import urllib2
-import urlparse
-import urllib
-
-
-class ResolveRefError(cliapp.AppException):
-
- def __init__(self, repo_name, ref):
- cliapp.AppException.__init__(
- self, 'Failed to resolve ref %s for repo %s' %
- (ref, repo_name))
-
-
-class CatFileError(cliapp.AppException):
-
- def __init__(self, repo_name, ref, filename):
- cliapp.AppException.__init__(
- self, 'Failed to cat file %s in ref %s of repo %s' %
- (filename, ref, repo_name))
-
-class LsTreeError(cliapp.AppException):
-
- def __init__(self, repo_name, ref):
- cliapp.AppException.__init__(
- self, 'Failed to list tree in ref %s of repo %s' %
- (ref, repo_name))
-
-
-class RemoteRepoCache(object):
-
- def __init__(self, server_url, resolver):
- self.server_url = server_url
- self._resolver = resolver
-
- def resolve_ref(self, repo_name, ref):
- repo_url = self._resolver.pull_url(repo_name)
- try:
- return self._resolve_ref_for_repo_url(repo_url, ref)
- except BaseException as e:
- logging.error('Caught exception: %s' % str(e))
- raise ResolveRefError(repo_name, ref)
-
- def cat_file(self, repo_name, ref, filename):
- repo_url = self._resolver.pull_url(repo_name)
- try:
- return self._cat_file_for_repo_url(repo_url, ref, filename)
- except urllib2.HTTPError as e:
- logging.error('Caught exception: %s' % str(e))
- if e.code == 404:
- raise CatFileError(repo_name, ref, filename)
- raise # pragma: no cover
-
- def ls_tree(self, repo_name, ref):
- repo_url = self._resolver.pull_url(repo_name)
- try:
- info = json.loads(self._ls_tree_for_repo_url(repo_url, ref))
- return info['tree'].keys()
- except BaseException as e:
- logging.error('Caught exception: %s' % str(e))
- raise LsTreeError(repo_name, ref)
-
- def _resolve_ref_for_repo_url(self, repo_url, ref): # pragma: no cover
- data = self._make_request(
- 'sha1s?repo=%s&ref=%s' % self._quote_strings(repo_url, ref))
- info = json.loads(data)
- return info['sha1'], info['tree']
-
- def _cat_file_for_repo_url(self, repo_url, ref,
- filename): # pragma: no cover
- return self._make_request(
- 'files?repo=%s&ref=%s&filename=%s'
- % self._quote_strings(repo_url, ref, filename))
-
- def _ls_tree_for_repo_url(self, repo_url, ref): # pragma: no cover
- return self._make_request(
- 'trees?repo=%s&ref=%s' % self._quote_strings(repo_url, ref))
-
- def _quote_strings(self, *args): # pragma: no cover
- return tuple(urllib.quote(string) for string in args)
-
- def _make_request(self, path): # pragma: no cover
- server_url = self.server_url
- if not server_url.endswith('/'):
- server_url += '/'
- url = urlparse.urljoin(server_url, '/1.0/%s' % path)
- handle = urllib2.urlopen(url)
- return handle.read()
diff --git a/morphlib/remoterepocache_tests.py b/morphlib/remoterepocache_tests.py
deleted file mode 100644
index 966e74d5..00000000
--- a/morphlib/remoterepocache_tests.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# Copyright (C) 2012-2015 Codethink Limited
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-import json
-import unittest
-import urllib2
-
-import morphlib
-
-
-class RemoteRepoCacheTests(unittest.TestCase):
-
- def _resolve_ref_for_repo_url(self, repo_url, ref):
- return self.sha1s[repo_url][ref]
-
- def _cat_file_for_repo_url(self, repo_url, sha1, filename):
- try:
- return self.files[repo_url][sha1][filename]
- except KeyError:
- raise urllib2.HTTPError(url='', code=404, msg='Not found',
- hdrs={}, fp=None)
-
- def _ls_tree_for_repo_url(self, repo_url, sha1):
- return json.dumps({
- 'repo': repo_url,
- 'ref': sha1,
- 'tree': self.files[repo_url][sha1]
- })
-
- def setUp(self):
- self.sha1s = {
- 'git://gitorious.org/baserock/morph': {
- 'master': 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9'
- }
- }
- self.files = {
- 'git://gitorious.org/baserock-morphs/linux': {
- 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9': {
- 'linux.morph': 'linux morphology'
- }
- }
- }
- self.server_url = 'http://foo.bar'
- aliases = [
- 'upstream=git://gitorious.org/baserock-morphs/#foo',
- 'baserock=git://gitorious.org/baserock/#foo'
- ]
- resolver = morphlib.repoaliasresolver.RepoAliasResolver(aliases)
- self.cache = morphlib.remoterepocache.RemoteRepoCache(
- self.server_url, resolver)
- self.cache._resolve_ref_for_repo_url = self._resolve_ref_for_repo_url
- self.cache._cat_file_for_repo_url = self._cat_file_for_repo_url
- self.cache._ls_tree_for_repo_url = self._ls_tree_for_repo_url
-
- def test_sets_server_url(self):
- self.assertEqual(self.cache.server_url, self.server_url)
-
- def test_resolve_existing_ref_for_existing_repo(self):
- sha1 = self.cache.resolve_ref('baserock:morph', 'master')
- self.assertEqual(
- sha1,
- self.sha1s['git://gitorious.org/baserock/morph']['master'])
-
- def test_fail_resolving_existing_ref_for_non_existent_repo(self):
- self.assertRaises(morphlib.remoterepocache.ResolveRefError,
- self.cache.resolve_ref, 'non-existent-repo',
- 'master')
-
- def test_fail_resolving_non_existent_ref_for_existing_repo(self):
- self.assertRaises(morphlib.remoterepocache.ResolveRefError,
- self.cache.resolve_ref, 'baserock:morph',
- 'non-existent-ref')
-
- def test_fail_resolving_non_existent_ref_for_non_existent_repo(self):
- self.assertRaises(morphlib.remoterepocache.ResolveRefError,
- self.cache.resolve_ref, 'non-existent-repo',
- 'non-existent-ref')
-
- def test_cat_existing_file_in_existing_repo_and_ref(self):
- content = self.cache.cat_file(
- 'upstream:linux', 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9',
- 'linux.morph')
- self.assertEqual(content, 'linux morphology')
-
- def test_fail_cat_file_using_invalid_sha1(self):
- self.assertRaises(morphlib.remoterepocache.CatFileError,
- self.cache.cat_file, 'upstream:linux', 'blablabla',
- 'linux.morph')
-
- def test_fail_cat_non_existent_file_in_existing_repo_and_ref(self):
- self.assertRaises(morphlib.remoterepocache.CatFileError,
- self.cache.cat_file, 'upstream:linux',
- 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9',
- 'non-existent-file')
-
- def test_fail_cat_file_in_non_existent_ref_in_existing_repo(self):
- self.assertRaises(morphlib.remoterepocache.CatFileError,
- self.cache.cat_file, 'upstream:linux',
- 'ecd7a325095a0d19b8c3d76f578d85b979461d41',
- 'linux.morph')
-
- def test_fail_cat_file_in_non_existent_repo(self):
- self.assertRaises(morphlib.remoterepocache.CatFileError,
- self.cache.cat_file, 'non-existent-repo',
- 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9',
- 'some-file')
-
- def test_ls_tree_in_existing_repo_and_ref(self):
- content = self.cache.ls_tree(
- 'upstream:linux', 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9')
- self.assertEqual(content, ['linux.morph'])
-
- def test_fail_ls_tree_using_invalid_sha1(self):
- self.assertRaises(morphlib.remoterepocache.LsTreeError,
- self.cache.ls_tree, 'upstream:linux', 'blablabla')
-
- def test_fail_ls_file_in_non_existent_ref_in_existing_repo(self):
- self.assertRaises(morphlib.remoterepocache.LsTreeError,
- self.cache.ls_tree, 'upstream:linux',
- 'ecd7a325095a0d19b8c3d76f578d85b979461d41')
-
- def test_fail_ls_tree_in_non_existent_repo(self):
- self.assertRaises(morphlib.remoterepocache.LsTreeError,
- self.cache.ls_tree, 'non-existent-repo',
- 'e28a23812eadf2fce6583b8819b9c5dbd36b9fb9')
diff --git a/morphlib/localrepocache.py b/morphlib/repocache.py
index 3a03fe1d..fc07011f 100644
--- a/morphlib/localrepocache.py
+++ b/morphlib/repocache.py
@@ -13,14 +13,18 @@
# with this program. If not, see <http://www.gnu.org/licenses/>.
+import cliapp
+import fs.osfs
+
+import json
+import logging
import os
-import urlparse
import string
import sys
import tempfile
-
-import cliapp
-import fs.osfs
+import urllib2
+import urlparse
+import urllib
import morphlib
from morphlib.util import word_join_list as _word_join_list
@@ -98,9 +102,8 @@ class CachedRepo(morphlib.gitdir.GitDirectory):
return self.url
-class LocalRepoCache(object):
-
- '''Manage locally cached git repositories.
+class RepoCache(object):
+ '''Manage a collection of Git repositories.
When we build stuff, we need a local copy of the git repository.
To avoid having to clone the repositories for every build, we
@@ -118,10 +121,21 @@ class LocalRepoCache(object):
git server, we first try to download a tarball from a url, and
if that works, we unpack the tarball.
+ Certain questions about a repo can be resolved without cloning the whole
+ thing, if an instance of 'morph-cache-server' is available on the remote
+ Git server. This makes calculating the build graph for the first time
+ a whole lot faster, as we avoid cloning every repo locally. The
+ git_resolve_cache_url parameter enables this feature. Baserock 'Trove'
+ systems run 'morph-cache-server' by default.
+
'''
+ def __init__(self, cachedir, resolver, tarball_base_url=None,
+ git_resolve_cache_url=None,
+ update_gits=True,
+ runcmd_cb=cliapp.runcmd, status_cb=lambda **kwargs: None,
+ verbose=False, debug=False):
+ morphlib.utils.ensure_directory_exists(cachedir)
- def __init__(self, app, cachedir, resolver, tarball_base_url=None):
- self._app = app
self.fs = fs.osfs.OSFS('/')
self._cachedir = cachedir
self._resolver = resolver
@@ -129,6 +143,15 @@ class LocalRepoCache(object):
tarball_base_url += '/' # pragma: no cover
self._tarball_base_url = tarball_base_url
self._cached_repo_objects = {}
+ self.git_resolve_cache_url = git_resolve_cache_url
+
+ # Corresponds to the app 'no-git-update' setting
+ self.update_gits = update_gits
+
+ self.runcmd_cb = runcmd_cb
+ self.status_cb = status_cb
+ self.verbose = verbose
+ self.debug = debug
def _git(self, args, **kwargs): # pragma: no cover
'''Execute git command.
@@ -138,7 +161,7 @@ class LocalRepoCache(object):
'''
- morphlib.git.gitcmd(self._app.runcmd, *args, **kwargs)
+ morphlib.git.gitcmd(self.runcmd_cb, *args, **kwargs)
def _fetch(self, url, path): # pragma: no cover
'''Fetch contents of url into a file.
@@ -146,10 +169,10 @@ class LocalRepoCache(object):
This method is meant to be overridden by unit tests.
'''
- self._app.status(msg="Trying to fetch %(tarball)s to seed the cache",
- tarball=url, chatty=True)
+ self.status_cb(msg="Trying to fetch %(tarball)s to seed the cache",
+ tarball=url, chatty=True)
- if self._app.settings['verbose']:
+ if self.verbose:
verbosity_flags = []
kwargs = dict(stderr=sys.stderr)
else:
@@ -159,9 +182,9 @@ class LocalRepoCache(object):
def wget_command():
return ['wget'] + verbosity_flags + ['-O-', url]
- self._app.runcmd(wget_command(),
- ['tar', '--no-same-owner', '-xf', '-'],
- cwd=path, **kwargs)
+ self.runcmd_cb(wget_command(),
+ ['tar', '--no-same-owner', '-xf', '-'],
+ cwd=path, **kwargs)
def _mkdtemp(self, dirname): # pragma: no cover
'''Creates a temporary directory.
@@ -236,14 +259,13 @@ class LocalRepoCache(object):
return repo
else:
errors.append(error)
- self._app.status(
- msg='Using git clone.')
+ self.status_cb(msg='Using git clone.')
target = self._mkdtemp(self._cachedir)
try:
self._git(['clone', '--mirror', '-n', repourl, target],
- echo_stderr=self._app.settings['debug'])
+ echo_stderr=self.debug)
except cliapp.AppException as e:
errors.append('Unable to clone from %s to %s: %s' %
(repourl, target, e))
@@ -289,12 +311,12 @@ class LocalRepoCache(object):
'''
- if self._app.settings['no-git-update']:
- self._app.status(msg='Not updating existing git repository '
- '%(repo_name)s '
- 'because of no-git-update being set',
- chatty=True,
- repo_name=repo_name)
+ if not self.update_gits:
+ self.status_cb(msg='Not updating existing git repository '
+ '%(repo_name)s '
+ 'because of no-git-update being set',
+ chatty=True,
+ repo_name=repo_name)
return self._get_repo(repo_name)
if ref is not None and refs is None:
@@ -315,20 +337,18 @@ class LocalRepoCache(object):
missing_refs.add(required_ref)
if not missing_refs:
- self._app.status(
+ self.status_cb(
msg='Not updating git repository %(repo_name)s '
'because it already contains %(sha1s)s',
chatty=True, repo_name=repo_name,
sha1s=_word_join_list(tuple(required_refs)))
return repo
- self._app.status(msg='Updating %(repo_name)s',
- repo_name=repo_name)
+ self.status_cb(msg='Updating %(repo_name)s', repo_name=repo_name)
self._update_repo(repo)
return repo
else:
- self._app.status(msg='Cloning %(repo_name)s',
- repo_name=repo_name)
+ self.status_cb(msg='Cloning %(repo_name)s', repo_name=repo_name)
return self._cache_repo(repo_name)
def ensure_submodules(self, toplevel_repo,
@@ -337,7 +357,8 @@ class LocalRepoCache(object):
def submodules_for_repo(repo_path, ref):
try:
- submodules = morphlib.git.Submodules(self._app, repo_path, ref)
+ submodules = morphlib.git.Submodules(repo_path, ref,
+ runcmd_cb=self.runcmd_cb)
submodules.load()
return [(submod.url, submod.commit) for submod in submodules]
except morphlib.git.NoModulesFileError:
@@ -355,3 +376,88 @@ class LocalRepoCache(object):
for submod in submodules_for_repo(cached_repo.dirname, ref):
if submod not in done:
subs_to_process.append(submod)
+
+
+class ResolveRefError(cliapp.AppException):
+
+ def __init__(self, repo_name, ref):
+ cliapp.AppException.__init__(
+ self, 'Failed to resolve ref %s for repo %s' %
+ (ref, repo_name))
+
+
+class CatFileError(cliapp.AppException):
+
+ def __init__(self, repo_name, ref, filename):
+ cliapp.AppException.__init__(
+ self, 'Failed to cat file %s in ref %s of repo %s' %
+ (filename, ref, repo_name))
+
+
+class LsTreeError(cliapp.AppException):
+
+ def __init__(self, repo_name, ref):
+ cliapp.AppException.__init__(
+ self, 'Failed to list tree in ref %s of repo %s' %
+ (ref, repo_name))
+
+
+class RemoteRepoCache(object):
+
+ def __init__(self, server_url, resolver):
+ self.server_url = server_url
+ self._resolver = resolver
+
+ def resolve_ref(self, repo_name, ref):
+ repo_url = self._resolver.pull_url(repo_name)
+ try:
+ return self._resolve_ref_for_repo_url(repo_url, ref)
+ except BaseException as e:
+ logging.error('Caught exception: %s' % str(e))
+ raise ResolveRefError(repo_name, ref)
+
+ def cat_file(self, repo_name, ref, filename):
+ repo_url = self._resolver.pull_url(repo_name)
+ try:
+ return self._cat_file_for_repo_url(repo_url, ref, filename)
+ except urllib2.HTTPError as e:
+ logging.error('Caught exception: %s' % str(e))
+ if e.code == 404:
+ raise CatFileError(repo_name, ref, filename)
+ raise # pragma: no cover
+
+ def ls_tree(self, repo_name, ref):
+ repo_url = self._resolver.pull_url(repo_name)
+ try:
+ info = json.loads(self._ls_tree_for_repo_url(repo_url, ref))
+ return info['tree'].keys()
+ except BaseException as e:
+ logging.error('Caught exception: %s' % str(e))
+ raise LsTreeError(repo_name, ref)
+
+ def _resolve_ref_for_repo_url(self, repo_url, ref): # pragma: no cover
+ data = self._make_request(
+ 'sha1s?repo=%s&ref=%s' % self._quote_strings(repo_url, ref))
+ info = json.loads(data)
+ return info['sha1'], info['tree']
+
+ def _cat_file_for_repo_url(self, repo_url, ref,
+ filename): # pragma: no cover
+ return self._make_request(
+ 'files?repo=%s&ref=%s&filename=%s'
+ % self._quote_strings(repo_url, ref, filename))
+
+ def _ls_tree_for_repo_url(self, repo_url, ref): # pragma: no cover
+ return self._make_request(
+ 'trees?repo=%s&ref=%s' % self._quote_strings(repo_url, ref))
+
+ def _quote_strings(self, *args): # pragma: no cover
+ return tuple(urllib.quote(string) for string in args)
+
+ def _make_request(self, path): # pragma: no cover
+ server_url = self.server_url
+ if not server_url.endswith('/'):
+ server_url += '/'
+ url = urlparse.urljoin(server_url, '/1.0/%s' % path)
+ handle = urllib2.urlopen(url)
+ return handle.read()
diff --git a/morphlib/localrepocache_tests.py b/morphlib/repocache_tests.py
index 91fdb216..91fdb216 100644
--- a/morphlib/localrepocache_tests.py
+++ b/morphlib/repocache_tests.py
diff --git a/morphlib/util.py b/morphlib/util.py
index 3b3e4d2b..eaea0c66 100644
--- a/morphlib/util.py
+++ b/morphlib/util.py
@@ -102,21 +102,16 @@ def make_concurrency(cores=None):
return min(n, 20)
-def create_cachedir(settings): # pragma: no cover
- '''Return cache directory, creating it if necessary.'''
-
- cachedir = settings['cachedir']
+def ensure_directory_exists(path): # pragma: no cover
# Don't check the folder exists and handle the exception that happens in
# this case to avoid errors if the folder is created by something else
# just after the check.
try:
- os.mkdir(cachedir)
+ os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
- return cachedir
-
def get_artifact_cache_server(settings): # pragma: no cover
if settings['artifact-cache-server']:
@@ -141,17 +136,8 @@ def new_artifact_caches(settings): # pragma: no cover
'''
- cachedir = create_cachedir(settings)
- artifact_cachedir = os.path.join(cachedir, 'artifacts')
- # Don't check the folder exists and handle the exception that happens in
- # this case to avoid errors if the folder is created by something else
- # just after the check.
- try:
- os.mkdir(artifact_cachedir)
- except OSError as e:
- if e.errno != errno.EEXIST:
- raise
-
+ artifact_cachedir = os.path.join(settings['cachedir'], 'artifacts')
+ ensure_directory_exists(artifact_cachedir)
lac = morphlib.localartifactcache.LocalArtifactCache(
fs.osfs.OSFS(artifact_cachedir))
@@ -222,24 +208,26 @@ def combine_aliases(app): # pragma: no cover
return alias_map.values()
-def new_repo_caches(app): # pragma: no cover
- '''Create new objects for local, remote git repository caches.'''
- aliases = app.settings['repo-alias']
- cachedir = create_cachedir(app.settings)
- gits_dir = os.path.join(cachedir, 'gits')
- tarball_base_url = app.settings['tarball-server']
- repo_resolver = morphlib.repoaliasresolver.RepoAliasResolver(aliases)
- lrc = morphlib.localrepocache.LocalRepoCache(
- app, gits_dir, repo_resolver, tarball_base_url=tarball_base_url)
+def repo_cache(app): # pragma: no cover
+ '''Create a RepoCache instance using settings from app.settings.'''
- url = get_git_resolve_cache_server(app.settings)
- if url:
- rrc = morphlib.remoterepocache.RemoteRepoCache(url, repo_resolver)
- else:
- rrc = None
+ gits_dir = os.path.join(settings['cachedir'], 'gits')
+ tarball_base_url = app.settings['tarball-server']
+ git_resolve_cache_url = get_git_resolve_cache_server(app.settings)
+ aliases = app.settings['repo-alias']
+ repo_alias_resolver = morphlib.repoaliasresolver.RepoAliasResolver(aliases)
+
+ return morphlib.repocache.RepoCache(
+ gits_dir, repo_alias_resolver,
+ tarball_base_url=tarball_base_url,
+ git_resolve_cache_url=git_resolve_cache_url,
+ update_gits=(not app.settings['no-git-update']),
+ runcmd_cb=app.runcmd,
+ status_cb=app.status,
+ verbose=app.settings['verbose'],
+ debug=app.settings['debug'])
- return lrc, rrc
def env_variable_is_password(key): # pragma: no cover
return 'PASSWORD' in key