summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/git-daemon-wrap46
-rwxr-xr-xtests.as-root/building-a-system-branch-picks-up-uncommitted-changes.script55
-rwxr-xr-xtests.as-root/building-creates-correct-temporary-refs.script55
-rw-r--r--tests.as-root/building-creates-correct-temporary-refs.stdout27
-rw-r--r--yarns/architecture.yarn2
-rw-r--r--yarns/branches-workspaces.yarn67
-rw-r--r--yarns/building.yarn1
-rw-r--r--yarns/deployment.yarn7
-rw-r--r--yarns/implementations.yarn27
-rw-r--r--yarns/regression.yarn4
-rw-r--r--yarns/splitting.yarn2
11 files changed, 143 insertions, 150 deletions
diff --git a/scripts/git-daemon-wrap b/scripts/git-daemon-wrap
new file mode 100755
index 00000000..528b7bed
--- /dev/null
+++ b/scripts/git-daemon-wrap
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+
+'Launch a Git Daemon on an ephemeral port, and report which port was used.'
+
+import argparse
+import contextlib
+import pipes
+import socket
+import subprocess
+import sys
+
+# Parse arguments with bare argparse, since cliapp hates unknown options
+class UnsupportedArgument(argparse.Action):
+ def __call__(self, parser, namespace, values, option_string=None):
+ sys.stderr.write('%s not supported\n' % option_string)
+ sys.exit(1)
+
+parser = argparse.ArgumentParser(description=__doc__)
+for arg in ('user', 'group', 'detach', 'port', 'syslog', 'pid-file'):
+ parser.add_argument('--' + arg, action=UnsupportedArgument)
+parser.add_argument('--listen', default='127.0.0.1')
+parser.add_argument('--port-file', required=True,
+ help='Report which port the git daemon was bound to.')
+options, args = parser.parse_known_args()
+
+with contextlib.closing(socket.socket()) as sock:
+ sock.bind((options.listen, 0))
+ host, port = sock.getsockname()
+ with open(options.port_file, 'w') as f:
+ f.write('%s\n' % port)
+ sock.listen(1)
+ while True:
+ conn, addr = sock.accept()
+ with contextlib.closing(conn):
+ gitcmd = ['git', 'daemon', '--inetd']
+ gitcmd.extend(args)
+ cmdstr = (' '.join(map(pipes.quote, gitcmd)))
+ sys.stderr.write('Running %s' % cmdstr)
+ ret = subprocess.call(args=gitcmd, stdin=conn, stdout=conn,
+ stderr=conn, close_fds=True)
+ if ret != 0:
+ sys.stderr.write('%s exited %d\n' % (cmdstr, ret))
+ # git-daemon returns 255 when the repo doesn't exist
+ if ret not in (0, 255):
+ break
+sys.exit(ret)
diff --git a/tests.as-root/building-a-system-branch-picks-up-uncommitted-changes.script b/tests.as-root/building-a-system-branch-picks-up-uncommitted-changes.script
deleted file mode 100755
index 4dacb23e..00000000
--- a/tests.as-root/building-a-system-branch-picks-up-uncommitted-changes.script
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2012-2014 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.
-
-
-## Make sure "morph build" works anywhere in a workspace or system branch
-## and produces the same results every time.
-
-# FIXME: This seems to break because the new "morph edit" makes correct
-# changes to build-dependencies, which breaks the old "morph build".
-# Disable test now, re-enable it after "morph build" is fixed. --liw
-exit 0
-
-set -eu
-
-source "$SRCDIR/tests.as-root/setup-build"
-
-# Build the linux system from the system branch.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" build linux-system
-
-# Print tree SHA1s of the build ref of morphs and kernel.
-cd "$DATADIR/workspace/branch1/test/morphs"
-MORPHS_SHA1="$(git rev-parse baserock/builds/123456789/987654321)"
-cd "$DATADIR/workspace/branch1/test/kernel-repo"
-KERNEL_SHA1="$(git rev-parse baserock/builds/123456789/AABBCCDDE)"
-
-# Make an uncommitted change to the linux morphology.
-cd "$DATADIR/workspace/branch1/test/kernel-repo"
-sed -i -e 's@touch@touch foo@g' linux.morph
-
-# Build the linux system again without comitting.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" build linux-system
-
-# Print tree SHA1s of the build ref of morphs and kernel again.
-# This time the tree SHA1 of morphs should be the same
-# but that of the kernel repo should be different because we
-# made a change.
-cd "$DATADIR/workspace/branch1/test/morphs"
-[ "$(git rev-parse baserock/builds/123456789/987654321)" != "$MORPHS_SHA1" ]
-cd "$DATADIR/workspace/branch1/test/kernel-repo"
-[ "$(git rev-parse baserock/builds/123456789/AABBCCDDE)" != "$KERNEL_SHA1" ]
diff --git a/tests.as-root/building-creates-correct-temporary-refs.script b/tests.as-root/building-creates-correct-temporary-refs.script
deleted file mode 100755
index 6fb6c83a..00000000
--- a/tests.as-root/building-creates-correct-temporary-refs.script
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2012-2014 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.
-
-
-## Make sure "morph build" works anywhere in a workspace or system branch
-## and produces the same results every time.
-
-# FIXME: This seems to break because the new "morph edit" makes correct
-# changes to build-dependencies, which breaks the old "morph build".
-# Disable test now, re-enable it after "morph build" is fixed. --liw
-cat "$SRCDIR/tests.as-root/building-creates-correct-temporary-refs.stdout"
-exit 0
-
-set -eu
-
-source "$SRCDIR/tests.as-root/setup-build"
-
-# Build the linux system from the system branch.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" build linux-system
-
-# Verify that the right temporary refs were created.
-echo "Refs of morphs repo after first build:"
-"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/branch1/test/morphs" \
- show-ref | cut -d' ' -f2
-echo "Refs of kernel repo after first build:"
-"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/branch1/test/kernel-repo" \
- show-ref | cut -d' ' -f2
-echo
-
-# Change the build ref prefix and build again.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" --build-ref-prefix=newprefix build linux-system
-
-# Verify that the right temporary refs were created.
-echo "Refs of morphs repo after second build:"
-"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/branch1/test/morphs" \
- show-ref | cut -d' ' -f2
-echo "Refs of kernel repo after second build:"
-"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/branch1/test/kernel-repo" \
- show-ref | cut -d' ' -f2
diff --git a/tests.as-root/building-creates-correct-temporary-refs.stdout b/tests.as-root/building-creates-correct-temporary-refs.stdout
deleted file mode 100644
index 3416028a..00000000
--- a/tests.as-root/building-creates-correct-temporary-refs.stdout
+++ /dev/null
@@ -1,27 +0,0 @@
-Refs of morphs repo after first build:
-refs/heads/baserock/builds/123456789/987654321
-refs/heads/branch1
-refs/heads/master
-refs/remotes/origin/HEAD
-refs/remotes/origin/master
-Refs of kernel repo after first build:
-refs/heads/baserock/builds/123456789/AABBCCDDE
-refs/heads/branch1
-refs/heads/master
-refs/remotes/origin/HEAD
-refs/remotes/origin/master
-
-Refs of morphs repo after second build:
-refs/heads/baserock/builds/123456789/987654321
-refs/heads/branch1
-refs/heads/master
-refs/heads/newprefix/123456789/987654321
-refs/remotes/origin/HEAD
-refs/remotes/origin/master
-Refs of kernel repo after second build:
-refs/heads/baserock/builds/123456789/AABBCCDDE
-refs/heads/branch1
-refs/heads/master
-refs/heads/newprefix/123456789/AABBCCDDE
-refs/remotes/origin/HEAD
-refs/remotes/origin/master
diff --git a/yarns/architecture.yarn b/yarns/architecture.yarn
index 2240c428..d4de308e 100644
--- a/yarns/architecture.yarn
+++ b/yarns/architecture.yarn
@@ -9,6 +9,7 @@ Morph Cross-Building Tests
AND the user attempts to build the system base-system-testarch.morph in branch master
THEN morph failed
AND the build error message includes the string "Are you trying to cross-build?"
+ FINALLY the git server is shut down
Morph Cross-Bootstrap Tests
@@ -20,3 +21,4 @@ Morph Cross-Bootstrap Tests
AND a system called base-system-testarch.morph for the test architecture in the git server
WHEN the user checks out the system branch called master
THEN the user cross-bootstraps the system base-system-testarch.morph in branch master of repo test:morphs to the arch testarch
+ FINALLY the git server is shut down
diff --git a/yarns/branches-workspaces.yarn b/yarns/branches-workspaces.yarn
index 7c85d6e0..200f9508 100644
--- a/yarns/branches-workspaces.yarn
+++ b/yarns/branches-workspaces.yarn
@@ -55,6 +55,7 @@ to investigate chunks in existing branches.
WHEN the user edits the chunk test-chunk in branch master
THEN the edited chunk test:test-chunk has git branch master
+ FINALLY the git server is shut down
Checking out a system branch should fail, if the branch doesn't exist.
@@ -63,6 +64,7 @@ Checking out a system branch should fail, if the branch doesn't exist.
AND a git server
WHEN the user attempts to check out the system branch called foo
THEN morph failed
+ FINALLY the git server is shut down
Branching system branches
-----------------------------------------
@@ -74,6 +76,7 @@ We can, instead, create a new system branch, off master.
AND a git server
WHEN the user creates a system branch called foo
THEN the system branch foo is checked out
+ FINALLY the git server is shut down
We can also branch off another system branch. However, we need to first
push the other branch to the git server, since Morph is not smart enough
@@ -86,6 +89,7 @@ to check for that locally.
AND the user pushes the system branch called foo to the git server
AND the user creates a system branch called bar, based on foo
THEN the system branch bar is checked out
+ FINALLY the git server is shut down
Query commands in workspaces
----------------------------
@@ -114,6 +118,7 @@ repository, which is the system branch root repository.
WHEN the user reports the workspace from the directory master/test/morphs
THEN the workspace is reported correctly
+ FINALLY the git server is shut down
However, running it outside a workspace should fail.
@@ -139,6 +144,7 @@ current working directory, it will find it and report it correctly.
WHEN the user reports the system branch from the directory .
THEN the system branch is reported as master
+ FINALLY the git server is shut down
However, if there's two system branches checked out below the
current directory, things should fail.
@@ -150,6 +156,7 @@ current directory, things should fail.
AND the user creates a system branch called foo
AND the user attempts to report the system branch from the directory .
THEN morph failed
+ FINALLY the git server is shut down
`morph show-branch-root` reports the path of the system branch root
repository. It can be run inside a checkout, or somewhere outside a
@@ -164,6 +171,7 @@ checkout, where exactly one checkout exists below.
WHEN the user reports the system branch root repository from the directory .
THEN the system branch root repository is reported as workspace/master/test/morphs
+ FINALLY the git server is shut down
However, it fails if run outside a checkout and there's no system
branches checked out.
@@ -173,6 +181,7 @@ branches checked out.
AND a git server
WHEN the user attempts to report the system branch root repository from the directory .
THEN morph failed
+ FINALLY the git server is shut down
Editing components
------------------
@@ -199,8 +208,9 @@ purposes.
Editing a morphology should not cause it to start having repo or ref
fields when referring to strata, when it didn't before.
- AND in branch foo, system systems/test-system.morph refers to test-stratum without repo
- AND in branch foo, system systems/test-system.morph refers to test-stratum without ref
+ AND in branch foo, system systems/test-system.morph refers to test-stratum without repo
+ AND in branch foo, system systems/test-system.morph refers to test-stratum without ref
+ FINALLY the git server is shut down
Temporary Build Branch behaviour
--------------------------------
@@ -209,6 +219,27 @@ Morph always builds from committed changes, but it's not always convenient
to commit and push changes, so `morph build` can create temporary build
branches when necessary.
+### What gets included in temporary build branches ###
+
+ SCENARIO morph builds the branches of edited chunks you checked-out
+ GIVEN a workspace
+ AND a git server
+ WHEN the user checks out the system branch called master
+ AND the user edits the chunk test-chunk in branch master
+
+If we make an uncommitted change to an edited chunk, then a temporary
+build branch is made to include that change.
+
+ WHEN the user makes changes to test-chunk in branch master
+ AND the user builds systems/test-system.morph of the master branch
+ THEN the changes to test-chunk in branch master are included in the temporary build branch
+
+### When branches are created ###
+
+It's convenient to have Temporary Build Branches, but we don't always
+need them, and they get in the way when we don't need them, so we need
+to be careful about when to make them.
+
SCENARIO morph makes temporary build branches for uncommitted changes when necessary
GIVEN a workspace
AND a git server
@@ -351,25 +382,37 @@ We now don't need temporary build branches for local builds.
Nor do we need temporary build branches for distributed builds.
- GIVEN the workspace contains no temporary build branches
- AND the git server contains no temporary build branches
- AND we must build from pushed branches
- WHEN the user builds systems/test-system.morph of the baserock/test branch
- THEN the morphs repository in the workspace for baserock/test has no temporary build branches
- AND the test-chunk repository in the workspace for baserock/test has no temporary build branches
- AND no temporary build branches were pushed to the morphs repository
- AND no temporary build branches were pushed to the test-chunk repository
+ GIVEN the workspace contains no temporary build branches
+ AND the git server contains no temporary build branches
+ AND we must build from pushed branches
+ WHEN the user builds systems/test-system.morph of the baserock/test branch
+ THEN the morphs repository in the workspace for baserock/test has no temporary build branches
+ AND the test-chunk repository in the workspace for baserock/test has no temporary build branches
+ AND no temporary build branches were pushed to the morphs repository
+ AND no temporary build branches were pushed to the test-chunk repository
+ FINALLY the git server is shut down
+
+
+### Temporary Build Branch implementations ###
IMPLEMENTS WHEN the user makes changes to test-chunk in branch (\S+)
chunkdir="$(slashify_colons "test:test-chunk")"
cd "$DATADIR/workspace/$MATCH_1/$chunkdir"
sed -i -e 's/Hello/Goodbye/g' test-bin
+ IMPLEMENTS THEN the changes to test-chunk in branch (\S+) are included in the temporary build branch
+ build_ref_prefix=baserock/builds/
+ chunkdir="$(slashify_colons "test:test-chunk")"
+ cd "$DATADIR/workspace/$MATCH_1/$chunkdir"
+ eval "$(git for-each-ref --count=1 --shell --sort=committerdate \
+ --format='git cat-file -p %(refname):test-bin | diff test-bin -' \
+ "$build_ref_prefix")"
+
IMPLEMENTS WHEN the user commits changes to (\S+) in branch (\S+)
chunkdir="$(slashify_colons "test:$MATCH_1")"
cd "$DATADIR/workspace/$MATCH_2/$chunkdir"
git commit -a -m 'Commit local changes'
-
+
Status of system branch checkout
--------------------------------
@@ -398,6 +441,7 @@ repositories referenced in the system branch.
WHEN committing changes in test:test-chunk in branch foo
THEN morph reports no outstanding changes in foo
+ FINALLY the git server is shut down
`morph foreach`
--------------
@@ -413,6 +457,7 @@ branch checkout.
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
Generating a manifest works
diff --git a/yarns/building.yarn b/yarns/building.yarn
index 6b90ce64..c708b5bb 100644
--- a/yarns/building.yarn
+++ b/yarns/building.yarn
@@ -7,3 +7,4 @@ Morph Building Tests
WHEN the user checks out the system branch called master
AND the user creates an uncommitted system morphology called systems/base-system.morph for our architecture in system branch master
THEN morph build the system systems/base-system.morph of the branch master
+ FINALLY the git server is shut down
diff --git a/yarns/deployment.yarn b/yarns/deployment.yarn
index 3252647d..4039d551 100644
--- a/yarns/deployment.yarn
+++ b/yarns/deployment.yarn
@@ -8,6 +8,7 @@ Morph Deployment Tests
AND the user attempts to deploy the system systems/test-system.morph in branch master
THEN morph failed
AND the deploy error message includes the string "morph deploy is only supported for cluster morphologies"
+ FINALLY the git server is shut down
SCENARIO deploying a cluster morphology as a tarfile
GIVEN a workspace
@@ -21,6 +22,7 @@ Morph Deployment Tests
WHEN the user builds the system systems/test-system.morph in branch master
AND the user attempts to deploy the cluster test-cluster.morph in branch master
THEN morph succeeded
+ FINALLY the git server is shut down
Some deployment types support upgrades, but some do not and Morph needs to make
this clear.
@@ -37,6 +39,7 @@ this clear.
WHEN the user builds the system systems/test-system.morph in branch master
AND the user attempts to upgrade the cluster test-cluster.morph in branch master
THEN morph failed
+ FINALLY the git server is shut down
The rawdisk write extension supports both initial deployment and subsequent
upgrades. Note that the rawdisk upgrade code needs bringing up to date to use
@@ -58,6 +61,7 @@ the same code paths as a real upgrade.
THEN morph succeeded
WHEN the user attempts to upgrade the cluster test-cluster.morph in branch master with options test-system.VERSION_LABEL=test2
THEN morph succeeded
+ FINALLY the git server is shut down
Nested deployments
==================
@@ -102,6 +106,7 @@ deployed system contains the other. Since the baserock directory is in
every system, we can check for that.
AND tarball test.tar contains var/lib/sysroots/test-system/baserock
+ FINALLY the git server is shut down
Initramfs deployments
=====================
@@ -185,6 +190,7 @@ will mention the initramfs, and the UUID of the disk.
AND file mnt/extlinux.conf matches initramfs
AND file mnt/extlinux.conf matches root=UUID=
FINALLY mnt is unmounted
+ AND the git server is shut down
Partial deployments
===================
@@ -276,3 +282,4 @@ deployment.
WHEN the user attempts to deploy test-system.sysroot from cluster test-cluster.morph in branch master
THEN morph failed
+ FINALLY the git server is shut down
diff --git a/yarns/implementations.yarn b/yarns/implementations.yarn
index d2e72ccf..422c2eea 100644
--- a/yarns/implementations.yarn
+++ b/yarns/implementations.yarn
@@ -258,12 +258,25 @@ another to hold a chunk.
run_in "$DATADIR/gits/morphs" git commit -m Initial.
run_in "$DATADIR/gits/morphs" git tag -a "test-tag" -m "Tagging test-tag"
+ # Start a git daemon to serve our git repositories
+ port_file="$DATADIR/git-daemon-port"
+ pid_file="$DATADIR/git-daemon-pid"
+ mkfifo "$port_file"
+ # git-daemon needs --foo=bar style arguments so we do that for consistency
+ start-stop-daemon --start --pidfile="$pid_file" --background \
+ --make-pidfile --verbose \
+ --startas="$SRCDIR/scripts/git-daemon-wrap" -- \
+ --port-file="$port_file" \
+ --export-all --verbose --base-path="$DATADIR/gits" \
+ --enable=receive-pack #allow push
+ GIT_DAEMON_PORT="$(cat "$port_file")"
+
# Create the Morph configuration file so we can access the repos
# using test:foo URL aliases.
cat << EOF > "$DATADIR/morph.conf"
[config]
- repo-alias = test=file://$DATADIR/gits/%s#file://$DATADIR/gits/%s
+ repo-alias = test=git://127.0.0.1:$GIT_DAEMON_PORT/%s#git://127.0.0.1:$GIT_DAEMON_PORT/%s
cachedir = $DATADIR/cache
tempdir = $DATADIR/tmp
trove-host= []
@@ -272,6 +285,15 @@ another to hold a chunk.
mkdir "$DATADIR/cache"
mkdir "$DATADIR/tmp"
+Some resources are cleaned up by yarn, forked processes aren't one of
+these, so need to shut down the git daemon after we finish.
+
+ IMPLEMENTS FINALLY the git server is shut down
+ pid_file="$DATADIR/git-daemon-pid"
+ if [ -e "$pid_file" ]; then
+ start-stop-daemon --stop --pidfile "$pid_file" --oknodo
+ fi
+
We need a consistent value for the architecture in some tests, so we
have a morphology using the test architecture.
@@ -383,7 +405,8 @@ Attempt to branch a system branch from a root that had no systems.
Pushing all changes in a system branch checkout to the git server.
IMPLEMENTS WHEN the user pushes the system branch called (\S+) to the git server
- run_in "$DATADIR/workspace/$MATCH_1/" morph foreach -- sh -c 'git push -u origin HEAD 2>&1'
+ cd "$DATADIR/workspace/$MATCH_1/"
+ run_morph foreach -- sh -c 'git push -u origin HEAD 2>&1'
Report workspace path.
diff --git a/yarns/regression.yarn b/yarns/regression.yarn
index 6f499d90..7991ab12 100644
--- a/yarns/regression.yarn
+++ b/yarns/regression.yarn
@@ -11,6 +11,7 @@ Testing if we can build after checking out from a tag.
AND a git server
WHEN the user checks out the system tag called test-tag
THEN morph build the system systems/test-system.morph of the tag test-tag
+ FINALLY the git server is shut down
Running `morph branch` when the branch directory exists doesn't
@@ -32,6 +33,7 @@ The branch is checked out correctly, now it should fail if the user executes
The branch still checked out.
AND the system branch foo is checked out
+ FINALLY the git server is shut down
It doesn't make much sense to be able to build a system with only
@@ -45,6 +47,7 @@ area, hence their results cannot be trusted.
WHEN the user checks out the system branch called master
AND the user attempts to build the system bootstrap-system.morph in branch master
THEN the build error message includes the string "No non-bootstrap chunks found"
+ FINALLY the git server is shut down
When we started allowing multiple artifacts, a long-standing bug in
cache-key computation was discovered, it didn't include artifact names,
@@ -67,6 +70,7 @@ source it depended on.
WHEN the user builds the system systems/test-system.morph in branch master
AND the user deploys the cluster test-cluster.morph in branch master with options test-system.location="$DATADIR/test.tar"
THEN tarball test.tar contains baserock/test-chunk-misc.meta
+ FINALLY the git server is shut down
Implementations
diff --git a/yarns/splitting.yarn b/yarns/splitting.yarn
index d4b942d8..9248f60c 100644
--- a/yarns/splitting.yarn
+++ b/yarns/splitting.yarn
@@ -24,6 +24,7 @@ result, so much as it succeeding to build something.
WHEN the user checks out the system branch called master
THEN morph build the system systems/test-system.morph of the branch master
+ FINALLY the git server is shut down
Smaller systems
---------------
@@ -82,6 +83,7 @@ chunks that were needed.
AND system systems/test-system.morph uses test-stratum-minimal from test-stratum
WHEN the user checks out the system branch called master
THEN morph build the system systems/test-system.morph of the branch master
+ FINALLY the git server is shut down
Implementations