summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2014-10-29 14:07:22 +0000
committerSam Thursfield <sam.thursfield@codethink.co.uk>2014-10-29 14:07:22 +0000
commit481608ccad208bd7609aaca182baa12e3ef300eb (patch)
tree352bd3f45bdaee6a0165e02e542e7700aca5f95e
parent42c7735d8d4107e3560b97913513ae8fdb96c69d (diff)
parenta0c24350042082fe3e1195f8f6160da363c94843 (diff)
downloadmorph-481608ccad208bd7609aaca182baa12e3ef300eb.tar.gz
Merge remote-tracking branch 'origin/sam/build-fix-3'
Reviewed-By: Richard Ipsum <richard.ipsum@codethink.co.uk> Reviewed-By: Richard Maw <richard.maw@codethink.co.uk>
-rw-r--r--distbuild/build_controller.py2
-rw-r--r--distbuild/initiator.py6
-rw-r--r--distbuild/protocol.py19
-rw-r--r--morphlib/buildcommand.py7
-rw-r--r--morphlib/plugins/distbuild_plugin.py21
5 files changed, 38 insertions, 17 deletions
diff --git a/distbuild/build_controller.py b/distbuild/build_controller.py
index 93f97fac..387b410f 100644
--- a/distbuild/build_controller.py
+++ b/distbuild/build_controller.py
@@ -258,6 +258,8 @@ class BuildController(distbuild.StateMachine):
self._request['ref'],
self._request['morphology'],
]
+ if 'original_ref' in self._request:
+ argv.append(self._request['original_ref'])
msg = distbuild.message('exec-request',
id=self._idgen.next(),
argv=argv,
diff --git a/distbuild/initiator.py b/distbuild/initiator.py
index b0993aa3..70b26c1e 100644
--- a/distbuild/initiator.py
+++ b/distbuild/initiator.py
@@ -39,7 +39,7 @@ class _Failed(object):
class Initiator(distbuild.StateMachine):
- def __init__(self, cm, conn, app, repo_name, ref, morphology):
+ def __init__(self, cm, conn, app, repo_name, ref, morphology, original_ref):
distbuild.StateMachine.__init__(self, 'waiting')
self._cm = cm
self._conn = conn
@@ -47,6 +47,7 @@ class Initiator(distbuild.StateMachine):
self._repo_name = repo_name
self._ref = ref
self._morphology = morphology
+ self._original_ref = original_ref
self._steps = None
self._step_outputs = {}
self._step_output_dir = app.settings['initiator-step-output-dir']
@@ -80,7 +81,8 @@ class Initiator(distbuild.StateMachine):
id=random_id,
repo=self._repo_name,
ref=self._ref,
- morphology=self._morphology
+ morphology=self._morphology,
+ original_ref=self._original_ref
)
self._jm.send(msg)
logging.debug('Initiator: sent to controller: %s', repr(msg))
diff --git a/distbuild/protocol.py b/distbuild/protocol.py
index d5dfe2b7..ffce1fe7 100644
--- a/distbuild/protocol.py
+++ b/distbuild/protocol.py
@@ -19,7 +19,7 @@
'''Construct protocol message objects (dicts).'''
-_types = {
+_required_fields = {
'build-request': [
'id',
'repo',
@@ -84,15 +84,26 @@ _types = {
}
+_optional_fields = {
+ 'build-request': [
+ 'original_ref'
+ ]
+}
+
+
def message(message_type, **kwargs):
- assert message_type in _types
- required_fields = _types[message_type]
+ known_types = _required_fields.keys()
+ assert message_type in known_types
+
+ required_fields = _required_fields[message_type]
+ optional_fields = _optional_fields.get(message_type, [])
for name in required_fields:
assert name in kwargs, 'field %s is required' % name
for name in kwargs:
- assert name in required_fields, 'field %s is not allowed' % name
+ assert (name in required_fields or name in optional_fields), \
+ 'field %s is not allowed' % name
msg = dict(kwargs)
msg['type'] = message_type
diff --git a/morphlib/buildcommand.py b/morphlib/buildcommand.py
index 544d88d8..438badb3 100644
--- a/morphlib/buildcommand.py
+++ b/morphlib/buildcommand.py
@@ -542,21 +542,18 @@ class InitiatorBuildCommand(BuildCommand):
self.app.settings['push-build-branches'] = True
super(InitiatorBuildCommand, self).__init__(app)
- def build(self, args):
+ def build(self, repo_name, ref, filename, original_ref=None):
'''Initiate a distributed build on a controller'''
distbuild.add_crash_conditions(self.app.settings['crash-condition'])
- if len(args) != 3:
- raise morphlib.Error(
- 'Need repo, ref, morphology triplet to build')
-
if self.addr == '':
raise morphlib.Error(
'Need address of controller to run a distbuild')
self.app.status(msg='Starting distributed build')
loop = distbuild.MainLoop()
+ args = [repo_name, ref, filename, original_ref or ref]
cm = distbuild.InitiatorConnectionMachine(self.app,
self.addr,
self.port,
diff --git a/morphlib/plugins/distbuild_plugin.py b/morphlib/plugins/distbuild_plugin.py
index 653eeae8..970205c0 100644
--- a/morphlib/plugins/distbuild_plugin.py
+++ b/morphlib/plugins/distbuild_plugin.py
@@ -45,7 +45,7 @@ class SerialiseArtifactPlugin(cliapp.Plugin):
def enable(self):
self.app.add_subcommand('serialise-artifact', self.serialise_artifact,
- arg_synopsis='REPO REF MORPHOLOGY')
+ arg_synopsis='REPO REF MORPHOLOGY [ORIGINAL_REF]')
def disable(self):
pass
@@ -55,13 +55,22 @@ class SerialiseArtifactPlugin(cliapp.Plugin):
distbuild.add_crash_conditions(self.app.settings['crash-condition'])
- if len(args) != 3:
- raise cliapp.AppException('Must get triplet')
-
- repo_name, ref, morph_name = args
+ if len(args) not in [3, 4]:
+ raise cliapp.AppException(
+ 'This command takes a repo/ref/morph triplet, and optionally '
+ 'a ref name.')
+
+ repo_name, ref, morph_name = args[0:3]
+
+ if len(args) == 4:
+ original_ref = args[3]
+ else:
+ original_ref = ref
+
filename = morphlib.util.sanitise_morphology_path(morph_name)
build_command = morphlib.buildcommand.BuildCommand(self.app)
- srcpool = build_command.create_source_pool(repo_name, ref, filename)
+ srcpool = build_command.create_source_pool(
+ repo_name, ref, filename, original_ref=original_ref)
artifact = build_command.resolve_artifacts(srcpool)
self.app.output.write(distbuild.serialise_artifact(artifact))
self.app.output.write('\n')