summaryrefslogtreecommitdiff
path: root/distbuild
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2014-10-27 17:15:55 +0000
committerSam Thursfield <sam@afuera.me.uk>2014-10-27 17:17:38 +0000
commita0c24350042082fe3e1195f8f6160da363c94843 (patch)
tree4db8e1be44b2d3106e33723fbe8c81777451ef5e /distbuild
parent71fbade1fdb5e0d578b9f0ec06d44b69951b8af8 (diff)
downloadmorph-a0c24350042082fe3e1195f8f6160da363c94843.tar.gz
Fix distbuild to allow passing a commit instead of a named ref to be built
The recent changes to the BuildCommand.build() function caused distbuild to break, because I didn't make the same change to the InitiatorBuildCommand.build() function but did change how it was called. This commit adds the ability to have optional fields in distbuild messages. This is used to add an optional 'original_ref' field, which will get passed to `morph serialise-artifact` by new distbuild controllers, and will be ignored by older ones.
Diffstat (limited to 'distbuild')
-rw-r--r--distbuild/build_controller.py2
-rw-r--r--distbuild/initiator.py6
-rw-r--r--distbuild/protocol.py19
3 files changed, 21 insertions, 6 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