summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README6
-rwxr-xr-xcheck5
-rwxr-xr-xdistbuild-helper5
-rw-r--r--distbuild/__init__.py10
-rw-r--r--distbuild/ansible/hosts1
-rw-r--r--distbuild/build_controller.py27
-rw-r--r--distbuild/connection_machine.py9
-rw-r--r--distbuild/crashpoint.py5
-rw-r--r--distbuild/crashpoint_tests.py5
-rw-r--r--distbuild/distbuild_socket.py5
-rw-r--r--distbuild/eventsrc.py5
-rw-r--r--distbuild/helper_router.py5
-rw-r--r--distbuild/idgen.py5
-rw-r--r--distbuild/initiator.py64
-rw-r--r--distbuild/initiator_connection.py31
-rw-r--r--distbuild/jm.py5
-rw-r--r--distbuild/json_router.py5
-rw-r--r--distbuild/mainloop.py8
-rw-r--r--distbuild/protocol.py9
-rw-r--r--distbuild/proxy_event_source.py5
-rw-r--r--distbuild/route_map.py5
-rw-r--r--distbuild/route_map_tests.py5
-rw-r--r--distbuild/serialise.py5
-rw-r--r--distbuild/serialise_tests.py5
-rw-r--r--distbuild/sm.py5
-rw-r--r--distbuild/sm_tests.py5
-rw-r--r--distbuild/sockbuf.py9
-rw-r--r--distbuild/socketsrc.py7
-rw-r--r--distbuild/sockserv.py5
-rw-r--r--distbuild/stringbuffer.py5
-rw-r--r--distbuild/stringbuffer_tests.py5
-rw-r--r--distbuild/timer_event_source.py5
-rw-r--r--distbuild/worker_build_scheduler.py138
-rwxr-xr-xmorph5
-rwxr-xr-xmorph-cache-server5
-rw-r--r--morph.1.in5
-rw-r--r--morphcacheserver/__init__.py5
-rw-r--r--morphcacheserver/repocache.py5
-rw-r--r--morphlib/__init__.py3
-rw-r--r--morphlib/app.py3
-rw-r--r--morphlib/artifact.py5
-rw-r--r--morphlib/artifact_tests.py5
-rw-r--r--morphlib/artifactcachereference.py5
-rw-r--r--morphlib/artifactresolver.py3
-rw-r--r--morphlib/artifactresolver_tests.py5
-rw-r--r--morphlib/artifactsplitrule.py5
-rw-r--r--morphlib/bins.py9
-rw-r--r--morphlib/bins_tests.py5
-rw-r--r--morphlib/branchmanager.py9
-rw-r--r--morphlib/branchmanager_tests.py5
-rw-r--r--morphlib/buildbranch.py9
-rw-r--r--morphlib/buildcommand.py13
-rw-r--r--morphlib/buildenvironment.py3
-rw-r--r--morphlib/buildenvironment_tests.py5
-rw-r--r--morphlib/builder.py13
-rw-r--r--morphlib/builder_tests.py3
-rw-r--r--morphlib/buildsystem.py5
-rw-r--r--morphlib/buildsystem_tests.py5
-rw-r--r--morphlib/cachedrepo.py3
-rw-r--r--morphlib/cachedrepo_tests.py3
-rw-r--r--morphlib/cachekeycomputer.py5
-rw-r--r--morphlib/cachekeycomputer_tests.py5
-rw-r--r--morphlib/extensions.py7
-rw-r--r--morphlib/extractedtarball.py9
-rwxr-xr-xmorphlib/exts/add-config-files.configure5
-rwxr-xr-xmorphlib/exts/fstab.configure28
-rwxr-xr-xmorphlib/exts/hosts.configure48
-rwxr-xr-xmorphlib/exts/initramfs.write5
-rwxr-xr-xmorphlib/exts/install-files.configure5
-rwxr-xr-xmorphlib/exts/kvm.check3
-rwxr-xr-xmorphlib/exts/kvm.write5
-rwxr-xr-xmorphlib/exts/nfsboot.check5
-rwxr-xr-xmorphlib/exts/nfsboot.configure5
-rwxr-xr-xmorphlib/exts/nfsboot.write5
-rwxr-xr-xmorphlib/exts/openstack.check5
-rwxr-xr-xmorphlib/exts/openstack.write5
-rwxr-xr-xmorphlib/exts/rawdisk.check5
-rwxr-xr-xmorphlib/exts/rawdisk.write5
-rwxr-xr-xmorphlib/exts/set-hostname.configure5
-rwxr-xr-xmorphlib/exts/simple-network.configure151
-rwxr-xr-xmorphlib/exts/ssh-rsync.check5
-rwxr-xr-xmorphlib/exts/ssh-rsync.write5
-rwxr-xr-xmorphlib/exts/sysroot.check3
-rwxr-xr-xmorphlib/exts/sysroot.write3
-rwxr-xr-xmorphlib/exts/tar.check5
-rwxr-xr-xmorphlib/exts/tar.write5
-rwxr-xr-xmorphlib/exts/vdaboot.configure5
-rwxr-xr-xmorphlib/exts/virtualbox-ssh.check5
-rwxr-xr-xmorphlib/exts/virtualbox-ssh.write3
-rw-r--r--morphlib/fsutils.py5
-rw-r--r--morphlib/fsutils_tests.py5
-rw-r--r--morphlib/git.py9
-rw-r--r--morphlib/gitdir.py9
-rw-r--r--morphlib/gitdir_tests.py5
-rw-r--r--morphlib/gitindex.py3
-rw-r--r--morphlib/gitindex_tests.py3
-rw-r--r--morphlib/gitversion.py7
-rw-r--r--morphlib/localartifactcache.py5
-rw-r--r--morphlib/localartifactcache_tests.py5
-rw-r--r--morphlib/localrepocache.py9
-rw-r--r--morphlib/localrepocache_tests.py3
-rw-r--r--morphlib/morphloader.py3
-rw-r--r--morphlib/morphloader_tests.py3
-rw-r--r--morphlib/morphology.py5
-rw-r--r--morphlib/morphology_tests.py5
-rw-r--r--morphlib/morphologyfinder.py5
-rw-r--r--morphlib/morphologyfinder_tests.py5
-rw-r--r--morphlib/morphset.py5
-rw-r--r--morphlib/morphset_tests.py5
-rw-r--r--morphlib/mountableimage.py13
-rw-r--r--morphlib/plugins/add_binary_plugin.py5
-rw-r--r--morphlib/plugins/artifact_inspection_plugin.py7
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py5
-rw-r--r--morphlib/plugins/build_plugin.py3
-rw-r--r--morphlib/plugins/cross-bootstrap_plugin.py13
-rw-r--r--morphlib/plugins/deploy_plugin.py3
-rw-r--r--morphlib/plugins/distbuild_plugin.py4
-rw-r--r--morphlib/plugins/expand_repo_plugin.py5
-rw-r--r--morphlib/plugins/gc_plugin.py5
-rw-r--r--morphlib/plugins/graphing_plugin.py5
-rw-r--r--morphlib/plugins/list_artifacts_plugin.py6
-rw-r--r--morphlib/plugins/print_architecture_plugin.py5
-rw-r--r--morphlib/plugins/push_pull_plugin.py5
-rw-r--r--morphlib/plugins/show_dependencies_plugin.py5
-rw-r--r--morphlib/plugins/trovectl_plugin.py5
-rwxr-xr-xmorphlib/recv-hole5
-rw-r--r--morphlib/remoteartifactcache.py9
-rw-r--r--morphlib/remoteartifactcache_tests.py5
-rw-r--r--morphlib/remoterepocache.py9
-rw-r--r--morphlib/remoterepocache_tests.py5
-rw-r--r--morphlib/repoaliasresolver.py5
-rw-r--r--morphlib/repoaliasresolver_tests.py5
-rw-r--r--morphlib/savefile.py5
-rw-r--r--morphlib/savefile_tests.py5
-rw-r--r--morphlib/source.py5
-rw-r--r--morphlib/source_tests.py5
-rw-r--r--morphlib/sourcepool.py5
-rw-r--r--morphlib/sourcepool_tests.py5
-rw-r--r--morphlib/sourceresolver.py116
-rw-r--r--morphlib/sourceresolver_tests.py3
-rw-r--r--morphlib/stagingarea.py7
-rw-r--r--morphlib/stagingarea_tests.py5
-rw-r--r--morphlib/stopwatch.py5
-rw-r--r--morphlib/stopwatch_tests.py5
-rw-r--r--morphlib/sysbranchdir.py3
-rw-r--r--morphlib/sysbranchdir_tests.py5
-rw-r--r--morphlib/systemmetadatadir.py5
-rw-r--r--morphlib/systemmetadatadir_tests.py5
-rw-r--r--morphlib/util.py35
-rw-r--r--morphlib/util_tests.py5
-rw-r--r--morphlib/workspace.py5
-rw-r--r--morphlib/workspace_tests.py5
-rw-r--r--morphlib/writeexts.py9
-rwxr-xr-xmorphlib/xfer-hole5
-rw-r--r--morphlib/yamlparse.py5
-rw-r--r--morphlib/yamlparse_tests.py5
-rwxr-xr-xscripts/check-copyright-year5
-rwxr-xr-xscripts/check-silliness5
-rwxr-xr-xscripts/clean-artifact-cache5
-rwxr-xr-xscripts/cmd-filter5
-rwxr-xr-xscripts/convert-git-cache5
-rwxr-xr-xscripts/edit-morph5
-rw-r--r--scripts/fix-committer-info5
-rwxr-xr-xscripts/list-tree5
-rw-r--r--scripts/python-check5
-rwxr-xr-xscripts/review-gitmodules5
-rwxr-xr-xscripts/run-git-in5
-rw-r--r--scripts/setup-3rd-party-strata5
-rwxr-xr-xscripts/test-morph5
-rw-r--r--scripts/test-shell.c15
-rwxr-xr-xscripts/yaml-extract5
-rw-r--r--setup.py5
-rwxr-xr-xsource-stats5
-rwxr-xr-xtests.branching/add-then-edit.script5
-rwxr-xr-xtests.branching/add-then-edit.setup5
-rwxr-xr-xtests.branching/branch-cleans-up-on-failure.script5
-rwxr-xr-xtests.branching/branch-creates-new-system-branch-not-from-master.script5
-rwxr-xr-xtests.branching/branch-creates-new-system-branch.script5
-rwxr-xr-xtests.branching/branch-fails-if-branch-exists.script5
-rwxr-xr-xtests.branching/branch-when-branchdir-exists-locally.script5
-rwxr-xr-xtests.branching/branch-works-anywhere.script5
-rwxr-xr-xtests.branching/checkout-cleans-up-on-failure.script5
-rwxr-xr-xtests.branching/checkout-existing-branch.script5
-rwxr-xr-xtests.branching/checkout-non-aliased-repos.script5
-rwxr-xr-xtests.branching/checkout-works-anywhere.script5
-rwxr-xr-xtests.branching/edit-checkouts-existing-chunk.script5
-rwxr-xr-xtests.branching/edit-clones-chunk.script5
-rwxr-xr-xtests.branching/edit-handles-submodules.script5
-rwxr-xr-xtests.branching/edit-handles-submodules.setup5
-rwxr-xr-xtests.branching/edit-updates-stratum.script5
-rwxr-xr-xtests.branching/edit-works-after-branch-root-was-renamed.script5
-rwxr-xr-xtests.branching/foreach-handles-command-failure.script5
-rwxr-xr-xtests.branching/foreach-handles-full-urls.script5
-rwxr-xr-xtests.branching/init-cwd.script5
-rwxr-xr-xtests.branching/init-default.script5
-rwxr-xr-xtests.branching/init-existing.script5
-rwxr-xr-xtests.branching/init-newdir.script5
-rwxr-xr-xtests.branching/init-nonempty.script5
-rwxr-xr-xtests.branching/morph-repository-stored-in-cloned-repositories.script5
-rwxr-xr-xtests.branching/setup5
-rwxr-xr-xtests.branching/setup-second-chunk5
-rwxr-xr-xtests.branching/show-system-branch-fails-outside-workspace.script5
-rwxr-xr-xtests.branching/show-system-branch-fails-when-branch-is-ambiguous.script5
-rwxr-xr-xtests.branching/show-system-branch-works-anywhere-with-a-single-branch.script5
-rwxr-xr-xtests.branching/show-system-branch-works-in-different-directories-in-a-branch.script5
-rwxr-xr-xtests.branching/status-in-clean-branch.script5
-rwxr-xr-xtests.branching/status-in-dirty-branch.script5
-rwxr-xr-xtests.branching/status-in-workspace.script5
-rwxr-xr-xtests.branching/teardown5
-rwxr-xr-xtests.branching/workspace-not-found.script5
-rwxr-xr-xtests.branching/workspace.script5
-rwxr-xr-xtests.build/ambiguous-refs.script5
-rwxr-xr-xtests.build/build-chunk-failures-dump-log.script5
-rwxr-xr-xtests.build/build-chunk-writes-log.script5
-rwxr-xr-xtests.build/build-stratum-with-submodules.script5
-rwxr-xr-xtests.build/build-system-autotools-fails-if-autogen-fails.script5
-rwxr-xr-xtests.build/build-system-autotools.script5
-rwxr-xr-xtests.build/build-system-cmake.script5
-rwxr-xr-xtests.build/build-system-cpan.script5
-rwxr-xr-xtests.build/build-system-python-distutils.script5
-rwxr-xr-xtests.build/build-system-qmake.script5
-rwxr-xr-xtests.build/build-system.script5
-rwxr-xr-xtests.build/cross-bootstrap-only-to-supported-archs.script5
-rwxr-xr-xtests.build/cross-bootstrap.script5
-rwxr-xr-xtests.build/missing-ref.script5
-rwxr-xr-xtests.build/morphless-chunks.script5
-rwxr-xr-xtests.build/only-build-systems.script5
-rwxr-xr-xtests.build/prefix.script5
-rwxr-xr-xtests.build/rebuild-cached-stratum.script5
-rwxr-xr-xtests.build/setup5
-rwxr-xr-xtests.build/setup-build-essential5
-rwxr-xr-xtests.build/uses-tempdir.script5
-rwxr-xr-xtests/setup5
-rwxr-xr-xtests/show-dependencies.script5
-rwxr-xr-xtests/show-dependencies.setup5
-rwxr-xr-xtests/trove-id.script5
-rw-r--r--yarns/branches-workspaces.yarn17
-rw-r--r--yarns/implementations.yarn10
-rw-r--r--yarns/morph.shell-lib5
239 files changed, 948 insertions, 926 deletions
diff --git a/README b/README
index 8ff2f034..f43d89f7 100644
--- a/README
+++ b/README
@@ -273,7 +273,7 @@ Run the checks before submitting a patch, please.
Legalese
--------
-Copyright (C) 2011-2014 Codethink Limited
+Copyright (C) 2011-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
@@ -285,6 +285,4 @@ 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
+with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/check b/check
index dc4f96bc..16720083 100755
--- a/check
+++ b/check
@@ -2,7 +2,7 @@
#
# Run test suite for morph.
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -14,8 +14,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
diff --git a/distbuild-helper b/distbuild-helper
index cdc1873e..d77fcaea 100755
--- a/distbuild-helper
+++ b/distbuild-helper
@@ -2,7 +2,7 @@
#
# distbuild-helper -- helper process for Morph distributed building
#
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -14,8 +14,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
import errno
diff --git a/distbuild/__init__.py b/distbuild/__init__.py
index 52ad2cc2..fc74d480 100644
--- a/distbuild/__init__.py
+++ b/distbuild/__init__.py
@@ -1,6 +1,6 @@
# distbuild/__init__.py -- library for Morph's distributed build plugin
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
from stringbuffer import StringBuffer
@@ -51,9 +50,8 @@ from worker_build_scheduler import (WorkerBuildQueuer,
WorkerBuildFailed,
WorkerBuildStepStarted)
from build_controller import (BuildController, BuildFailed, BuildProgress,
- BuildSteps, BuildStepStarted,
- BuildStepAlreadyStarted, BuildOutput,
- BuildStepFinished, BuildStepFailed,
+ BuildStepStarted, BuildStepAlreadyStarted,
+ BuildOutput, BuildStepFinished, BuildStepFailed,
BuildFinished, BuildCancel,
build_step_name, map_build_graph)
from initiator import Initiator
diff --git a/distbuild/ansible/hosts b/distbuild/ansible/hosts
new file mode 100644
index 00000000..2fbb50c4
--- /dev/null
+++ b/distbuild/ansible/hosts
@@ -0,0 +1 @@
+localhost
diff --git a/distbuild/build_controller.py b/distbuild/build_controller.py
index aa11ae8f..d6f3398f 100644
--- a/distbuild/build_controller.py
+++ b/distbuild/build_controller.py
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
@@ -71,13 +70,6 @@ class BuildProgress(object):
self.message_text = message_text
-class BuildSteps(object):
-
- def __init__(self, request_id, artifact):
- self.id = request_id
- self.artifact = artifact
-
-
class BuildStepStarted(object):
def __init__(self, request_id, step_name, worker_name):
@@ -121,7 +113,7 @@ class _Abort(object):
def build_step_name(artifact):
'''Return user-comprehensible name for a given artifact.'''
- return artifact.name
+ return artifact.source.name
def map_build_graph(artifact, callback):
@@ -295,9 +287,6 @@ class BuildController(distbuild.StateMachine):
progress = BuildProgress(
self._request['id'], 'Finished computing build graph')
self.mainloop.queue_event(BuildController, progress)
-
- build_steps = BuildSteps(self._request['id'], artifact)
- self.mainloop.queue_event(BuildController, build_steps)
self.mainloop.queue_event(self, _GotGraph(artifact))
@@ -314,7 +303,7 @@ class BuildController(distbuild.StateMachine):
text = self._artifact_data.peek()
try:
artifact = distbuild.deserialise_artifact(text)
- except ValueError, e:
+ except ValueError as e:
logging.error(traceback.format_exc())
self.fail('Failed to compute build graph: %s' % e)
return
@@ -348,7 +337,6 @@ class BuildController(distbuild.StateMachine):
'(helper id: %s)' % self._helper_id)
def _maybe_handle_cache_response(self, event_source, event):
-
def set_status(artifact):
is_in_cache = cache_state[artifact.basename()]
artifact.state = BUILT if is_in_cache else UNBUILT
@@ -370,15 +358,14 @@ class BuildController(distbuild.StateMachine):
map_build_graph(self._artifact, set_status)
self.mainloop.queue_event(self, _Annotated())
- count = sum(map_build_graph(self._artifact,
- lambda a: 1 if a.state == UNBUILT else 0))
-
+ unbuilt = len([a for a in self._artifact.walk() if a.state == UNBUILT])
+ total = len([a for _ in self._artifact.walk()])
progress = BuildProgress(
self._request['id'],
- 'Need to build %d artifacts' % count)
+ 'Need to build %d artifacts, of %d total' % (unbuilt, total))
self.mainloop.queue_event(BuildController, progress)
- if count == 0:
+ if total == 0:
logging.info('There seems to be nothing to build')
self.mainloop.queue_event(self, _Built())
diff --git a/distbuild/connection_machine.py b/distbuild/connection_machine.py
index e75ebe56..b8248931 100644
--- a/distbuild/connection_machine.py
+++ b/distbuild/connection_machine.py
@@ -1,6 +1,6 @@
# distbuild/connection_machine.py -- state machine for connecting to server
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import errno
@@ -106,7 +105,7 @@ class ConnectionMachine(distbuild.StateMachine):
distbuild.set_nonblocking(self._socket)
try:
self._socket.connect((self._addr, self._port))
- except socket.error, e:
+ except socket.error as e:
if e.errno != errno.EINPROGRESS:
raise socket.error(
"%s (attempting connection to distbuild controller "
@@ -118,7 +117,7 @@ class ConnectionMachine(distbuild.StateMachine):
def _connect(self, event_source, event):
try:
self._socket.connect((self._addr, self._port))
- except socket.error, e:
+ except socket.error as e:
logging.error(
'Failed to connect to %s:%s: %s' %
(self._addr, self._port, str(e)))
diff --git a/distbuild/crashpoint.py b/distbuild/crashpoint.py
index 6e3eb3ef..98e6906c 100644
--- a/distbuild/crashpoint.py
+++ b/distbuild/crashpoint.py
@@ -1,6 +1,6 @@
# distbuild/crashpoint.py -- user-controlled crashing
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Crash the application.
diff --git a/distbuild/crashpoint_tests.py b/distbuild/crashpoint_tests.py
index eb64115e..be073a96 100644
--- a/distbuild/crashpoint_tests.py
+++ b/distbuild/crashpoint_tests.py
@@ -1,6 +1,6 @@
# distbuild/crashpoint_tests.py -- unit tests for crashpoint.py
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/distbuild/distbuild_socket.py b/distbuild/distbuild_socket.py
index ce69f29e..2e219bb3 100644
--- a/distbuild/distbuild_socket.py
+++ b/distbuild/distbuild_socket.py
@@ -1,6 +1,6 @@
# distbuild/distbuild_socket.py -- wrapper around Python 'socket' module.
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import socket
diff --git a/distbuild/eventsrc.py b/distbuild/eventsrc.py
index 560b9b7a..85e4f5f9 100644
--- a/distbuild/eventsrc.py
+++ b/distbuild/eventsrc.py
@@ -1,6 +1,6 @@
# mainloop/eventsrc.py -- interface for event sources
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
class EventSource(object):
diff --git a/distbuild/helper_router.py b/distbuild/helper_router.py
index f7126093..5578f750 100644
--- a/distbuild/helper_router.py
+++ b/distbuild/helper_router.py
@@ -1,6 +1,6 @@
# distbuild/helper_router.py -- state machine for controller's helper comms
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/distbuild/idgen.py b/distbuild/idgen.py
index 41f2ffcf..ef5684d7 100644
--- a/distbuild/idgen.py
+++ b/distbuild/idgen.py
@@ -1,6 +1,6 @@
# distbuild/idgen.py -- generate unique identifiers
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/distbuild/initiator.py b/distbuild/initiator.py
index 7f82827c..eef4c9ec 100644
--- a/distbuild/initiator.py
+++ b/distbuild/initiator.py
@@ -12,11 +12,11 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
+import itertools
import logging
import os
import random
@@ -37,6 +37,20 @@ class _Failed(object):
self.msg = msg
+def create_build_directory(prefix='build'):
+ '''Create a new directory to store build logs.
+
+ The directory will be named build-0, unless that directory already exists,
+ in which case it will be named build-1, and so on.
+
+ '''
+ for i in itertools.count():
+ path = '%s-%02i' % (prefix, i)
+ if not os.path.exists(path):
+ os.mkdir(path)
+ return path
+
+
class Initiator(distbuild.StateMachine):
def __init__(self, cm, conn, app, repo_name, ref, morphology,
@@ -49,11 +63,14 @@ class Initiator(distbuild.StateMachine):
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']
self.debug_transitions = False
+ if app.settings['initiator-step-output-dir'] == '':
+ self._step_output_dir = create_build_directory()
+ else:
+ self._step_output_dir = app.settings['initiator-step-output-dir']
+
def setup(self):
distbuild.crash_point()
@@ -98,7 +115,6 @@ class Initiator(distbuild.StateMachine):
'build-finished': self._handle_build_finished_message,
'build-failed': self._handle_build_failed_message,
'build-progress': self._handle_build_progress_message,
- 'build-steps': self._handle_build_steps_message,
'step-started': self._handle_step_started_message,
'step-already-started': self._handle_step_already_started_message,
'step-output': self._handle_step_output_message,
@@ -118,12 +134,6 @@ class Initiator(distbuild.StateMachine):
def _handle_build_progress_message(self, msg):
self._app.status(msg='Progress: %(msgtext)s', msgtext=msg['message'])
- def _handle_build_steps_message(self, msg):
- self._steps = msg['steps']
- self._app.status(
- msg='Build steps in total: %(steps)d',
- steps=len(self._steps))
-
def _open_output(self, msg):
assert msg['step_name'] not in self._step_outputs
if self._step_output_dir:
@@ -141,16 +151,17 @@ class Initiator(distbuild.StateMachine):
def _get_output(self, msg):
return self._step_outputs[msg['step_name']]
+ def _write_status_to_build_log(self, f, status):
+ f.write(time.strftime('%Y-%m-%d %H:%M:%S ') + status + '\n')
+ f.flush()
+
def _handle_step_already_started_message(self, msg):
status = '%s is already building on %s' % (
msg['step_name'], msg['worker_name'])
self._app.status(msg=status)
self._open_output(msg)
-
- f = self._get_output(msg)
- f.write(time.strftime('%Y-%m-%d %H:%M:%S ') + status + '\n')
- f.flush()
+ self._write_status_to_build_log(self._get_output(msg), status)
def _handle_step_started_message(self, msg):
status = 'Started building %s on %s' % (
@@ -158,10 +169,7 @@ class Initiator(distbuild.StateMachine):
self._app.status(msg=status)
self._open_output(msg)
-
- f = self._get_output(msg)
- f.write(time.strftime('%Y-%m-%d %H:%M:%S ') + status + '\n')
- f.flush()
+ self._write_status_to_build_log(self._get_output(msg), status)
def _handle_step_output_message(self, msg):
step_name = msg['step_name']
@@ -180,9 +188,7 @@ class Initiator(distbuild.StateMachine):
status = 'Finished building %s' % step_name
self._app.status(msg=status)
- f = self._get_output(msg)
- f.write(time.strftime('%Y-%m-%d %H:%M:%S ') + status + '\n')
-
+ self._write_status_to_build_log(self._get_output(msg), status)
self._close_output(msg)
else:
logging.warning(
@@ -194,9 +200,7 @@ class Initiator(distbuild.StateMachine):
status = 'Build of %s failed.' % step_name
self._app.status(msg=status)
- f = self._get_output(msg)
- f.write(time.strftime('%Y-%m-%d %H:%M:%S ') + status + '\n')
-
+ self._write_status_to_build_log(self._get_output(msg), status)
self._close_output(msg)
else:
logging.warning(
@@ -227,3 +231,13 @@ class Initiator(distbuild.StateMachine):
self.mainloop.queue_event(self._cm, distbuild.StopConnecting())
self._jm.close()
+ def handle_cancel(self):
+ # Note in each build-step.log file that the initiator cancelled: this
+ # makes it easier to tell whether a build was aborted due to a bug or
+ # dropped connection, or if the user cancelled with CTRL+C / SIGINT.
+
+ for f in self._step_outputs.itervalues():
+ self._write_status_to_build_log(f, 'Initiator cancelled')
+ f.close()
+
+ self._step_outputs = {}
diff --git a/distbuild/initiator_connection.py b/distbuild/initiator_connection.py
index 86df28f1..8d6c1f4c 100644
--- a/distbuild/initiator_connection.py
+++ b/distbuild/initiator_connection.py
@@ -1,6 +1,6 @@
# distbuild/initiator_connection.py -- communicate with initiator
#
-# Copyright (C) 2012, 2014 - 2015 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
@@ -77,8 +76,6 @@ class InitiatorConnection(distbuild.StateMachine):
'idle', self._send_build_failed_message),
('idle', distbuild.BuildController, distbuild.BuildProgress,
'idle', self._send_build_progress_message),
- ('idle', distbuild.BuildController, distbuild.BuildSteps,
- 'idle', self._send_build_steps_message),
('idle', distbuild.BuildController, distbuild.BuildStepStarted,
'idle', self._send_build_step_started_message),
('idle', distbuild.BuildController,
@@ -109,8 +106,8 @@ class InitiatorConnection(distbuild.StateMachine):
reason=('Protocol version mismatch between server & '
'initiator: distbuild network uses distbuild '
'protocol version %i, but client uses version'
- ' %i.', distbuild.protocol.VERSION,
- event.msg.get('protocol_version')))
+ ' %i.' % (distbuild.protocol.VERSION,
+ event.msg.get('protocol_version'))))
self.jm.send(msg)
self._log_send(msg)
return
@@ -180,26 +177,6 @@ class InitiatorConnection(distbuild.StateMachine):
self.jm.send(msg)
self._log_send(msg)
- def _send_build_steps_message(self, event_source, event):
-
- def make_step_dict(artifact):
- return {
- 'name': distbuild.build_step_name(artifact),
- 'build-depends': [
- distbuild.build_step_name(x)
- for x in artifact.source.dependencies
- ]
- }
-
- if event.id in self.our_ids:
- step_names = distbuild.map_build_graph(
- event.artifact, make_step_dict)
- msg = distbuild.message('build-steps',
- id=self._route_map.get_incoming_id(event.id),
- steps=step_names)
- self.jm.send(msg)
- self._log_send(msg)
-
def _send_build_step_started_message(self, event_source, event):
logging.debug('InitiatorConnection: build_step_started: '
'id=%s step_name=%s worker_name=%s' %
diff --git a/distbuild/jm.py b/distbuild/jm.py
index 85510924..c08a1958 100644
--- a/distbuild/jm.py
+++ b/distbuild/jm.py
@@ -1,6 +1,6 @@
# mainloop/jm.py -- state machine for JSON communication between nodes
#
-# Copyright (C) 2012, 2014 - 2015 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import fcntl
diff --git a/distbuild/json_router.py b/distbuild/json_router.py
index 8b7b6457..b8d0ca55 100644
--- a/distbuild/json_router.py
+++ b/distbuild/json_router.py
@@ -1,6 +1,6 @@
# distbuild/json_router.py -- state machine to route JSON messages
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/distbuild/mainloop.py b/distbuild/mainloop.py
index 97e439f3..e7c0cc3b 100644
--- a/distbuild/mainloop.py
+++ b/distbuild/mainloop.py
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import fcntl
@@ -57,8 +56,11 @@ class MainLoop(object):
logging.debug('MainLoop.remove_state_machine: %s' % machine)
self._machines.remove(machine)
+ def state_machines_of_type(self, machine_type):
+ return [m for m in self._machines if isinstance(m, machine_type)]
+
def n_state_machines_of_type(self, machine_type):
- return len([m for m in self._machines if isinstance(m, machine_type)])
+ return len(self.state_machines_of_type(machine_type))
def add_event_source(self, event_source):
logging.debug('MainLoop.add_event_source: %s' % event_source)
diff --git a/distbuild/protocol.py b/distbuild/protocol.py
index f2c74819..73d72d1d 100644
--- a/distbuild/protocol.py
+++ b/distbuild/protocol.py
@@ -1,6 +1,6 @@
# distbuild/protocol.py -- abstractions for the JSON messages
#
-# Copyright (C) 2012, 2014 - 2015 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Construct protocol message objects (dicts).'''
@@ -38,10 +37,6 @@ _required_fields = {
'id',
'message',
],
- 'build-steps': [
- 'id',
- 'steps',
- ],
'step-started': [
'id',
'step_name',
diff --git a/distbuild/proxy_event_source.py b/distbuild/proxy_event_source.py
index 20080800..4f75819a 100644
--- a/distbuild/proxy_event_source.py
+++ b/distbuild/proxy_event_source.py
@@ -1,6 +1,6 @@
# distbuild/proxy_event_source.py -- proxy for temporary event sources
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import errno
diff --git a/distbuild/route_map.py b/distbuild/route_map.py
index 6dd90d78..0d482e24 100644
--- a/distbuild/route_map.py
+++ b/distbuild/route_map.py
@@ -1,6 +1,6 @@
# distbuild/route_map.py -- map message ids for routing purposes
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
class RouteMap(object):
diff --git a/distbuild/route_map_tests.py b/distbuild/route_map_tests.py
index b5ceca70..1f6cee5e 100644
--- a/distbuild/route_map_tests.py
+++ b/distbuild/route_map_tests.py
@@ -1,6 +1,6 @@
# distbuild/route_map_tests.py -- unit tests for message routing
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/distbuild/serialise.py b/distbuild/serialise.py
index a7c6c4b9..3e39e684 100644
--- a/distbuild/serialise.py
+++ b/distbuild/serialise.py
@@ -1,6 +1,6 @@
# distbuild/serialise.py -- (de)serialise Artifact object graphs
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import json
diff --git a/distbuild/serialise_tests.py b/distbuild/serialise_tests.py
index d80c3dd7..a0ad78f8 100644
--- a/distbuild/serialise_tests.py
+++ b/distbuild/serialise_tests.py
@@ -1,6 +1,6 @@
# distbuild/serialise_tests.py -- unit tests for Artifact serialisation
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/distbuild/sm.py b/distbuild/sm.py
index e773962b..fd1d04ac 100644
--- a/distbuild/sm.py
+++ b/distbuild/sm.py
@@ -1,6 +1,6 @@
# mainloop/sm.py -- state machine abstraction
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/distbuild/sm_tests.py b/distbuild/sm_tests.py
index 59b9c023..e1f3be9f 100644
--- a/distbuild/sm_tests.py
+++ b/distbuild/sm_tests.py
@@ -1,6 +1,6 @@
# distbuild/sm_tests.py -- unit tests for state machine abstraction
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/distbuild/sockbuf.py b/distbuild/sockbuf.py
index fc0315b0..6feb8669 100644
--- a/distbuild/sockbuf.py
+++ b/distbuild/sockbuf.py
@@ -1,6 +1,6 @@
# mainloop/sockbuf.py -- a buffering, non-blocking socket I/O state machine
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
@@ -144,7 +143,7 @@ class SocketBuffer(StateMachine):
def _fill(self, event_source, event):
try:
data = event.sock.read(self._max_buffer)
- except (IOError, OSError), e:
+ except (IOError, OSError) as e:
logging.debug(
'%s: _fill(): Exception %s from sock.read()', self, e)
return [SocketError(event.sock, e)]
@@ -164,7 +163,7 @@ class SocketBuffer(StateMachine):
data = self._wbuf.read(max_write)
try:
n = event.sock.write(data)
- except (IOError, OSError), e:
+ except (IOError, OSError) as e:
logging.debug(
'%s: _flush(): Exception %s from sock.write()', self, e)
return [SocketError(event.sock, e)]
diff --git a/distbuild/socketsrc.py b/distbuild/socketsrc.py
index 15283140..daba1610 100644
--- a/distbuild/socketsrc.py
+++ b/distbuild/socketsrc.py
@@ -1,6 +1,6 @@
# mainloop/socketsrc.py -- events and event sources for sockets
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import fcntl
@@ -78,7 +77,7 @@ class ListeningSocketEventSource(EventSource):
if self._accepting and self.sock.fileno() in r:
try:
conn, addr = self.sock.accept()
- except socket.error, e:
+ except socket.error as e:
return [SocketError(self.sock, e)]
else:
logging.info(
diff --git a/distbuild/sockserv.py b/distbuild/sockserv.py
index 156394e2..c9979328 100644
--- a/distbuild/sockserv.py
+++ b/distbuild/sockserv.py
@@ -1,6 +1,6 @@
# mainloop/sockserv.py -- socket server state machines
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/distbuild/stringbuffer.py b/distbuild/stringbuffer.py
index 2b94dd19..6371c841 100644
--- a/distbuild/stringbuffer.py
+++ b/distbuild/stringbuffer.py
@@ -1,6 +1,6 @@
# mainloop/stringbuffer.py -- efficient buffering of strings as a queue
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
class StringBuffer(object):
diff --git a/distbuild/stringbuffer_tests.py b/distbuild/stringbuffer_tests.py
index da324f20..5df8951a 100644
--- a/distbuild/stringbuffer_tests.py
+++ b/distbuild/stringbuffer_tests.py
@@ -1,6 +1,6 @@
# distbuild/stringbuffer_tests.py -- unit tests
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/distbuild/timer_event_source.py b/distbuild/timer_event_source.py
index 4a2e81b7..5f5eeb1c 100644
--- a/distbuild/timer_event_source.py
+++ b/distbuild/timer_event_source.py
@@ -1,6 +1,6 @@
# distbuild/timer_event_source.py -- event source for timer events
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import time
diff --git a/distbuild/worker_build_scheduler.py b/distbuild/worker_build_scheduler.py
index 4f7ff98f..e58059b2 100644
--- a/distbuild/worker_build_scheduler.py
+++ b/distbuild/worker_build_scheduler.py
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
@@ -332,7 +331,7 @@ class WorkerBuildQueuer(distbuild.StateMachine):
distbuild.crash_point()
who = event.who
- last_job = who.job() # the job this worker's just completed
+ last_job = who.current_job() # the job this worker's just completed
if last_job:
logging.debug('%s wants new job, just did %s',
@@ -395,9 +394,12 @@ class WorkerConnection(distbuild.StateMachine):
self._writeable_cache_server = writeable_cache_server
self._worker_cache_server_port = worker_cache_server_port
self._morph_instance = morph_instance
- self._helper_id = None
- self._job = None
- self._exec_response_msg = None
+
+ self._active_jobs = dict()
+ self._current_job = None
+ self._current_job_exec_response = None
+ self._current_job_cache_request = None
+
self._debug_json = False
addr, port = self._conn.getpeername()
@@ -407,8 +409,8 @@ class WorkerConnection(distbuild.StateMachine):
def name(self):
return self._worker_name
- def job(self):
- return self._job
+ def current_job(self):
+ return self._current_job
def setup(self):
distbuild.crash_point()
@@ -448,31 +450,30 @@ class WorkerConnection(distbuild.StateMachine):
def _maybe_cancel(self, event_source, build_cancel):
- if build_cancel.id not in self._job.initiators:
+ if build_cancel.id not in self._current_job.initiators:
return # event not relevant
logging.debug('WC: BuildController %r requested a cancel',
event_source)
- if (len(self._job.initiators) == 1):
+ job = self._current_job
+ if (len(job.initiators) == 1):
logging.debug('WC: Cancelling running job %s '
'with job id %s running on %s',
- self._job.artifact.basename(),
- self._job.id,
+ job.artifact.basename(), job.id,
self.name())
- msg = distbuild.message('exec-cancel', id=self._job.id)
+ msg = distbuild.message('exec-cancel', id=job.id)
self._jm.send(msg)
self.mainloop.queue_event(self, _BuildCancelled())
else:
logging.debug('WC: Not cancelling running job %s with job id %s, '
'other initiators want it done: %s',
- self._job.artifact.basename(),
- self._job.id,
- [i for i in self._job.initiators
- if i != build_cancel.id])
+ job.artifact.basename(),
+ job.id,
+ [i for i in job.initiators if i != build_cancel.id])
- self._job.initiators.remove(build_cancel.id)
+ job.initiators.remove(build_cancel.id)
def _disconnected(self, event_source, event):
distbuild.crash_point()
@@ -485,23 +486,30 @@ class WorkerConnection(distbuild.StateMachine):
def _start_build(self, event_source, event):
distbuild.crash_point()
- self._job = event.job
- self._helper_id = None
- self._exec_response_msg = None
+ job = event.job
+
+ if job.id in self._active_jobs:
+ logging.warn('Duplicate job %s for worker %s', job.id, self.name())
+
+ if self._current_job_exec_response or self._current_job_cache_request:
+ logging.warn('Caching not finished for %s', self._current_job.id)
+
+ self._active_jobs[job.id] = job
+ self._current_job = job
logging.debug('WC: starting build: %s for %s' %
- (self._job.artifact.name, self._job.initiators))
+ (job.artifact.name, job.initiators))
argv = [
self._morph_instance,
'worker-build',
'--build-log-on-stdout',
- self._job.artifact.name,
+ job.artifact.name,
]
msg = distbuild.message('exec-request',
- id=self._job.id,
+ id=job.id,
argv=argv,
- stdin_contents=distbuild.serialise_artifact(self._job.artifact),
+ stdin_contents=distbuild.serialise_artifact(job.artifact),
)
self._jm.send(msg)
@@ -509,10 +517,10 @@ class WorkerConnection(distbuild.StateMachine):
logging.debug('WC: sent to worker %s: %r'
% (self._worker_name, msg))
- started = WorkerBuildStepStarted(self._job.initiators,
- self._job.artifact.source.cache_key, self.name())
+ started = WorkerBuildStepStarted(job.initiators,
+ job.artifact.source.cache_key, self.name())
- self.mainloop.queue_event(WorkerConnection, _JobStarted(self._job))
+ self.mainloop.queue_event(WorkerConnection, _JobStarted(job))
self.mainloop.queue_event(WorkerConnection, started)
def _handle_json_message(self, event_source, event):
@@ -527,37 +535,50 @@ class WorkerConnection(distbuild.StateMachine):
'exec-output': self._handle_exec_output,
'exec-response': self._handle_exec_response,
}
-
+
handler = handlers[event.msg['type']]
- handler(event.msg)
+ job = self._active_jobs.get(event.msg['id'])
+
+ if job:
+ handler(event.msg, job)
+ else:
+ logging.warn('Received %s for unknown job %s',
+ event.msg['type'], event.msg['id'])
+
+ def _handle_exec_output(self, msg, job):
+ '''Handle output from a job that the worker is or was running.'''
- def _handle_exec_output(self, msg):
new = dict(msg)
- new['ids'] = self._job.initiators
+ new['ids'] = job.initiators
+
logging.debug('WC: emitting: %s', repr(new))
self.mainloop.queue_event(
WorkerConnection,
- WorkerBuildOutput(new, self._job.artifact.source.cache_key))
+ WorkerBuildOutput(new, job.artifact.source.cache_key))
- def _handle_exec_response(self, msg):
- logging.debug('WC: finished building: %s' % self._job.artifact.name)
- logging.debug('initiators that need to know: %s'
- % self._job.initiators)
+ def _handle_exec_response(self, msg, job):
+ '''Handle completion of a job that the worker is or was running.'''
+
+ logging.debug('WC: finished building: %s' % job.artifact.name)
+ logging.debug('initiators that need to know: %s' % job.initiators)
new = dict(msg)
- new['ids'] = self._job.initiators
+ new['ids'] = job.initiators
if new['exit'] != 0:
# Build failed.
- new_event = WorkerBuildFailed(new,
- self._job.artifact.source.cache_key)
+ new_event = WorkerBuildFailed(new, job.artifact.source.cache_key)
self.mainloop.queue_event(WorkerConnection, new_event)
- self.mainloop.queue_event(WorkerConnection, _JobFailed(self._job))
+ self.mainloop.queue_event(WorkerConnection, _JobFailed(job))
self.mainloop.queue_event(self, _BuildFailed())
else:
# Build succeeded. We have more work to do: caching the result.
self.mainloop.queue_event(self, _BuildFinished())
- self._exec_response_msg = new
+ self._current_job_exec_response = new
+
+ # The job is no longer considered active, because the worker is
+ # finished with it so we won't receive any more messages about it.
+ del self._active_jobs[job.id]
def _request_job(self, event_source, event):
distbuild.crash_point()
@@ -571,15 +592,16 @@ class WorkerConnection(distbuild.StateMachine):
logging.debug('Requesting shared artifact cache to get artifacts')
- kind = self._job.artifact.source.morphology['kind']
+ job = self._current_job
+ kind = job.artifact.source.morphology['kind']
if kind == 'chunk':
- source_artifacts = self._job.artifact.source.artifacts
+ source_artifacts = job.artifact.source.artifacts
suffixes = ['%s.%s' % (kind, name) for name in source_artifacts]
suffixes.append('build-log')
else:
- filename = '%s.%s' % (kind, self._job.artifact.name)
+ filename = '%s.%s' % (kind, job.artifact.name)
suffixes = [filename]
if kind == 'stratum':
@@ -595,22 +617,22 @@ class WorkerConnection(distbuild.StateMachine):
'/1.0/fetch?host=%s:%d&cacheid=%s&artifacts=%s' %
(urllib.quote(worker_host),
self._worker_cache_server_port,
- urllib.quote(self._job.artifact.source.cache_key),
+ urllib.quote(job.artifact.source.cache_key),
suffixes))
msg = distbuild.message(
'http-request', id=self._request_ids.next(), url=url,
method='GET', body=None, headers=None)
- self._helper_id = msg['id']
+ self._current_job_cache_request = msg['id']
req = distbuild.HelperRequest(msg)
self.mainloop.queue_event(distbuild.HelperRouter, req)
- progress = WorkerBuildCaching(self._job.initiators,
- self._job.artifact.source.cache_key)
+ progress = WorkerBuildCaching(job.initiators,
+ job.artifact.source.cache_key)
self.mainloop.queue_event(WorkerConnection, progress)
def _maybe_handle_helper_result(self, event_source, event):
- if event.msg['id'] == self._helper_id:
+ if event.msg['id'] == self._current_job_cache_request:
distbuild.crash_point()
logging.debug('caching: event.msg: %s' % repr(event.msg))
@@ -618,8 +640,8 @@ class WorkerConnection(distbuild.StateMachine):
logging.debug('Shared artifact cache population done')
new_event = WorkerBuildFinished(
- self._exec_response_msg,
- self._job.artifact.source.cache_key)
+ self._current_job_exec_response,
+ self._current_job.artifact.source.cache_key)
self.mainloop.queue_event(WorkerConnection, new_event)
self.mainloop.queue_event(self, _Cached())
else:
@@ -634,13 +656,17 @@ class WorkerConnection(distbuild.StateMachine):
# The BuildController will not try to cancel jobs that have
# been marked as failed.
self.mainloop.queue_event(WorkerConnection,
- _JobFailed(self._job))
+ _JobFailed(self._current_job))
new_event = WorkerBuildFailed(
- self._exec_response_msg,
- self._job.artifact.source.cache_key)
+ self._current_job_exec_response,
+ self._current_job.artifact.source.cache_key)
self.mainloop.queue_event(WorkerConnection, new_event)
self.mainloop.queue_event(self, _BuildFailed())
- self.mainloop.queue_event(WorkerConnection, _JobFinished(self._job))
+ self.mainloop.queue_event(WorkerConnection,
+ _JobFinished(self._current_job))
+
+ self._current_job_exec_response = None
+ self._current_job_cache_request = None
diff --git a/morph b/morph
index 0c0789d5..0f98ab40 100755
--- a/morph
+++ b/morph
@@ -1,6 +1,6 @@
#!/usr/bin/python
#
-# Copyright (C) 2011-2012 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import morphlib
diff --git a/morph-cache-server b/morph-cache-server
index 4af3cee3..007cfbe8 100755
--- a/morph-cache-server
+++ b/morph-cache-server
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright (C) 2013, 2014 Codethink Limited
+# Copyright (C) 2013, 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import base64
diff --git a/morph.1.in b/morph.1.in
index 232ae396..970fbab1 100644
--- a/morph.1.in
+++ b/morph.1.in
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2012 Codethink Limited
+.\" 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
@@ -10,8 +10,7 @@
.\" 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, write to the Free Software Foundation, Inc.,
-.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+.\" with this program. If not, see <http://www.gnu.org/licenses/>.
.\"
.TH MORPH 1
.SH NAME
diff --git a/morphcacheserver/__init__.py b/morphcacheserver/__init__.py
index 2c25ce28..c646c1a9 100644
--- a/morphcacheserver/__init__.py
+++ b/morphcacheserver/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import repocache
diff --git a/morphcacheserver/repocache.py b/morphcacheserver/repocache.py
index 305c187c..d45cf86a 100644
--- a/morphcacheserver/repocache.py
+++ b/morphcacheserver/repocache.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013,2014 Codethink Limited
+# Copyright (C) 2013,2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/__init__.py b/morphlib/__init__.py
index d54340df..7c462aad 100644
--- a/morphlib/__init__.py
+++ b/morphlib/__init__.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Baserock library.'''
diff --git a/morphlib/app.py b/morphlib/app.py
index b8bae850..c8fe397d 100644
--- a/morphlib/app.py
+++ b/morphlib/app.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/artifact.py b/morphlib/artifact.py
index 7a40a81a..47b16823 100644
--- a/morphlib/artifact.py
+++ b/morphlib/artifact.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012, 2013, 2014 Codethink Limited
+# Copyright (C) 2012, 2013, 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
class Artifact(object):
diff --git a/morphlib/artifact_tests.py b/morphlib/artifact_tests.py
index abd8767e..106459c8 100644
--- a/morphlib/artifact_tests.py
+++ b/morphlib/artifact_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import copy
diff --git a/morphlib/artifactcachereference.py b/morphlib/artifactcachereference.py
index 8211f6b5..55a26b6d 100644
--- a/morphlib/artifactcachereference.py
+++ b/morphlib/artifactcachereference.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
class ArtifactCacheReference(object):
diff --git a/morphlib/artifactresolver.py b/morphlib/artifactresolver.py
index 5062f854..b49c1905 100644
--- a/morphlib/artifactresolver.py
+++ b/morphlib/artifactresolver.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/artifactresolver_tests.py b/morphlib/artifactresolver_tests.py
index b958da4f..141ff948 100644
--- a/morphlib/artifactresolver_tests.py
+++ b/morphlib/artifactresolver_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import itertools
diff --git a/morphlib/artifactsplitrule.py b/morphlib/artifactsplitrule.py
index 1511d694..b5ebdf83 100644
--- a/morphlib/artifactsplitrule.py
+++ b/morphlib/artifactsplitrule.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
diff --git a/morphlib/bins.py b/morphlib/bins.py
index 560e68bb..2e8ba0b3 100644
--- a/morphlib/bins.py
+++ b/morphlib/bins.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Functions for dealing with Baserock binaries.
@@ -75,7 +74,7 @@ if sys.version_info < (2, 7, 3): # pragma: no cover
else:
if sys.platform != "os2emx":
os.chown(targetpath, u, g)
- except EnvironmentError, e:
+ except EnvironmentError as e:
raise ExtractError("could not change owner")
tarfile.TarFile.chown = fixed_chown
@@ -187,7 +186,7 @@ def unpack_binary_from_file(f, dirname): # pragma: no cover
prepare_extract(tarinfo, targetpath)
try:
ret = real(tarinfo, targetpath)
- except (IOError, OSError), e:
+ except (IOError, OSError) as e:
if e.errno != errno.EEXIST:
if e.filename is None:
e.filename = targetpath
diff --git a/morphlib/bins_tests.py b/morphlib/bins_tests.py
index 60361ece..3895680f 100644
--- a/morphlib/bins_tests.py
+++ b/morphlib/bins_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import gzip
diff --git a/morphlib/branchmanager.py b/morphlib/branchmanager.py
index a33b4ccb..92a1f4be 100644
--- a/morphlib/branchmanager.py
+++ b/morphlib/branchmanager.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -92,7 +91,7 @@ class LocalRefManager(object):
op, args = d.pop()
try:
op(*args)
- except Exception, e:
+ except Exception as e:
exceptions.append((op, args, e))
if exceptions:
raise RefCleanupError(primary, exceptions)
@@ -201,7 +200,7 @@ class RemoteRefManager(object):
remote, refspecs = d.pop()
try:
remote.push(*refspecs)
- except Exception, e:
+ except Exception as e:
exceptions.append((remote, refspecs, e))
if exceptions:
raise RefCleanupError(primary, exceptions)
diff --git a/morphlib/branchmanager_tests.py b/morphlib/branchmanager_tests.py
index cf3be73c..9f3740d7 100644
--- a/morphlib/branchmanager_tests.py
+++ b/morphlib/branchmanager_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/buildbranch.py b/morphlib/buildbranch.py
index 2482bc9a..80cecd75 100644
--- a/morphlib/buildbranch.py
+++ b/morphlib/buildbranch.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
@@ -115,7 +114,7 @@ class BuildBranch(object):
for morphology in morphologies:
loader.unset_defaults(morphology)
sha1 = gd.store_blob(loader.save_to_string(morphology))
- yield 0100644, sha1, morphology.filename
+ yield 0o100644, sha1, morphology.filename
def inject_build_refs(self, loader, use_local_repos,
inject_cb=lambda **kwargs: None):
@@ -293,7 +292,7 @@ class BuildBranch(object):
func, args, kwargs = self._cleanup.pop()
try:
func(*args, **kwargs)
- except Exception, e:
+ except Exception as e:
exceptions.append(e)
if exceptions:
raise BuildBranchCleanupError(self, exceptions)
diff --git a/morphlib/buildcommand.py b/morphlib/buildcommand.py
index 8572450d..be8a1507 100644
--- a/morphlib/buildcommand.py
+++ b/morphlib/buildcommand.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import itertools
@@ -544,4 +543,12 @@ class InitiatorBuildCommand(BuildCommand):
self.MAX_RETRIES)
loop.add_state_machine(cm)
- loop.run()
+ try:
+ loop.run()
+ except KeyboardInterrupt:
+ # This will run if the user presses Ctrl+C or sends SIGINT during
+ # the build. It won't trigger on SIGTERM, SIGKILL or unhandled
+ # Python exceptions.
+ logging.info('Received KeyboardInterrupt, aborting.')
+ for initiator in loop.state_machines_of_type(distbuild.Initiator):
+ initiator.handle_cancel()
diff --git a/morphlib/buildenvironment.py b/morphlib/buildenvironment.py
index ef770f52..6ec82d45 100644
--- a/morphlib/buildenvironment.py
+++ b/morphlib/buildenvironment.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import copy
import cliapp
diff --git a/morphlib/buildenvironment_tests.py b/morphlib/buildenvironment_tests.py
index 7ae7c2d5..59a56aa2 100644
--- a/morphlib/buildenvironment_tests.py
+++ b/morphlib/buildenvironment_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import copy
diff --git a/morphlib/builder.py b/morphlib/builder.py
index 0bb21434..04ebd149 100644
--- a/morphlib/builder.py
+++ b/morphlib/builder.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import json
@@ -290,7 +289,7 @@ class ChunkBuilder(BuilderBase):
self.create_devices(destdir)
os.rename(temppath, logpath)
- except BaseException, e:
+ except BaseException as e:
logging.error('Caught exception: %s' % str(e))
logging.info('Cleaning up staging area')
self.staging_area.chroot_close()
@@ -376,7 +375,7 @@ class ChunkBuilder(BuilderBase):
if stdout:
stdout.flush()
- except cliapp.AppException, e:
+ except cliapp.AppException as e:
if not stdout:
with open(logfilepath, 'r') as log:
self.app.output.write("%s failed\n" % step)
@@ -406,7 +405,7 @@ class ChunkBuilder(BuilderBase):
with morphlib.savefile.SaveFile(script_path, 'w') as f:
f.write("#!/bin/sh\nset -xeu\n")
f.write(script)
- os.chmod(script_path, 0555)
+ os.chmod(script_path, 0o555)
rel_script_path = os.path.join(SYSTEM_INTEGRATION_PATH,
script_name)
@@ -624,7 +623,7 @@ class SystemBuilder(BuilderBase): # pragma: no cover
f.write('SUPPORT_URL="http://wiki.baserock.org/mailinglist"\n')
f.write('BUG_REPORT_URL="http://wiki.baserock.org/mailinglist"\n')
- os.chmod(os_release_file, 0644)
+ os.chmod(os_release_file, 0o644)
def run_system_integration_commands(self, rootdir): # pragma: no cover
''' Run the system integration commands '''
@@ -657,7 +656,7 @@ class SystemBuilder(BuilderBase): # pragma: no cover
msg = error_message_for_containerised_commandline(
argv, err, container_config)
raise cliapp.AppException(msg)
- except BaseException, e:
+ except BaseException as e:
self.app.status(
msg='Error while running system integration commands',
error=True)
diff --git a/morphlib/builder_tests.py b/morphlib/builder_tests.py
index 0cc90819..a571e3d0 100644
--- a/morphlib/builder_tests.py
+++ b/morphlib/builder_tests.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import json
diff --git a/morphlib/buildsystem.py b/morphlib/buildsystem.py
index fb99e70e..7ed50d11 100644
--- a/morphlib/buildsystem.py
+++ b/morphlib/buildsystem.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
diff --git a/morphlib/buildsystem_tests.py b/morphlib/buildsystem_tests.py
index 56ba64d7..80898ebd 100644
--- a/morphlib/buildsystem_tests.py
+++ b/morphlib/buildsystem_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
diff --git a/morphlib/cachedrepo.py b/morphlib/cachedrepo.py
index 8b38c5c9..23639043 100644
--- a/morphlib/cachedrepo.py
+++ b/morphlib/cachedrepo.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/cachedrepo_tests.py b/morphlib/cachedrepo_tests.py
index 6fe69ef5..404a0778 100644
--- a/morphlib/cachedrepo_tests.py
+++ b/morphlib/cachedrepo_tests.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/morphlib/cachekeycomputer.py b/morphlib/cachekeycomputer.py
index c3a01b9e..33eef082 100644
--- a/morphlib/cachekeycomputer.py
+++ b/morphlib/cachekeycomputer.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import hashlib
diff --git a/morphlib/cachekeycomputer_tests.py b/morphlib/cachekeycomputer_tests.py
index 57739983..d0a4657f 100644
--- a/morphlib/cachekeycomputer_tests.py
+++ b/morphlib/cachekeycomputer_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import copy
diff --git a/morphlib/extensions.py b/morphlib/extensions.py
index 051a54a7..aa0622b8 100644
--- a/morphlib/extensions.py
+++ b/morphlib/extensions.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import asyncore
import asynchat
@@ -149,7 +148,7 @@ class get_extension_filename():
fd, ext_filename = tempfile.mkstemp()
os.write(fd, ext_contents)
os.close(fd)
- os.chmod(ext_filename, 0700)
+ os.chmod(ext_filename, 0o700)
self.delete = True
self.ext_filename = ext_filename
diff --git a/morphlib/extractedtarball.py b/morphlib/extractedtarball.py
index fd98cd92..95c0582d 100644
--- a/morphlib/extractedtarball.py
+++ b/morphlib/extractedtarball.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -42,7 +41,7 @@ class ExtractedTarball(object): # pragma: no cover
self.tempdir = tempfile.mkdtemp(dir=self.app.settings['tempdir'])
try:
morphlib.bins.unpack_binary(self.tarball, self.tempdir)
- except BaseException, e:
+ except BaseException as e:
logging.error('Caught exception: %s' % str(e))
logging.debug('Removing temporary directory %s' % self.tempdir)
shutil.rmtree(self.tempdir)
@@ -54,7 +53,7 @@ class ExtractedTarball(object): # pragma: no cover
tarball=os.path.basename(self.tarball), chatty=True)
try:
shutil.rmtree(self.tempdir)
- except BaseException, e:
+ except BaseException as e:
logging.warning(
'Error when removing temporary directory %s: %s' %
(self.tempdir, str(e)))
diff --git a/morphlib/exts/add-config-files.configure b/morphlib/exts/add-config-files.configure
index 0094cf6b..2cf96fd1 100755
--- a/morphlib/exts/add-config-files.configure
+++ b/morphlib/exts/add-config-files.configure
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Copy all files located in $SRC_CONFIG_DIR to the image /etc.
diff --git a/morphlib/exts/fstab.configure b/morphlib/exts/fstab.configure
index a1287ea4..b9154eee 100755
--- a/morphlib/exts/fstab.configure
+++ b/morphlib/exts/fstab.configure
@@ -1,5 +1,6 @@
-#!/usr/bin/python
-# Copyright (C) 2013 Codethink Limited
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright © 2013-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
@@ -11,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
@@ -20,21 +20,9 @@
import os
import sys
+import morphlib
-def asciibetical(strings):
+envvars = {k: v for (k, v) in os.environ.iteritems() if k.startswith('FSTAB_')}
- def key(s):
- return [ord(c) for c in s]
-
- return sorted(strings, key=key)
-
-
-fstab_filename = os.path.join(sys.argv[1], 'etc', 'fstab')
-
-fstab_vars = asciibetical(x for x in os.environ if x.startswith('FSTAB_'))
-with open(fstab_filename, 'a') as f:
- for var in fstab_vars:
- f.write('%s\n' % os.environ[var])
-
-os.chown(fstab_filename, 0, 0)
-os.chmod(fstab_filename, 0644)
+conf_file = os.path.join(sys.argv[1], 'etc/fstab')
+morphlib.util.write_from_dict(conf_file, envvars)
diff --git a/morphlib/exts/hosts.configure b/morphlib/exts/hosts.configure
new file mode 100755
index 00000000..6b068d04
--- /dev/null
+++ b/morphlib/exts/hosts.configure
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright © 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, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# =*= License: GPL-2 =*=
+
+
+import os
+import sys
+import socket
+
+import morphlib
+
+def validate(var, line):
+ xs = line.split()
+ if len(xs) == 0:
+ raise morphlib.Error("`%s: %s': line is empty" % (var, line))
+
+ ip = xs[0]
+ hostnames = xs[1:]
+
+ if len(hostnames) == 0:
+ raise morphlib.Error("`%s: %s': missing hostname" % (var, line))
+
+ family = socket.AF_INET6 if ':' in ip else socket.AF_INET
+
+ try:
+ socket.inet_pton(family, ip)
+ except socket.error:
+ raise morphlib.Error("`%s: %s' invalid ip" % (var, ip))
+
+envvars = {k: v for (k, v) in os.environ.iteritems() if k.startswith('HOSTS_')}
+
+conf_file = os.path.join(sys.argv[1], 'etc/hosts')
+morphlib.util.write_from_dict(conf_file, envvars, validate)
diff --git a/morphlib/exts/initramfs.write b/morphlib/exts/initramfs.write
index f8af6d84..1059defa 100755
--- a/morphlib/exts/initramfs.write
+++ b/morphlib/exts/initramfs.write
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/exts/install-files.configure b/morphlib/exts/install-files.configure
index 04dc5f18..58cf373a 100755
--- a/morphlib/exts/install-files.configure
+++ b/morphlib/exts/install-files.configure
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
''' A Morph configuration extension for adding arbitrary files to a system
diff --git a/morphlib/exts/kvm.check b/morphlib/exts/kvm.check
index b8877a89..62d76453 100755
--- a/morphlib/exts/kvm.check
+++ b/morphlib/exts/kvm.check
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Preparatory checks for Morph 'kvm' write extension'''
diff --git a/morphlib/exts/kvm.write b/morphlib/exts/kvm.write
index 30b43d6c..0d0c095b 100755
--- a/morphlib/exts/kvm.write
+++ b/morphlib/exts/kvm.write
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''A Morph deployment write extension for deploying to KVM+libvirt.
diff --git a/morphlib/exts/nfsboot.check b/morphlib/exts/nfsboot.check
index 806e560a..e273f61c 100755
--- a/morphlib/exts/nfsboot.check
+++ b/morphlib/exts/nfsboot.check
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Preparatory checks for Morph 'nfsboot' write extension'''
diff --git a/morphlib/exts/nfsboot.configure b/morphlib/exts/nfsboot.configure
index 660d9c39..6a68dc48 100755
--- a/morphlib/exts/nfsboot.configure
+++ b/morphlib/exts/nfsboot.configure
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Remove all networking interfaces. On nfsboot systems, eth0 is set up
diff --git a/morphlib/exts/nfsboot.write b/morphlib/exts/nfsboot.write
index 49d71174..d928775e 100755
--- a/morphlib/exts/nfsboot.write
+++ b/morphlib/exts/nfsboot.write
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''A Morph deployment write extension for deploying to an nfsboot server
diff --git a/morphlib/exts/openstack.check b/morphlib/exts/openstack.check
index 3850d481..4c21b604 100755
--- a/morphlib/exts/openstack.check
+++ b/morphlib/exts/openstack.check
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Preparatory checks for Morph 'openstack' write extension'''
diff --git a/morphlib/exts/openstack.write b/morphlib/exts/openstack.write
index d29d2661..67e07c18 100755
--- a/morphlib/exts/openstack.write
+++ b/morphlib/exts/openstack.write
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2013 - 2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''A Morph deployment write extension for deploying to OpenStack.'''
diff --git a/morphlib/exts/rawdisk.check b/morphlib/exts/rawdisk.check
index 094adb72..9be0ce91 100755
--- a/morphlib/exts/rawdisk.check
+++ b/morphlib/exts/rawdisk.check
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Preparatory checks for Morph 'rawdisk' write extension'''
diff --git a/morphlib/exts/rawdisk.write b/morphlib/exts/rawdisk.write
index d91a4d5f..6f2d45ba 100755
--- a/morphlib/exts/rawdisk.write
+++ b/morphlib/exts/rawdisk.write
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''A Morph deployment write extension for raw disk images.'''
diff --git a/morphlib/exts/set-hostname.configure b/morphlib/exts/set-hostname.configure
index e44c5d56..4b2424d8 100755
--- a/morphlib/exts/set-hostname.configure
+++ b/morphlib/exts/set-hostname.configure
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Set hostname on system from HOSTNAME.
diff --git a/morphlib/exts/simple-network.configure b/morphlib/exts/simple-network.configure
index b98b202c..61113325 100755
--- a/morphlib/exts/simple-network.configure
+++ b/morphlib/exts/simple-network.configure
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -11,16 +11,17 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
-'''A Morph deployment configuration extension to handle /etc/network/interfaces
+'''A Morph deployment configuration extension to handle network configutation
-This extension prepares /etc/network/interfaces with the interfaces specified
-during deployment.
+This extension prepares /etc/network/interfaces and networkd .network files
+in /etc/systemd/network/ with the interfaces specified during deployment.
If no network configuration is provided, eth0 will be configured for DHCP
-with the hostname of the system.
+with the hostname of the system in the case of /etc/network/interfaces.
+In the case of networkd, any interface starting by e* will be configured
+for DHCP
'''
@@ -37,20 +38,74 @@ class SimpleNetworkError(morphlib.Error):
class SimpleNetworkConfigurationExtension(cliapp.Application):
- '''Configure /etc/network/interfaces
+ '''Configure /etc/network/interfaces and generate networkd .network files
- Reading NETWORK_CONFIG, this extension sets up /etc/network/interfaces.
+ Reading NETWORK_CONFIG, this extension sets up /etc/network/interfaces
+ and .network files in /etc/systemd/network/.
'''
def process_args(self, args):
- network_config = os.environ.get(
- "NETWORK_CONFIG", "lo:loopback;eth0:dhcp,hostname=$(hostname)")
+ network_config = os.environ.get("NETWORK_CONFIG")
- self.status(msg="Processing NETWORK_CONFIG=%(nc)s", nc=network_config)
+ self.rename_networkd_chunk_file(args)
- stanzas = self.parse_network_stanzas(network_config)
- iface_file = self.generate_iface_file(stanzas)
+ if network_config is None:
+ self.generate_default_network_config(args)
+ else:
+ self.status(msg="Processing NETWORK_CONFIG=%(nc)s",
+ nc=network_config)
+
+ stanzas = self.parse_network_stanzas(network_config)
+
+ self.generate_interfaces_file(args, stanzas)
+ self.generate_networkd_files(args, stanzas)
+
+ def rename_networkd_chunk_file(self, args):
+ """Rename the 10-dchp.network file generated in the systemd chunk
+ The systemd chunk will place something in 10-dhcp.network, which will
+ have higher precedence than anything added in this extension (we
+ start at 50-*).
+
+ We should check for that file and rename it instead remove it in
+ case the file is being used by the user.
+
+ Until both the following happen, we should continue to rename that
+ default config file:
+
+ 1. simple-network.configure is always run when systemd is included
+ 2. We've been building systems without systemd including that default
+ networkd config for long enough that nobody should be including
+ that config file.
+ """
+ file_path = os.path.join(args[0], "etc", "systemd", "network",
+ "10-dhcp.network")
+ try:
+ os.rename(file_path, file_path + ".morph")
+ self.status(msg="Renaming networkd file from systemd chunk: %(f)s \
+ to %(f)s.morph", f=file_path)
+ except OSError:
+ pass
+
+ def generate_default_network_config(self, args):
+ """Generate default network config: DHCP in all the interfaces"""
+
+ default_network_config_interfaces = "lo:loopback;" \
+ "eth0:dhcp,hostname=$(hostname)"
+ default_network_config_networkd = "e*:dhcp"
+
+ stanzas_interfaces = self.parse_network_stanzas(
+ default_network_config_interfaces)
+ stanzas_networkd = self.parse_network_stanzas(
+ default_network_config_networkd)
+
+ self.generate_interfaces_file(args, stanzas_interfaces)
+ self.generate_networkd_files(args, stanzas_networkd)
+
+ def generate_interfaces_file(self, args, stanzas):
+ """Generate /etc/network/interfaces file"""
+
+ iface_file = self.generate_iface_file(stanzas)
with open(os.path.join(args[0], "etc/network/interfaces"), "w") as f:
f.write(iface_file)
@@ -83,6 +138,74 @@ class SimpleNetworkConfigurationExtension(cliapp.Application):
lines += [""]
return "\n".join(lines)
+ def generate_networkd_files(self, args, stanzas):
+ """Generate .network files"""
+
+ for i, stanza in enumerate(stanzas, 50):
+ iface_file = self.generate_networkd_file(stanza)
+
+ if iface_file is None:
+ continue
+
+ path = os.path.join(args[0], "etc", "systemd", "network",
+ "%s-%s.network" % (i, stanza['name']))
+
+ with open(path, "w") as f:
+ f.write(iface_file)
+
+ def generate_networkd_file(self, stanza):
+ """Generate an .network file from the provided data."""
+
+ name = stanza['name']
+ itype = stanza['type']
+ pairs = stanza['args'].items()
+
+ if itype == "loopback":
+ return
+
+ lines = ["[Match]"]
+ lines += ["Name=%s\n" % name]
+ lines += ["[Network]"]
+ if itype == "dhcp":
+ lines += ["DHCP=yes"]
+ else:
+ lines += self.generate_networkd_entries(pairs)
+
+ return "\n".join(lines)
+
+ def generate_networkd_entries(self, pairs):
+ """Generate networkd configuration entries with the other parameters"""
+
+ address = None
+ netmask = None
+ gateway = None
+ lines = []
+ for pair in pairs:
+ if pair[0] == 'address':
+ address = pair[1]
+ elif pair[0] == 'netmask':
+ netmask = pair[1]
+ elif pair[0] == 'gateway':
+ gateway = pair[1]
+
+ if address and netmask:
+ network_suffix = self.convert_net_mask_to_cidr_suffix (netmask);
+ address_line = address + '/' + str(network_suffix)
+ lines += ["Address=%s" % address_line]
+ elif address or netmask:
+ raise Exception('address and netmask must be specified together')
+
+ if gateway is not None:
+ lines += ["Gateway=%s" % gateway]
+
+ return lines
+
+ def convert_net_mask_to_cidr_suffix(self, mask):
+ """Convert dotted decimal form of a subnet mask to CIDR suffix notation
+
+ For example: 255.255.255.0 -> 24
+ """
+ return sum(bin(int(x)).count('1') for x in mask.split('.'))
def parse_network_stanzas(self, config):
"""Parse a network config environment variable into stanzas.
diff --git a/morphlib/exts/ssh-rsync.check b/morphlib/exts/ssh-rsync.check
index 11446c28..c3bdfd29 100755
--- a/morphlib/exts/ssh-rsync.check
+++ b/morphlib/exts/ssh-rsync.check
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Preparatory checks for Morph 'ssh-rsync' write extension'''
diff --git a/morphlib/exts/ssh-rsync.write b/morphlib/exts/ssh-rsync.write
index c4577026..6d596500 100755
--- a/morphlib/exts/ssh-rsync.write
+++ b/morphlib/exts/ssh-rsync.write
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''A Morph deployment write extension for upgrading systems over ssh.'''
diff --git a/morphlib/exts/sysroot.check b/morphlib/exts/sysroot.check
index bfacd3fc..8ed965bd 100755
--- a/morphlib/exts/sysroot.check
+++ b/morphlib/exts/sysroot.check
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Preparatory checks for Morph 'sysroot' write extension
diff --git a/morphlib/exts/sysroot.write b/morphlib/exts/sysroot.write
index be315365..0ad8d630 100755
--- a/morphlib/exts/sysroot.write
+++ b/morphlib/exts/sysroot.write
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# A Morph write extension to deploy to another directory
diff --git a/morphlib/exts/tar.check b/morphlib/exts/tar.check
index cbeaf163..f2304d46 100755
--- a/morphlib/exts/tar.check
+++ b/morphlib/exts/tar.check
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Preparatory checks for Morph 'tar' write extension
diff --git a/morphlib/exts/tar.write b/morphlib/exts/tar.write
index 333626b5..01b545b4 100755
--- a/morphlib/exts/tar.write
+++ b/morphlib/exts/tar.write
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# A Morph write extension to deploy to a .tar file
diff --git a/morphlib/exts/vdaboot.configure b/morphlib/exts/vdaboot.configure
index b88eb3a8..60de925b 100755
--- a/morphlib/exts/vdaboot.configure
+++ b/morphlib/exts/vdaboot.configure
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Change the "/" mount point to /dev/vda to use virtio disks.
diff --git a/morphlib/exts/virtualbox-ssh.check b/morphlib/exts/virtualbox-ssh.check
index 57d54db1..a97f3294 100755
--- a/morphlib/exts/virtualbox-ssh.check
+++ b/morphlib/exts/virtualbox-ssh.check
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Preparatory checks for Morph 'virtualbox-ssh' write extension'''
diff --git a/morphlib/exts/virtualbox-ssh.write b/morphlib/exts/virtualbox-ssh.write
index 7eafcff3..774f2b4f 100755
--- a/morphlib/exts/virtualbox-ssh.write
+++ b/morphlib/exts/virtualbox-ssh.write
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''A Morph deployment write extension for deploying to VirtualBox via ssh.
diff --git a/morphlib/fsutils.py b/morphlib/fsutils.py
index 8a4128d9..a3b73bf6 100644
--- a/morphlib/fsutils.py
+++ b/morphlib/fsutils.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import re
diff --git a/morphlib/fsutils_tests.py b/morphlib/fsutils_tests.py
index 47a4488e..f2772fb7 100644
--- a/morphlib/fsutils_tests.py
+++ b/morphlib/fsutils_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013, 2014 Codethink Limited
+# Copyright (C) 2013, 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
diff --git a/morphlib/git.py b/morphlib/git.py
index 456aa4c0..acda6137 100644
--- a/morphlib/git.py
+++ b/morphlib/git.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -191,7 +190,7 @@ def get_user_name(runcmd):
try:
config = check_config_set(runcmd, keys={"user.name": "My Name"})
return config['user.name']
- except ConfigNotSetException, e:
+ except ConfigNotSetException as e:
raise IdentityNotSetException(e.missing)
@@ -202,7 +201,7 @@ def get_user_email(runcmd):
try:
cfg = check_config_set(runcmd, keys={"user.email": "me@example.com"})
return cfg['user.email']
- except ConfigNotSetException, e:
+ except ConfigNotSetException as e:
raise IdentityNotSetException(e.missing)
def check_config_set(runcmd, keys, cwd='.'):
diff --git a/morphlib/gitdir.py b/morphlib/gitdir.py
index 391db91f..03640a22 100644
--- a/morphlib/gitdir.py
+++ b/morphlib/gitdir.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
@@ -707,7 +706,7 @@ class GitDirectory(object):
# this ensures it will fail if the branch already exists
try:
return self._update_ref((ref, sha1, '0' * 40), message)
- except Exception, e:
+ except Exception as e:
raise RefAddError(self, ref, sha1, e)
def update_ref(self, ref, sha1, old_sha1, message=None):
@@ -727,7 +726,7 @@ class GitDirectory(object):
self._check_is_sha1(old_sha1)
try:
return self._update_ref((ref, sha1, old_sha1), message)
- except Exception, e:
+ except Exception as e:
raise RefUpdateError(self, ref, old_sha1, sha1, e)
def delete_ref(self, ref, old_sha1, message=None):
@@ -745,7 +744,7 @@ class GitDirectory(object):
self._check_is_sha1(old_sha1)
try:
return self._update_ref(('-d', ref, old_sha1), message)
- except Exception, e:
+ except Exception as e:
raise RefDeleteError(self, ref, old_sha1, e)
def describe(self):
diff --git a/morphlib/gitdir_tests.py b/morphlib/gitdir_tests.py
index 50de18d7..a6e1921d 100644
--- a/morphlib/gitdir_tests.py
+++ b/morphlib/gitdir_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/gitindex.py b/morphlib/gitindex.py
index c5c07bd6..00098fbf 100644
--- a/morphlib/gitindex.py
+++ b/morphlib/gitindex.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/gitindex_tests.py b/morphlib/gitindex_tests.py
index 3f9ff303..a3196764 100644
--- a/morphlib/gitindex_tests.py
+++ b/morphlib/gitindex_tests.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/gitversion.py b/morphlib/gitversion.py
index c593c330..7b4459a4 100644
--- a/morphlib/gitversion.py
+++ b/morphlib/gitversion.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 - 2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Version information retrieved either from the package data, or the
@@ -34,7 +33,7 @@ try:
commit = pkgutil.get_data('morphlib', 'commit')
tree = pkgutil.get_data('morphlib', 'tree')
ref = pkgutil.get_data('morphlib', 'ref')
-except IOError, e:
+except IOError as e:
from os.path import dirname
def run_git(*args):
command = ['git'] + list(args)
diff --git a/morphlib/localartifactcache.py b/morphlib/localartifactcache.py
index 955ee97f..e6695c4e 100644
--- a/morphlib/localartifactcache.py
+++ b/morphlib/localartifactcache.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012, 2013, 2014 Codethink Limited
+# Copyright (C) 2012, 2013, 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
diff --git a/morphlib/localartifactcache_tests.py b/morphlib/localartifactcache_tests.py
index 4325cfbe..9483f9f6 100644
--- a/morphlib/localartifactcache_tests.py
+++ b/morphlib/localartifactcache_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/morphlib/localrepocache.py b/morphlib/localrepocache.py
index 1565b913..4fc3916a 100644
--- a/morphlib/localrepocache.py
+++ b/morphlib/localrepocache.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
@@ -173,7 +172,7 @@ class LocalRepoCache(object):
self._git(['config', 'remote.origin.mirror', 'true'], cwd=path)
self._git(['config', 'remote.origin.fetch', '+refs/*:refs/*'],
cwd=path)
- except BaseException, e: # pragma: no cover
+ except BaseException as e: # pragma: no cover
if self.fs.exists(path):
self.fs.removedir(path, force=True)
return False, 'Unable to extract tarball %s: %s' % (
@@ -193,7 +192,7 @@ class LocalRepoCache(object):
try:
return self.get_repo(reponame)
- except NotCached, e:
+ except NotCached as e:
pass
repourl = self._resolver.pull_url(reponame)
@@ -214,7 +213,7 @@ class LocalRepoCache(object):
try:
self._git(['clone', '--mirror', '-n', repourl, target],
echo_stderr=self._app.settings['verbose'])
- except cliapp.AppException, e:
+ except cliapp.AppException as e:
errors.append('Unable to clone from %s to %s: %s' %
(repourl, target, e))
if self.fs.exists(target):
diff --git a/morphlib/localrepocache_tests.py b/morphlib/localrepocache_tests.py
index aeb32961..aeef18f1 100644
--- a/morphlib/localrepocache_tests.py
+++ b/morphlib/localrepocache_tests.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/morphlib/morphloader.py b/morphlib/morphloader.py
index 7d51dc1e..47cb03d7 100644
--- a/morphlib/morphloader.py
+++ b/morphlib/morphloader.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphloader_tests.py b/morphlib/morphloader_tests.py
index a1fe1674..f9fa2a34 100644
--- a/morphlib/morphloader_tests.py
+++ b/morphlib/morphloader_tests.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphology.py b/morphlib/morphology.py
index 009ed044..53a8ff39 100644
--- a/morphlib/morphology.py
+++ b/morphlib/morphology.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphology_tests.py b/morphlib/morphology_tests.py
index 385f62ee..d3d99f15 100644
--- a/morphlib/morphology_tests.py
+++ b/morphlib/morphology_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphologyfinder.py b/morphlib/morphologyfinder.py
index 87c0de1a..708c86a9 100644
--- a/morphlib/morphologyfinder.py
+++ b/morphlib/morphologyfinder.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphologyfinder_tests.py b/morphlib/morphologyfinder_tests.py
index 67161f9b..a83f89a5 100644
--- a/morphlib/morphologyfinder_tests.py
+++ b/morphlib/morphologyfinder_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphset.py b/morphlib/morphset.py
index bf061f94..a4cb5dae 100644
--- a/morphlib/morphset.py
+++ b/morphlib/morphset.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/morphset_tests.py b/morphlib/morphset_tests.py
index 81b5810f..bf726d4c 100644
--- a/morphlib/morphset_tests.py
+++ b/morphlib/morphset_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013, 2014 Codethink Limited
+# Copyright (C) 2013, 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/mountableimage.py b/morphlib/mountableimage.py
index f767228a..dcc496e7 100644
--- a/morphlib/mountableimage.py
+++ b/morphlib/mountableimage.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -46,7 +45,7 @@ class MountableImage(object): # pragma: no cover
infh = gzip.open(path, "rb")
morphlib.util.copyfileobj(infh, outfh)
infh.close()
- except BaseException, e:
+ except BaseException as e:
logging.error('Caught exception: %s' % str(e))
logging.info('Removing temporary file %s' % self.temp_path)
os.unlink(self.temp_path)
@@ -65,17 +64,17 @@ class MountableImage(object): # pragma: no cover
chatty=True)
try:
morphlib.fsutils.unmount(self.app.runcmd, mount_point)
- except BaseException, e:
+ except BaseException as e:
logging.info('Ignoring error when unmounting: %s' % str(e))
try:
morphlib.fsutils.undo_device_mapping(self.app.runcmd, path)
- except BaseException, e:
+ except BaseException as e:
logging.info(
'Ignoring error when undoing device mapping: %s' % str(e))
try:
os.rmdir(mount_point)
os.unlink(path)
- except BaseException, e:
+ except BaseException as e:
logging.info(
'Ignoring error when removing temporary files: %s' % str(e))
diff --git a/morphlib/plugins/add_binary_plugin.py b/morphlib/plugins/add_binary_plugin.py
index dee1d9c4..45edae4c 100644
--- a/morphlib/plugins/add_binary_plugin.py
+++ b/morphlib/plugins/add_binary_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/artifact_inspection_plugin.py b/morphlib/plugins/artifact_inspection_plugin.py
index 2d1fe979..b16f393c 100644
--- a/morphlib/plugins/artifact_inspection_plugin.py
+++ b/morphlib/plugins/artifact_inspection_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -163,7 +162,7 @@ class VersionGuesser(object):
version = guesser.guess_version(repo, ref, tree)
if version:
break
- except cliapp.AppException, err:
+ except cliapp.AppException as err:
self.app.status(msg='%(repo)s: Failed to list files in %(ref)s',
repo=repo, ref=ref, chatty=True)
return version
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index 76da9736..08589ea6 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012,2013,2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/build_plugin.py b/morphlib/plugins/build_plugin.py
index e9290b8d..2cc395fc 100644
--- a/morphlib/plugins/build_plugin.py
+++ b/morphlib/plugins/build_plugin.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/cross-bootstrap_plugin.py b/morphlib/plugins/cross-bootstrap_plugin.py
index 2b5c8911..79609cb5 100644
--- a/morphlib/plugins/cross-bootstrap_plugin.py
+++ b/morphlib/plugins/cross-bootstrap_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
import logging
@@ -66,7 +65,7 @@ class BootstrapSystemBuilder(morphlib.builder.BuilderBase):
self.unpack_sources(fs_root)
self.write_build_script(fs_root)
self.create_tarball(handle, fs_root, system_name)
- except BaseException, e:
+ except BaseException as e:
logging.error(traceback.format_exc())
self.app.status(msg='Error while building bootstrap image',
error=True)
@@ -85,7 +84,7 @@ class BootstrapSystemBuilder(morphlib.builder.BuilderBase):
with cache.get(chunk_artifact) as chunk_file:
try:
morphlib.bins.unpack_binary_from_file(chunk_file, dest)
- except BaseException, e:
+ except BaseException as e:
self.app.status(
msg='Error unpacking binary chunk %(name)s',
name=chunk_artifact.name,
@@ -111,7 +110,7 @@ class BootstrapSystemBuilder(morphlib.builder.BuilderBase):
chunk_script = os.path.join(path, 'src', 'build-%s' % name)
with morphlib.savefile.SaveFile(chunk_script, 'w') as f:
self.write_chunk_build_script(s, f)
- os.chmod(chunk_script, 0777)
+ os.chmod(chunk_script, 0o777)
def write_build_script(self, path):
'''Output a script to run build on the bootstrap target'''
@@ -136,7 +135,7 @@ class BootstrapSystemBuilder(morphlib.builder.BuilderBase):
f.write('if [ -e /sbin/ldconfig ]; then /sbin/ldconfig; fi\n')
f.write(driver_footer)
- os.chmod(driver_script, 0777)
+ os.chmod(driver_script, 0o777)
def write_chunk_build_script(self, source, f):
m = source.morphology
diff --git a/morphlib/plugins/deploy_plugin.py b/morphlib/plugins/deploy_plugin.py
index 6d506a21..7635a7b4 100644
--- a/morphlib/plugins/deploy_plugin.py
+++ b/morphlib/plugins/deploy_plugin.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import json
diff --git a/morphlib/plugins/distbuild_plugin.py b/morphlib/plugins/distbuild_plugin.py
index a7d69472..ac3957f3 100644
--- a/morphlib/plugins/distbuild_plugin.py
+++ b/morphlib/plugins/distbuild_plugin.py
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA..
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -180,7 +179,6 @@ class ControllerDaemon(cliapp.Plugin):
self.app.settings.string(
['initiator-step-output-dir'],
'write build output to files in DIR',
- default='.',
group=group_distbuild)
self.app.settings.string(
diff --git a/morphlib/plugins/expand_repo_plugin.py b/morphlib/plugins/expand_repo_plugin.py
index 721287ca..bbee891d 100644
--- a/morphlib/plugins/expand_repo_plugin.py
+++ b/morphlib/plugins/expand_repo_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/gc_plugin.py b/morphlib/plugins/gc_plugin.py
index 68f386eb..71522b04 100644
--- a/morphlib/plugins/gc_plugin.py
+++ b/morphlib/plugins/gc_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/morphlib/plugins/graphing_plugin.py b/morphlib/plugins/graphing_plugin.py
index 57166e51..0db63ffc 100644
--- a/morphlib/plugins/graphing_plugin.py
+++ b/morphlib/plugins/graphing_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012, 2013 Codethink Limited
+# Copyright (C) 2012, 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/list_artifacts_plugin.py b/morphlib/plugins/list_artifacts_plugin.py
index 53056bad..b7a5e080 100644
--- a/morphlib/plugins/list_artifacts_plugin.py
+++ b/morphlib/plugins/list_artifacts_plugin.py
@@ -10,13 +10,13 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# This plugin is used as part of the Baserock automated release process.
#
# See: <http://wiki.baserock.org/guides/release-process> for more information.
+from __future__ import print_function
import cliapp
import morphlib
@@ -68,7 +68,7 @@ class ListArtifactsPlugin(cliapp.Plugin):
artifact_files.update(system_artifact_files)
for artifact_file in sorted(artifact_files):
- print artifact_file
+ print(artifact_file)
def list_artifacts_for_system(self, repo, ref, system_filename):
'''List all artifact files in the build graph of a single system.'''
diff --git a/morphlib/plugins/print_architecture_plugin.py b/morphlib/plugins/print_architecture_plugin.py
index 08f500d0..264334d9 100644
--- a/morphlib/plugins/print_architecture_plugin.py
+++ b/morphlib/plugins/print_architecture_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/push_pull_plugin.py b/morphlib/plugins/push_pull_plugin.py
index ddc9a8af..8546e2bf 100644
--- a/morphlib/plugins/push_pull_plugin.py
+++ b/morphlib/plugins/push_pull_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
import logging
diff --git a/morphlib/plugins/show_dependencies_plugin.py b/morphlib/plugins/show_dependencies_plugin.py
index e70f6bfb..ee96cb40 100644
--- a/morphlib/plugins/show_dependencies_plugin.py
+++ b/morphlib/plugins/show_dependencies_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/plugins/trovectl_plugin.py b/morphlib/plugins/trovectl_plugin.py
index 80f3b4cf..ea780b65 100644
--- a/morphlib/plugins/trovectl_plugin.py
+++ b/morphlib/plugins/trovectl_plugin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/recv-hole b/morphlib/recv-hole
index d6504bf6..fe69f304 100755
--- a/morphlib/recv-hole
+++ b/morphlib/recv-hole
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/remoteartifactcache.py b/morphlib/remoteartifactcache.py
index 4e09ce34..427e4cbb 100644
--- a/morphlib/remoteartifactcache.py
+++ b/morphlib/remoteartifactcache.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -72,14 +71,14 @@ class RemoteArtifactCache(object):
def get(self, artifact, log=logging.error):
try:
return self._get_file(artifact.basename())
- except urllib2.URLError, e:
+ except urllib2.URLError as e:
log(str(e))
raise GetError(self, artifact)
def get_artifact_metadata(self, artifact, name, log=logging.error):
try:
return self._get_file(artifact.metadata_basename(name))
- except urllib2.URLError, e:
+ except urllib2.URLError as e:
log(str(e))
raise GetArtifactMetadataError(self, artifact, name)
diff --git a/morphlib/remoteartifactcache_tests.py b/morphlib/remoteartifactcache_tests.py
index 788882c2..18bef13f 100644
--- a/morphlib/remoteartifactcache_tests.py
+++ b/morphlib/remoteartifactcache_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import StringIO
diff --git a/morphlib/remoterepocache.py b/morphlib/remoterepocache.py
index 004ba86e..4a6d9fe9 100644
--- a/morphlib/remoterepocache.py
+++ b/morphlib/remoterepocache.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -55,7 +54,7 @@ class RemoteRepoCache(object):
repo_url = self._resolver.pull_url(repo_name)
try:
return self._resolve_ref_for_repo_url(repo_url, ref)
- except BaseException, e:
+ except BaseException as e:
logging.error('Caught exception: %s' % str(e))
raise ResolveRefError(repo_name, ref)
@@ -74,7 +73,7 @@ class RemoteRepoCache(object):
try:
info = json.loads(self._ls_tree_for_repo_url(repo_url, ref))
return info['tree'].keys()
- except BaseException, e:
+ except BaseException as e:
logging.error('Caught exception: %s' % str(e))
raise LsTreeError(repo_name, ref)
diff --git a/morphlib/remoterepocache_tests.py b/morphlib/remoterepocache_tests.py
index ef81506f..966e74d5 100644
--- a/morphlib/remoterepocache_tests.py
+++ b/morphlib/remoterepocache_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import json
diff --git a/morphlib/repoaliasresolver.py b/morphlib/repoaliasresolver.py
index bc759dd4..de57628c 100644
--- a/morphlib/repoaliasresolver.py
+++ b/morphlib/repoaliasresolver.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/morphlib/repoaliasresolver_tests.py b/morphlib/repoaliasresolver_tests.py
index c4ea16b0..a10c4017 100644
--- a/morphlib/repoaliasresolver_tests.py
+++ b/morphlib/repoaliasresolver_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import morphlib
diff --git a/morphlib/savefile.py b/morphlib/savefile.py
index 2d87a54f..7deb2b89 100644
--- a/morphlib/savefile.py
+++ b/morphlib/savefile.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
diff --git a/morphlib/savefile_tests.py b/morphlib/savefile_tests.py
index 7ae2360d..dc11086c 100644
--- a/morphlib/savefile_tests.py
+++ b/morphlib/savefile_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
diff --git a/morphlib/source.py b/morphlib/source.py
index 4ad54ed9..2c96bcbd 100644
--- a/morphlib/source.py
+++ b/morphlib/source.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import morphlib
diff --git a/morphlib/source_tests.py b/morphlib/source_tests.py
index 695041d3..4f6006e9 100644
--- a/morphlib/source_tests.py
+++ b/morphlib/source_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/morphlib/sourcepool.py b/morphlib/sourcepool.py
index 6dfcb2c3..b340a9de 100644
--- a/morphlib/sourcepool.py
+++ b/morphlib/sourcepool.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
diff --git a/morphlib/sourcepool_tests.py b/morphlib/sourcepool_tests.py
index f3740049..85833901 100644
--- a/morphlib/sourcepool_tests.py
+++ b/morphlib/sourcepool_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/morphlib/sourceresolver.py b/morphlib/sourceresolver.py
index 387d2e0d..1e64c23a 100644
--- a/morphlib/sourceresolver.py
+++ b/morphlib/sourceresolver.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
@@ -32,7 +31,7 @@ tree_cache_filename = 'trees.cache.pickle'
buildsystem_cache_size = 10000
buildsystem_cache_filename = 'detected-chunk-buildsystems.cache.pickle'
-not_supported_versions = []
+supported_versions = [0, 1]
class PickleCacheManager(object): # pragma: no cover
'''Cache manager for PyLRU that reads and writes to Pickle files.
@@ -185,6 +184,8 @@ class SourceResolver(object):
reponame, ref)
return ref, self._resolved_trees[(reponame, ref)]
+ logging.debug('tree (%s, %s) not in cache', reponame, ref)
+
absref = None
if self.lrc.has_repo(reponame):
repo = self.lrc.get_repo(reponame)
@@ -205,7 +206,7 @@ class SourceResolver(object):
reponame=reponame,
ref=ref,
chatty=True)
- except BaseException, e:
+ except BaseException as e:
logging.warning('Caught (and ignored) exception: %s' % str(e))
if absref is None:
@@ -345,6 +346,29 @@ class SourceResolver(object):
loader.set_defaults(morph)
return morph
+ def _parse_version_file(self, version_file): # pragma : no cover
+ '''Parse VERSION file and return the version of the format if:
+
+ VERSION is a YAML file
+ and it's a dict
+ and has the key 'version'
+ and the type stored in the 'version' key is an int
+ and that int is not in the supported format
+
+ otherwise returns None
+
+ '''
+ version = None
+
+ yaml_obj = yaml.safe_load(version_file)
+ if yaml_obj is not None:
+ if type(yaml_obj) is dict:
+ if 'version' in yaml_obj.keys():
+ if type(yaml_obj['version']) is int:
+ version = yaml_obj['version']
+
+ return version
+
def _check_version_file(self,definitions_repo,
definitions_absref): # pragma: no cover
version_file = self._get_file_contents(
@@ -353,13 +377,10 @@ class SourceResolver(object):
if version_file is None:
return
- try:
- version = yaml.safe_load(version_file)['version']
- except (yaml.error.YAMLError, KeyError, TypeError):
- version = 0
-
- if version in not_supported_versions:
- raise UnknownVersionError(version)
+ version = self._parse_version_file(version_file)
+ if version is not None:
+ if version not in supported_versions:
+ raise UnknownVersionError(version)
def _process_definitions_with_children(self, system_filenames,
definitions_repo,
@@ -415,42 +436,77 @@ class SourceResolver(object):
return chunk_queue
+ def _generate_morph_and_cache_buildsystem(self,
+ definition_key, chunk_key,
+ buildsystem,
+ morph_name): # pragma: no cover
+ logging.debug('Caching build system for chunk with key %s', chunk_key)
+
+ self._resolved_buildsystems[chunk_key] = buildsystem
+
+ morphology = self._create_morphology_for_build_system(buildsystem,
+ morph_name)
+ self._resolved_morphologies[definition_key] = morphology
+ return morphology
+
def process_chunk(self, definition_repo, definition_ref, chunk_repo,
chunk_ref, filename, visit): # pragma: no cover
absref = None
tree = None
-
- definition_key = (definition_repo, definition_ref, filename)
chunk_key = None
+ buildsystem = None
morph_name = os.path.splitext(os.path.basename(filename))[0]
+ # Get morphology from definitions repo
+ definition_key = (definition_repo, definition_ref, filename)
morphology = self._get_morphology(*definition_key)
- buildsystem = None
+
+ if morphology:
+ absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
+ visit(chunk_repo, chunk_ref, filename, absref, tree, morphology)
+ return
+
+ absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
+ chunk_key = (chunk_repo, absref, filename)
if chunk_key in self._resolved_buildsystems:
+ logging.debug('Build system for %s is cached', str(chunk_key))
+ self.status(msg='Build system for %(chunk)s is cached',
+ chunk=str(chunk_key),
+ chatty=True)
buildsystem = self._resolved_buildsystems[chunk_key]
- if morphology is None and buildsystem is None:
- # This is a slow operation (looking for a file in Git repo may
- # potentially require cloning the whole thing).
- absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
- chunk_key = (chunk_repo, absref, filename)
+ # If the build system for this chunk is cached then:
+ # * the chunk does not have a chunk morph
+ # (so we don't need to look for one)
+ #
+ # * a suitable (generated) morphology may already be cached.
+ #
+ # If the morphology is not already cached we can generate it
+ # from the build-system and cache it.
+ if definition_key in self._resolved_morphologies:
+ morphology = self._resolved_morphologies[definition_key]
+ else:
+ morphology = self._generate_morph_and_cache_buildsystem(
+ definition_key, chunk_key, buildsystem, morph_name)
+ else:
+ logging.debug('Build system for %s is NOT cached', str(chunk_key))
+ # build-system not cached, look for morphology in chunk repo
+ # this can be slow (we may need to clone the repo from a remote)
morphology = self._get_morphology(*chunk_key)
- if morphology is None:
- if buildsystem is None:
- buildsystem = self._detect_build_system(*chunk_key)
- if buildsystem is None:
- raise MorphologyNotFoundError(filename)
- else:
- self._resolved_buildsystems[chunk_key] = buildsystem
- morphology = self._create_morphology_for_build_system(
- buildsystem, morph_name)
+ if morphology != None:
self._resolved_morphologies[definition_key] = morphology
+ else:
+ # This chunk doesn't have a chunk morph
+ buildsystem = self._detect_build_system(*chunk_key)
- if not absref or not tree:
- absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
+ if buildsystem is None:
+ raise MorphologyNotFoundError(filename)
+ else:
+ morphology = self._generate_morph_and_cache_buildsystem(
+ definition_key, chunk_key, buildsystem, morph_name)
visit(chunk_repo, chunk_ref, filename, absref, tree, morphology)
diff --git a/morphlib/sourceresolver_tests.py b/morphlib/sourceresolver_tests.py
index 1239b437..298dae5d 100644
--- a/morphlib/sourceresolver_tests.py
+++ b/morphlib/sourceresolver_tests.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
diff --git a/morphlib/stagingarea.py b/morphlib/stagingarea.py
index fd3f6881..8c2781aa 100644
--- a/morphlib/stagingarea.py
+++ b/morphlib/stagingarea.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
@@ -166,7 +165,7 @@ class StagingArea(object):
try:
morphlib.bins.unpack_binary_from_file(
handle, savedir + '/')
- except BaseException, e: # pragma: no cover
+ except BaseException as e: # pragma: no cover
shutil.rmtree(savedir)
raise
# TODO: This rename is not concurrency safe if two builds are
diff --git a/morphlib/stagingarea_tests.py b/morphlib/stagingarea_tests.py
index dc43e4f6..97d78236 100644
--- a/morphlib/stagingarea_tests.py
+++ b/morphlib/stagingarea_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/morphlib/stopwatch.py b/morphlib/stopwatch.py
index 29e584bd..bb01d06f 100644
--- a/morphlib/stopwatch.py
+++ b/morphlib/stopwatch.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2012 Codethink Limited
+# Copyright (C) 2011-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import operator
diff --git a/morphlib/stopwatch_tests.py b/morphlib/stopwatch_tests.py
index deb528d5..3c8376b1 100644
--- a/morphlib/stopwatch_tests.py
+++ b/morphlib/stopwatch_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2012 Codethink Limited
+# Copyright (C) 2011-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime
diff --git a/morphlib/sysbranchdir.py b/morphlib/sysbranchdir.py
index 80e56b33..69119f5b 100644
--- a/morphlib/sysbranchdir.py
+++ b/morphlib/sysbranchdir.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/sysbranchdir_tests.py b/morphlib/sysbranchdir_tests.py
index 1aca54e6..341fedca 100644
--- a/morphlib/sysbranchdir_tests.py
+++ b/morphlib/sysbranchdir_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/systemmetadatadir.py b/morphlib/systemmetadatadir.py
index 7e89142c..573d8a20 100644
--- a/morphlib/systemmetadatadir.py
+++ b/morphlib/systemmetadatadir.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/systemmetadatadir_tests.py b/morphlib/systemmetadatadir_tests.py
index 0126f862..03496108 100644
--- a/morphlib/systemmetadatadir_tests.py
+++ b/morphlib/systemmetadatadir_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/util.py b/morphlib/util.py
index ad9d7cd9..e733af9d 100644
--- a/morphlib/util.py
+++ b/morphlib/util.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import contextlib
import itertools
@@ -645,3 +644,35 @@ def error_message_for_containerised_commandline(
'Containerisation settings: %s\n' \
'Error output:\n%s' \
% (argv_string, container_kwargs, err)
+
+
+def write_from_dict(filepath, d, validate=lambda x, y: True): #pragma: no cover
+ '''Takes a dictionary and appends the contents to a file
+
+ An optional validation callback can be passed to perform validation on
+ each value in the dictionary.
+
+ e.g.
+
+ def validation_callback(dictionary_key, dictionary_value):
+ if not dictionary_value.isdigit():
+ raise Exception('value contains non-digit character(s)')
+
+ Any callback supplied to this function should raise an exception
+ if validation fails.
+ '''
+
+ # Sort items asciibetically
+ # the output of the deployment should not depend
+ # on the locale of the machine running the deployment
+ items = sorted(d.iteritems(), key=lambda (k, v): [ord(c) for c in v])
+
+ for (k, v) in items:
+ validate(k, v)
+
+ with open(filepath, 'a') as f:
+ for (_, v) in items:
+ f.write('%s\n' % v)
+
+ os.fchown(f.fileno(), 0, 0)
+ os.fchmod(f.fileno(), 0644)
diff --git a/morphlib/util_tests.py b/morphlib/util_tests.py
index 715892b6..20972a58 100644
--- a/morphlib/util_tests.py
+++ b/morphlib/util_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
diff --git a/morphlib/workspace.py b/morphlib/workspace.py
index 27ccbe65..26986655 100644
--- a/morphlib/workspace.py
+++ b/morphlib/workspace.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/workspace_tests.py b/morphlib/workspace_tests.py
index 9eef1053..23d7ad5e 100644
--- a/morphlib/workspace_tests.py
+++ b/morphlib/workspace_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/writeexts.py b/morphlib/writeexts.py
index 270cade9..aa185a2b 100644
--- a/morphlib/writeexts.py
+++ b/morphlib/writeexts.py
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
@@ -178,7 +177,7 @@ class WriteExtension(cliapp.Application):
self.create_btrfs_system_layout(
temp_root, mp, version_label='factory',
disk_uuid=self.get_uuid(raw_disk))
- except BaseException, e:
+ except BaseException as e:
sys.stderr.write('Error creating Btrfs system layout')
raise
@@ -280,7 +279,7 @@ class WriteExtension(cliapp.Application):
cliapp.runcmd(['mount', location, mount_point])
else:
cliapp.runcmd(['mount', '-o', 'loop', location, mount_point])
- except BaseException, e:
+ except BaseException as e:
sys.stderr.write('Error mounting filesystem')
os.rmdir(mount_point)
raise
@@ -360,7 +359,7 @@ class WriteExtension(cliapp.Application):
self.status(msg='Creating %s subvolume' % state_subdir)
subvolume = os.path.join(mountpoint, 'state', state_subdir)
cliapp.runcmd(['btrfs', 'subvolume', 'create', subvolume])
- os.chmod(subvolume, 0755)
+ os.chmod(subvolume, 0o755)
existing_state_dir = os.path.join(system_dir, state_subdir)
files = []
diff --git a/morphlib/xfer-hole b/morphlib/xfer-hole
index 22ee06bf..91f1be01 100755
--- a/morphlib/xfer-hole
+++ b/morphlib/xfer-hole
@@ -7,7 +7,7 @@
# SEEK_DATA and SEEK_HOLE.
#
#
-# Copyright (C) 2014 Codethink Limited
+# Copyright (C) 2014-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
@@ -19,8 +19,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-2 =*=
diff --git a/morphlib/yamlparse.py b/morphlib/yamlparse.py
index 6f139304..075fe3b1 100644
--- a/morphlib/yamlparse.py
+++ b/morphlib/yamlparse.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import morphlib
diff --git a/morphlib/yamlparse_tests.py b/morphlib/yamlparse_tests.py
index 38815168..d5da0ca9 100644
--- a/morphlib/yamlparse_tests.py
+++ b/morphlib/yamlparse_tests.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
diff --git a/scripts/check-copyright-year b/scripts/check-copyright-year
index e72eaeea..08bee0af 100755
--- a/scripts/check-copyright-year
+++ b/scripts/check-copyright-year
@@ -2,7 +2,7 @@
#
# Does the copyright statement include the year of the latest git commit?
#
-# Copyright (C) 2012, 2014 Codethink Limited
+# Copyright (C) 2012, 2014-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
@@ -14,8 +14,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
diff --git a/scripts/check-silliness b/scripts/check-silliness
index 597eb664..0c761a69 100755
--- a/scripts/check-silliness
+++ b/scripts/check-silliness
@@ -2,7 +2,7 @@
#
# Does the file contain any of the code constructs deemed silly?
#
-# Copyright (C) 2013, 2014 Codethink Limited
+# Copyright (C) 2013, 2014-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
@@ -14,8 +14,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
errors=0
diff --git a/scripts/clean-artifact-cache b/scripts/clean-artifact-cache
index 2fdd5605..623f61f3 100755
--- a/scripts/clean-artifact-cache
+++ b/scripts/clean-artifact-cache
@@ -1,6 +1,6 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Remove all chunk artifacts in the cache except the newest. Morph does
# not currently clean its caches at any point, so this script is necessary
diff --git a/scripts/cmd-filter b/scripts/cmd-filter
index d2f4f784..25511755 100755
--- a/scripts/cmd-filter
+++ b/scripts/cmd-filter
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Wrapper around morph for use by cmdtest tests. This does several things:
#
diff --git a/scripts/convert-git-cache b/scripts/convert-git-cache
index 33a8edf1..4a7f89ce 100755
--- a/scripts/convert-git-cache
+++ b/scripts/convert-git-cache
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012,2013 Codethink Limited
+# Copyright (C) 2012,2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -eu
diff --git a/scripts/edit-morph b/scripts/edit-morph
index 90679b23..8c0863c3 100755
--- a/scripts/edit-morph
+++ b/scripts/edit-morph
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/scripts/fix-committer-info b/scripts/fix-committer-info
index 0bd85274..58276afc 100644
--- a/scripts/fix-committer-info
+++ b/scripts/fix-committer-info
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Fix git committer info. By hardcoding all of this info we make sure that
# all of the commits we make during testing have reproducible commit SHA1s.
diff --git a/scripts/list-tree b/scripts/list-tree
index a1e2e8cb..877c42a7 100755
--- a/scripts/list-tree
+++ b/scripts/list-tree
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# List contents of a directory tree in a reproducible manner: only include
# details that we care about, and that won't be changing between test runs
diff --git a/scripts/python-check b/scripts/python-check
index ce3419d5..fc89023d 100644
--- a/scripts/python-check
+++ b/scripts/python-check
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# When sourced by scripts, if the python version is too old
# fake the output and exit.
diff --git a/scripts/review-gitmodules b/scripts/review-gitmodules
index 89574833..16a416d6 100755
--- a/scripts/review-gitmodules
+++ b/scripts/review-gitmodules
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Check every system morphology in a checked out system branch by editing
# every chunk and recursively checking gitmodules.
diff --git a/scripts/run-git-in b/scripts/run-git-in
index 80b87d1a..ae3fca93 100755
--- a/scripts/run-git-in
+++ b/scripts/run-git-in
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Run git in a given directory.
diff --git a/scripts/setup-3rd-party-strata b/scripts/setup-3rd-party-strata
index fc263f96..fd5aab9e 100644
--- a/scripts/setup-3rd-party-strata
+++ b/scripts/setup-3rd-party-strata
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Create strata outside the main morphologies repository, which is useful
diff --git a/scripts/test-morph b/scripts/test-morph
index d8480d92..9a48d12a 100755
--- a/scripts/test-morph
+++ b/scripts/test-morph
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Wrapper around morph for use by cmdtest tests. This does several things:
#
diff --git a/scripts/test-shell.c b/scripts/test-shell.c
index f4ac6bfa..1a6f1642 100644
--- a/scripts/test-shell.c
+++ b/scripts/test-shell.c
@@ -1,3 +1,18 @@
+/* Copyright (C) 2014-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/>.
+*/
+
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/scripts/yaml-extract b/scripts/yaml-extract
index 6f55e62f..4ca5551a 100755
--- a/scripts/yaml-extract
+++ b/scripts/yaml-extract
@@ -28,7 +28,7 @@
# values for missing fields (e.g., the morph field if name is given).
# Construct your tests accordingly.
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -40,8 +40,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
diff --git a/setup.py b/setup.py
index 60926779..67d2e161 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011 - 2014 Codethink Limited
+# Copyright (C) 2011,2014-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
@@ -10,8 +10,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
'''Setup.py for morph.'''
diff --git a/source-stats b/source-stats
index 811fdc3b..08f7bf97 100755
--- a/source-stats
+++ b/source-stats
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright (C) 2012,2013 Codethink Limited
+# Copyright (C) 2012,2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
import cliapp
diff --git a/tests.branching/add-then-edit.script b/tests.branching/add-then-edit.script
index be3315d9..bd1094e5 100755
--- a/tests.branching/add-then-edit.script
+++ b/tests.branching/add-then-edit.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test the workflow of adding a new chunk to a stratum then editing it
diff --git a/tests.branching/add-then-edit.setup b/tests.branching/add-then-edit.setup
index bb58d05a..0dc3368d 100755
--- a/tests.branching/add-then-edit.setup
+++ b/tests.branching/add-then-edit.setup
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -eu
diff --git a/tests.branching/branch-cleans-up-on-failure.script b/tests.branching/branch-cleans-up-on-failure.script
index 55666137..6dd8eac0 100755
--- a/tests.branching/branch-cleans-up-on-failure.script
+++ b/tests.branching/branch-cleans-up-on-failure.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## If a command fails, the state of the workspace should be as if the command
diff --git a/tests.branching/branch-creates-new-system-branch-not-from-master.script b/tests.branching/branch-creates-new-system-branch-not-from-master.script
index c561f191..e4d815d1 100755
--- a/tests.branching/branch-creates-new-system-branch-not-from-master.script
+++ b/tests.branching/branch-creates-new-system-branch-not-from-master.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Make sure "morph branch" creates a new system branch.
diff --git a/tests.branching/branch-creates-new-system-branch.script b/tests.branching/branch-creates-new-system-branch.script
index 784bed62..bc849f90 100755
--- a/tests.branching/branch-creates-new-system-branch.script
+++ b/tests.branching/branch-creates-new-system-branch.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Make sure "morph branch" creates a new system branch.
diff --git a/tests.branching/branch-fails-if-branch-exists.script b/tests.branching/branch-fails-if-branch-exists.script
index 8a7da8ab..d396d4fa 100755
--- a/tests.branching/branch-fails-if-branch-exists.script
+++ b/tests.branching/branch-fails-if-branch-exists.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Make sure "morph branch" fails if the system branch already exists in the
diff --git a/tests.branching/branch-when-branchdir-exists-locally.script b/tests.branching/branch-when-branchdir-exists-locally.script
index 66a116be..f8f93812 100755
--- a/tests.branching/branch-when-branchdir-exists-locally.script
+++ b/tests.branching/branch-when-branchdir-exists-locally.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Make sure "morph branch" fails when the system branch directory already
diff --git a/tests.branching/branch-works-anywhere.script b/tests.branching/branch-works-anywhere.script
index 7f6156ce..3dfcffc2 100755
--- a/tests.branching/branch-works-anywhere.script
+++ b/tests.branching/branch-works-anywhere.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Make sure "morph branch" works anywhere in a workspace or system branch.
diff --git a/tests.branching/checkout-cleans-up-on-failure.script b/tests.branching/checkout-cleans-up-on-failure.script
index a0b0411b..fa0d61fa 100755
--- a/tests.branching/checkout-cleans-up-on-failure.script
+++ b/tests.branching/checkout-cleans-up-on-failure.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## If a command fails, the state of the workspace should be as if the command
diff --git a/tests.branching/checkout-existing-branch.script b/tests.branching/checkout-existing-branch.script
index b1740d9c..8ab2834d 100755
--- a/tests.branching/checkout-existing-branch.script
+++ b/tests.branching/checkout-existing-branch.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that "morph checkout test:morphs master" works.
diff --git a/tests.branching/checkout-non-aliased-repos.script b/tests.branching/checkout-non-aliased-repos.script
index b52f6675..4b2ac1c2 100755
--- a/tests.branching/checkout-non-aliased-repos.script
+++ b/tests.branching/checkout-non-aliased-repos.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that "morph checkout" works with repos that are not aliased.
diff --git a/tests.branching/checkout-works-anywhere.script b/tests.branching/checkout-works-anywhere.script
index 14d18842..ebd5afc4 100755
--- a/tests.branching/checkout-works-anywhere.script
+++ b/tests.branching/checkout-works-anywhere.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Make sure "morph checkout" works anywhere in a workspace or system branch.
diff --git a/tests.branching/edit-checkouts-existing-chunk.script b/tests.branching/edit-checkouts-existing-chunk.script
index df2a7d85..55d73bb0 100755
--- a/tests.branching/edit-checkouts-existing-chunk.script
+++ b/tests.branching/edit-checkouts-existing-chunk.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that "morph edit" clones a chunk repository into a system branch.
diff --git a/tests.branching/edit-clones-chunk.script b/tests.branching/edit-clones-chunk.script
index a6313ca6..710565fb 100755
--- a/tests.branching/edit-clones-chunk.script
+++ b/tests.branching/edit-clones-chunk.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that "morph edit" clones a chunk repository into a system branch.
diff --git a/tests.branching/edit-handles-submodules.script b/tests.branching/edit-handles-submodules.script
index 09592f74..b7a57b42 100755
--- a/tests.branching/edit-handles-submodules.script
+++ b/tests.branching/edit-handles-submodules.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## 'morph edit' should set up git URL rewriting correctly so that submodule
diff --git a/tests.branching/edit-handles-submodules.setup b/tests.branching/edit-handles-submodules.setup
index cb61ad66..922afbe3 100755
--- a/tests.branching/edit-handles-submodules.setup
+++ b/tests.branching/edit-handles-submodules.setup
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -eu
diff --git a/tests.branching/edit-updates-stratum.script b/tests.branching/edit-updates-stratum.script
index b60c46e7..6d330016 100755
--- a/tests.branching/edit-updates-stratum.script
+++ b/tests.branching/edit-updates-stratum.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that "morph edit" clones a chunk repository into a system branch.
diff --git a/tests.branching/edit-works-after-branch-root-was-renamed.script b/tests.branching/edit-works-after-branch-root-was-renamed.script
index e28ab7df..e2c253f8 100755
--- a/tests.branching/edit-works-after-branch-root-was-renamed.script
+++ b/tests.branching/edit-works-after-branch-root-was-renamed.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that the branch root repository created by "morph branch" or
diff --git a/tests.branching/foreach-handles-command-failure.script b/tests.branching/foreach-handles-command-failure.script
index 4bc71c78..09674c03 100755
--- a/tests.branching/foreach-handles-command-failure.script
+++ b/tests.branching/foreach-handles-command-failure.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that "morph foreach" deals with failure in a grown-up way
diff --git a/tests.branching/foreach-handles-full-urls.script b/tests.branching/foreach-handles-full-urls.script
index 6e0b14ec..8fb18d75 100755
--- a/tests.branching/foreach-handles-full-urls.script
+++ b/tests.branching/foreach-handles-full-urls.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## morph foreach: should not break if we used a full URL for a repo
diff --git a/tests.branching/init-cwd.script b/tests.branching/init-cwd.script
index 10dd0cc7..9613bac8 100755
--- a/tests.branching/init-cwd.script
+++ b/tests.branching/init-cwd.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that "morph init" works for the current working directory.
diff --git a/tests.branching/init-default.script b/tests.branching/init-default.script
index da67828f..328f9f84 100755
--- a/tests.branching/init-default.script
+++ b/tests.branching/init-default.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that "morph init" works without an explicit argument.
diff --git a/tests.branching/init-existing.script b/tests.branching/init-existing.script
index 506e94bb..c2671ab7 100755
--- a/tests.branching/init-existing.script
+++ b/tests.branching/init-existing.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that "morph init" works when given the name of an existing,
diff --git a/tests.branching/init-newdir.script b/tests.branching/init-newdir.script
index 1f505d92..2ebe4325 100755
--- a/tests.branching/init-newdir.script
+++ b/tests.branching/init-newdir.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that "morph init" works if given a directory that
diff --git a/tests.branching/init-nonempty.script b/tests.branching/init-nonempty.script
index c5c1947c..a3aba9e6 100755
--- a/tests.branching/init-nonempty.script
+++ b/tests.branching/init-nonempty.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that "morph init" fails when given the name of an existing,
diff --git a/tests.branching/morph-repository-stored-in-cloned-repositories.script b/tests.branching/morph-repository-stored-in-cloned-repositories.script
index f60b16ae..baa0868b 100755
--- a/tests.branching/morph-repository-stored-in-cloned-repositories.script
+++ b/tests.branching/morph-repository-stored-in-cloned-repositories.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012,2014 Codethink Limited
+# Copyright (C) 2012,2014-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that morph branch/checkout/edit create repositories that have
diff --git a/tests.branching/setup b/tests.branching/setup
index a2d23090..59979ca8 100755
--- a/tests.branching/setup
+++ b/tests.branching/setup
@@ -1,5 +1,5 @@
#!/bin/bash
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Set up $DATADIR.
diff --git a/tests.branching/setup-second-chunk b/tests.branching/setup-second-chunk
index 24604ab8..c8baa946 100755
--- a/tests.branching/setup-second-chunk
+++ b/tests.branching/setup-second-chunk
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Add a second chunk to hello-stratum.
diff --git a/tests.branching/show-system-branch-fails-outside-workspace.script b/tests.branching/show-system-branch-fails-outside-workspace.script
index d227d5b0..95bdbc92 100755
--- a/tests.branching/show-system-branch-fails-outside-workspace.script
+++ b/tests.branching/show-system-branch-fails-outside-workspace.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Check that 'morph show-system-branch' fails when being run
diff --git a/tests.branching/show-system-branch-fails-when-branch-is-ambiguous.script b/tests.branching/show-system-branch-fails-when-branch-is-ambiguous.script
index 12e23147..bb69eb1c 100755
--- a/tests.branching/show-system-branch-fails-when-branch-is-ambiguous.script
+++ b/tests.branching/show-system-branch-fails-when-branch-is-ambiguous.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Check that 'morph show-system-branch' fails when the system branch
diff --git a/tests.branching/show-system-branch-works-anywhere-with-a-single-branch.script b/tests.branching/show-system-branch-works-anywhere-with-a-single-branch.script
index 800a8e5b..f7d8c7a9 100755
--- a/tests.branching/show-system-branch-works-anywhere-with-a-single-branch.script
+++ b/tests.branching/show-system-branch-works-anywhere-with-a-single-branch.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Check that 'morph show-system-branch' works even outside a branch
diff --git a/tests.branching/show-system-branch-works-in-different-directories-in-a-branch.script b/tests.branching/show-system-branch-works-in-different-directories-in-a-branch.script
index d89e671c..ab46cb08 100755
--- a/tests.branching/show-system-branch-works-in-different-directories-in-a-branch.script
+++ b/tests.branching/show-system-branch-works-in-different-directories-in-a-branch.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Check that 'morph show-system-branch' shows the name of the
diff --git a/tests.branching/status-in-clean-branch.script b/tests.branching/status-in-clean-branch.script
index 335db9f9..a7f38a61 100755
--- a/tests.branching/status-in-clean-branch.script
+++ b/tests.branching/status-in-clean-branch.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011, 2012 Codethink Limited
+# Copyright (C) 2011, 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## 'morph status' within a branch
diff --git a/tests.branching/status-in-dirty-branch.script b/tests.branching/status-in-dirty-branch.script
index 37fca97b..5cc8b3a4 100755
--- a/tests.branching/status-in-dirty-branch.script
+++ b/tests.branching/status-in-dirty-branch.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## 'morph status' within a branch
diff --git a/tests.branching/status-in-workspace.script b/tests.branching/status-in-workspace.script
index e998c097..9bfeb999 100755
--- a/tests.branching/status-in-workspace.script
+++ b/tests.branching/status-in-workspace.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011, 2012 Codethink Limited
+# Copyright (C) 2011, 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## 'morph status' within a workspace
diff --git a/tests.branching/teardown b/tests.branching/teardown
index 94928416..d5d7b603 100755
--- a/tests.branching/teardown
+++ b/tests.branching/teardown
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -11,8 +11,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Clean up $DATADIR.
diff --git a/tests.branching/workspace-not-found.script b/tests.branching/workspace-not-found.script
index 9e9b5d75..629fd1e9 100755
--- a/tests.branching/workspace-not-found.script
+++ b/tests.branching/workspace-not-found.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Handle being run from outside workspace directory.
diff --git a/tests.branching/workspace.script b/tests.branching/workspace.script
index e717873c..9da75173 100755
--- a/tests.branching/workspace.script
+++ b/tests.branching/workspace.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## morph init: Create a workspace.
diff --git a/tests.build/ambiguous-refs.script b/tests.build/ambiguous-refs.script
index e1eae59d..181af3cc 100755
--- a/tests.build/ambiguous-refs.script
+++ b/tests.build/ambiguous-refs.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2013 Codethink Limited
+# Copyright (C) 2011-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Guard against a bug that occurs if 'git show-ref' is used to resolve refs
diff --git a/tests.build/build-chunk-failures-dump-log.script b/tests.build/build-chunk-failures-dump-log.script
index 645fd59a..81361ad0 100755
--- a/tests.build/build-chunk-failures-dump-log.script
+++ b/tests.build/build-chunk-failures-dump-log.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test building a chunk that fails.
diff --git a/tests.build/build-chunk-writes-log.script b/tests.build/build-chunk-writes-log.script
index 5bfb2ae3..e636924e 100755
--- a/tests.build/build-chunk-writes-log.script
+++ b/tests.build/build-chunk-writes-log.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2013 Codethink Limited
+# Copyright (C) 2011-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Build log should be saved when a chunk is built.
diff --git a/tests.build/build-stratum-with-submodules.script b/tests.build/build-stratum-with-submodules.script
index 015db3f2..bd6b97ce 100755
--- a/tests.build/build-stratum-with-submodules.script
+++ b/tests.build/build-stratum-with-submodules.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test build a stratum that uses a chunk which needs a submodule.
diff --git a/tests.build/build-system-autotools-fails-if-autogen-fails.script b/tests.build/build-system-autotools-fails-if-autogen-fails.script
index d7fdd055..0b009b54 100755
--- a/tests.build/build-system-autotools-fails-if-autogen-fails.script
+++ b/tests.build/build-system-autotools-fails-if-autogen-fails.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that the autotools build system fails if it runs autogen.sh and that
diff --git a/tests.build/build-system-autotools.script b/tests.build/build-system-autotools.script
index 2ea53174..710a8f98 100755
--- a/tests.build/build-system-autotools.script
+++ b/tests.build/build-system-autotools.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Convert the hello-chunk project to something autotools-like, then
diff --git a/tests.build/build-system-cmake.script b/tests.build/build-system-cmake.script
index 570a9af7..fe02f9dc 100755
--- a/tests.build/build-system-cmake.script
+++ b/tests.build/build-system-cmake.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Convert the hello-chunk project to something cmake-like, then
diff --git a/tests.build/build-system-cpan.script b/tests.build/build-system-cpan.script
index 735dac84..103d5466 100755
--- a/tests.build/build-system-cpan.script
+++ b/tests.build/build-system-cpan.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Convert the hello-chunk project to perl with CPAN and build.
diff --git a/tests.build/build-system-python-distutils.script b/tests.build/build-system-python-distutils.script
index 9a751491..e5c0ea74 100755
--- a/tests.build/build-system-python-distutils.script
+++ b/tests.build/build-system-python-distutils.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Convert the hello-chunk project to python with distutils and build.
diff --git a/tests.build/build-system-qmake.script b/tests.build/build-system-qmake.script
index b3861936..d430fba7 100755
--- a/tests.build/build-system-qmake.script
+++ b/tests.build/build-system-qmake.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Convert the hello-chunk project to something qmake-like, then
diff --git a/tests.build/build-system.script b/tests.build/build-system.script
index 56d80735..0180939a 100755
--- a/tests.build/build-system.script
+++ b/tests.build/build-system.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test building a simple system.
diff --git a/tests.build/cross-bootstrap-only-to-supported-archs.script b/tests.build/cross-bootstrap-only-to-supported-archs.script
index 872acd9f..3b19b910 100755
--- a/tests.build/cross-bootstrap-only-to-supported-archs.script
+++ b/tests.build/cross-bootstrap-only-to-supported-archs.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Test that "morph cross-bootstrap" works only for the architectures that
diff --git a/tests.build/cross-bootstrap.script b/tests.build/cross-bootstrap.script
index 51d9ef1e..245c2a13 100755
--- a/tests.build/cross-bootstrap.script
+++ b/tests.build/cross-bootstrap.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Test "morph cross-bootstrap", up to the point of the tarball it generates
diff --git a/tests.build/missing-ref.script b/tests.build/missing-ref.script
index a18ce2d1..83562035 100755
--- a/tests.build/missing-ref.script
+++ b/tests.build/missing-ref.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2013 Codethink Limited
+# Copyright (C) 2011-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test building with a bad reference.
diff --git a/tests.build/morphless-chunks.script b/tests.build/morphless-chunks.script
index 9a8b41dd..5b19bc4a 100755
--- a/tests.build/morphless-chunks.script
+++ b/tests.build/morphless-chunks.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Try to build a morphless chunk.
diff --git a/tests.build/only-build-systems.script b/tests.build/only-build-systems.script
index 699be942..ae664f7e 100755
--- a/tests.build/only-build-systems.script
+++ b/tests.build/only-build-systems.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2013 Codethink Limited
+# Copyright (C) 2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Morph should refuse build a chunk out of the context. Only
diff --git a/tests.build/prefix.script b/tests.build/prefix.script
index 209c1a54..140617e1 100755
--- a/tests.build/prefix.script
+++ b/tests.build/prefix.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Honour 'prefix' attribute for chunks within stratum morphs
diff --git a/tests.build/rebuild-cached-stratum.script b/tests.build/rebuild-cached-stratum.script
index 0014e545..e2e0face 100755
--- a/tests.build/rebuild-cached-stratum.script
+++ b/tests.build/rebuild-cached-stratum.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Does a cached stratum get rebuilt if its chunk changes?
diff --git a/tests.build/setup b/tests.build/setup
index 833f132d..4663ff1d 100755
--- a/tests.build/setup
+++ b/tests.build/setup
@@ -10,7 +10,7 @@
# The stratum repository contains a single branch, "master", with a
# stratum and a system morphology that include the chunk above.
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -22,8 +22,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -eu
diff --git a/tests.build/setup-build-essential b/tests.build/setup-build-essential
index 9ffb7774..281ff7ec 100755
--- a/tests.build/setup-build-essential
+++ b/tests.build/setup-build-essential
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Set up a stratum which resembles Baserock's 'build-essential' slightly. Used
# for testing 'morph cross-bootstrap' and the 'bootstrap' build mode.
diff --git a/tests.build/uses-tempdir.script b/tests.build/uses-tempdir.script
index 80c06d56..aa4563f8 100755
--- a/tests.build/uses-tempdir.script
+++ b/tests.build/uses-tempdir.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2011-2013 Codethink Limited
+# Copyright (C) 2011-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test that temporary directories are created in the dir specified
diff --git a/tests/setup b/tests/setup
index 6ebab880..9010921c 100755
--- a/tests/setup
+++ b/tests/setup
@@ -10,7 +10,7 @@
# The stratum repository contains a single branch, "master", with a
# stratum and a system morphology that include the chunk above.
#
-# Copyright (C) 2011-2014 Codethink Limited
+# Copyright (C) 2011-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
@@ -22,8 +22,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -eu
diff --git a/tests/show-dependencies.script b/tests/show-dependencies.script
index 15b69e25..db76274d 100755
--- a/tests/show-dependencies.script
+++ b/tests/show-dependencies.script
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Test "show-dependencies" subcommand.
diff --git a/tests/show-dependencies.setup b/tests/show-dependencies.setup
index 74d10c2b..38a76722 100755
--- a/tests/show-dependencies.setup
+++ b/tests/show-dependencies.setup
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (C) 2012-2014 Codethink Limited
+# 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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
diff --git a/tests/trove-id.script b/tests/trove-id.script
index 998bde44..ee382de1 100755
--- a/tests/trove-id.script
+++ b/tests/trove-id.script
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2013,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
@@ -12,8 +12,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
## Verify that trove-id (and by corollary trove-host) work properly.
diff --git a/yarns/branches-workspaces.yarn b/yarns/branches-workspaces.yarn
index a757822e..27bddff5 100644
--- a/yarns/branches-workspaces.yarn
+++ b/yarns/branches-workspaces.yarn
@@ -445,21 +445,8 @@ repositories referenced in the system branch.
THEN morph reports no outstanding changes in foo
FINALLY the git server is shut down
-`morph foreach`
---------------
-
-`morph foreach` runs a shell command in each of the git repos in a system
-branch checkout.
-
- SCENARIO morph foreach runs command in each git repo
- GIVEN a workspace
- AND a git server
- WHEN the user creates a system branch called foo
- AND the user edits the chunk test-chunk in branch foo
- AND running shell command in each repo in foo
- THEN morph ran command in test/morphs in foo
- AND morph ran command in test/test-chunk in foo
- FINALLY the git server is shut down
+Manifests
+---------
Generating a manifest works
diff --git a/yarns/implementations.yarn b/yarns/implementations.yarn
index 2557e2e5..2bbb1f5c 100644
--- a/yarns/implementations.yarn
+++ b/yarns/implementations.yarn
@@ -624,16 +624,6 @@ Reporting status of checked out repositories:
cd "$DATADIR/workspace/$MATCH_2/$(slashify_colons "$MATCH_1")"
git commit -a -m test-commit
-Running shell command in each checked out repository:
-
- IMPLEMENTS WHEN running shell command in each repo in (\S+)
- cd "$DATADIR/workspace/$MATCH_1"
- run_morph foreach -- pwd > "$DATADIR/morph.stdout"
-
- IMPLEMENTS THEN morph ran command in (\S+) in (\S+)
- grep -Fx "$MATCH_1" "$DATADIR/morph.stdout"
- grep -Fx "$DATADIR/workspace/$MATCH_2/$MATCH_1" "$DATADIR/morph.stdout"
-
Generating a manifest.
IMPLEMENTS GIVEN a system artifact
diff --git a/yarns/morph.shell-lib b/yarns/morph.shell-lib
index d9c9eff6..e7011091 100644
--- a/yarns/morph.shell-lib
+++ b/yarns/morph.shell-lib
@@ -3,7 +3,7 @@
# The shell functions in this library are meant to make writing IMPLEMENTS
# sections for yarn scenario tests easier.
-# Copyright (C) 2013-2014 Codethink Limited
+# Copyright (C) 2013-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
@@ -15,8 +15,7 @@
# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# with this program. If not, see <http://www.gnu.org/licenses/>.
# Add $SRCDIR to PYTHONPATH.