summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <daniel.silverstone@codethink.co.uk>2012-09-12 10:12:12 +0000
committerDaniel Silverstone <daniel.silverstone@codethink.co.uk>2012-09-12 14:04:37 +0100
commitda5a4968789e45d90f4b855874835d35c2614e58 (patch)
tree0fb71bb33b47dfe56c5b24e900e5410f617e9db6
parent1c89026bc70003b302167248c0d2ed229cd27223 (diff)
downloadmorph-da5a4968789e45d90f4b855874835d35c2614e58.tar.gz
Add support for Trove hosted content to morph configuration.
Trove has a fixed structure for repositories and prefixes. By taking advantage of this, we can simplify the repo-alias configuration in morph somewhat and thus make it easier for others to add their own aliases and prefixes later, without worrying that they'll miss out on default ones created by the Baserock team. We override process_args in the application class to achieve this because cliapp's setup() hook is not quite right for our purposes.
-rw-r--r--README8
-rwxr-xr-xmorphlib/app.py32
-rw-r--r--morphlib/util.py45
3 files changed, 75 insertions, 10 deletions
diff --git a/README b/README
index 4c0be19d..ecb9148c 100644
--- a/README
+++ b/README
@@ -40,11 +40,11 @@ something like this:
cachedir = /home/username/baserock/cache
log = /home/username/baserock/morph.log
log-max = 200M
- git-base-url = git://gitorious.org/baserock-morphs
- bundle-server = http://roadtrain.codethink.co.uk/bundles
+ trove-host = git.baserock.org
+ bundle-server = http://git.baserock.org/bundles
-All of the above settings apart from `log` are the defaults, so may be
-omitted.
+All of the above settings apart from `log` and `bundle-server` are the
+defaults, so may be omitted.
Morphology file syntax
diff --git a/morphlib/app.py b/morphlib/app.py
index 508e0975..7d7ddeb5 100755
--- a/morphlib/app.py
+++ b/morphlib/app.py
@@ -25,13 +25,9 @@ import morphlib
defaults = {
+ 'trove-host': 'git.baserock.org',
+ 'trove-prefix': [ ],
'repo-alias': [
- ('upstream='
- 'git://git.baserock.org/delta/#'
- 'ssh://gitano@git.baserock.org/delta/'),
- ('baserock='
- 'git://git.baserock.org/baserock/#'
- 'ssh://gitano@git.baserock.org/baserock/'),
('freedesktop='
'git://anongit.freedesktop.org/#'
'ssh://git.freedesktop.org/'),
@@ -59,6 +55,22 @@ class Morph(cliapp.Application):
'show what is happening in much detail')
self.settings.boolean(['quiet', 'q'],
'show no output unless there is an error')
+ self.settings.string(['trove-host'],
+ 'hostname of Trove instance',
+ metavar='HOST',
+ default=defaults['trove-host'])
+ self.settings.string_list(['trove-prefix'],
+ 'define URL prefix aliases stored '
+ 'directly on the Trove host. Uses '
+ 'the form '
+ 'alias=pathprefix#pullmethod#pushmethod '
+ 'for example, foocorp=fooprojects#git#ssh '
+ 'will be expanded into a repo-alias of '
+ 'foocorp=git://trove-host/fooprojects/%s#...'
+ ' with the push side set to the ssh url to '
+ 'the trove.',\
+ metavar='ALIAS=PREFIX#PULL#PUSH',
+ default=defaults['trove-prefix'])
self.settings.string_list(['repo-alias'],
'define URL prefix aliases to allow '
'repository addresses to be shortened; '
@@ -151,6 +163,14 @@ class Morph(cliapp.Application):
metavar='PREFIX',
default=defaults['build-ref-prefix'])
+ def process_args(self, args):
+ # Combine the aliases into repo-alias before passing on to normal
+ # command processing. This means everything from here on down can
+ # treat settings['repo-alias'] as the sole source of prefixes for git
+ # URL expansion.
+ self.settings['repo-alias'] = morphlib.util.combine_aliases(self)
+ cliapp.Application.process_args(self, args)
+
def setup_plugin_manager(self):
cliapp.Application.setup_plugin_manager(self)
diff --git a/morphlib/util.py b/morphlib/util.py
index d1c60c36..ce9d0dc9 100644
--- a/morphlib/util.py
+++ b/morphlib/util.py
@@ -13,6 +13,8 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import re
+
import morphlib
'''Utility functions for morph.'''
@@ -97,6 +99,49 @@ def new_artifact_caches(settings): # pragma: no cover
rac = None
return lac, rac
+def combine_aliases(app): # pragma: no cover
+ '''Create a full repo-alias set from the app's settings.'''
+ trove_host = app.settings['trove-host']
+ trove_prefixes = app.settings['trove-prefix']
+ repo_aliases = app.settings['repo-alias']
+ repo_pat = r'^(?P<prefix>[a-z0-9]+)=(?P<pull>[^#]+)#(?P<push>[^#]+)$'
+ trove_pat = (r'^(?P<prefix>[a-z0-9]+)=(?P<path>[^#]+)#'
+ '(?P<pull>[^#]+)#(?P<push>[^#]+)$')
+ alias_map = {}
+ def _expand(protocol, path):
+ if protocol == "git":
+ return "git://%s/%s/%%s" % (trove_host, path)
+ elif protocol == "ssh":
+ return "ssh://git@%s/%s/%%s" % (trove_host, path)
+ else:
+ raise cliapp.AppException(
+ 'Unknown protocol in trove_prefix: %s' % protocol)
+
+ if trove_host:
+ alias_map['baserock'] = "baserock=%s#%s" % (
+ _expand('git', 'baserock'),
+ _expand('ssh', 'baserock'))
+ alias_map['upstream'] = "upstream=%s#%s" % (
+ _expand('git', 'delta'),
+ _expand('ssh', 'delta'))
+ for trove_prefix in trove_prefixes:
+ m = re.match(trove_pat, trove_prefix)
+ if m:
+ alias_map[m.group('prefix')] = "%s=%s#%s" % (
+ m.group('prefix'),
+ _expand(m.group('pull'), m.group('path')),
+ _expand(m.group('push'), m.group('path')))
+ elif '=' not in trove_prefix:
+ alias_map[trove_prefix] = "%s=%s#%s" % (
+ trove_prefix,
+ _expand('ssh', trove_prefix),
+ _expand('ssh', trove_prefix))
+ for repo_alias in repo_aliases:
+ m = re.match(repo_pat, repo_alias)
+ if m:
+ alias_map[m.group('prefix')] = repo_alias
+
+ return alias_map.values()
def new_repo_caches(app): # pragma: no cover
'''Create new objects for local, remote git repository caches.'''