summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2014-08-12 18:09:13 +0100
committerRichard Maw <richard.maw@codethink.co.uk>2014-08-12 18:09:13 +0100
commitb2786c73c0f4d4b76f824e309598ce57065e30ab (patch)
tree1e18a61d37da2da8ba19ef39eae1265185a13e75
parent6241d4466599406e3ad0a176c70fcbecdfdd1b64 (diff)
parent0f9c9e2ff3c9afe00735fa986200ac5fdcc8f79e (diff)
downloadmorph-baserock/richardmaw/tmp.tar.gz
Merge branch 'baserock/richardmaw/misc-fixups'baserock/richardmaw/tmp
Reviewed-by: Daniel Silverstone Reviewed-by: Pedro Alvarez
-rw-r--r--doc/branching-merging-systems.mdwn32
-rw-r--r--morphlib/gitdir.py13
-rw-r--r--morphlib/morphset.py14
-rw-r--r--morphlib/morphset_tests.py15
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py119
-rw-r--r--morphlib/sysbranchdir.py38
-rwxr-xr-xtests.as-root/unimportant-morphology-contents-do-not-change-cache-keys.script45
-rwxr-xr-xtests.branching.disabled/workflow-petrify.script67
-rw-r--r--tests.branching.disabled/workflow-petrify.stdout152
-rwxr-xr-xtests.branching/ambiguous-refs.script46
-rwxr-xr-xtests.branching/build-after-petrify.script31
-rwxr-xr-xtests.branching/petrify-no-double-petrify.script34
-rw-r--r--tests.branching/petrify-no-double-petrify.stdout9
-rwxr-xr-xtests.branching/petrify.script42
-rw-r--r--tests.branching/petrify.stdout31
-rwxr-xr-xtests.branching/show-branch-root-in-branched-branch.script30
-rw-r--r--tests.branching/show-branch-root-in-branched-branch.stdout1
-rwxr-xr-xtests.branching/show-branch-root-in-checked-out-branch.script30
-rw-r--r--tests.branching/show-branch-root-in-checked-out-branch.stdout1
-rwxr-xr-xtests.branching/show-branch-root-with-repo-url.script30
-rw-r--r--tests.branching/show-branch-root-with-repo-url.stdout1
-rw-r--r--yarns/branches-workspaces.yarn57
-rw-r--r--yarns/implementations.yarn103
-rw-r--r--yarns/regression.yarn3
-rw-r--r--yarns/splitting.yarn9
25 files changed, 105 insertions, 848 deletions
diff --git a/doc/branching-merging-systems.mdwn b/doc/branching-merging-systems.mdwn
index c2e24d77..3bc19aab 100644
--- a/doc/branching-merging-systems.mdwn
+++ b/doc/branching-merging-systems.mdwn
@@ -129,7 +129,7 @@ Also, clone the `morphs` git repository inside the system branch
directory.
cd ~/baserock/liw/foo/morphs
- morph petrify base-system.morph devel-system.morph
+ edit base-system.morph devel-system.morph
git commit -a
Modify the specified morphologies (or the stratum morphologies they
@@ -225,36 +225,6 @@ it to exist instead.
* Run `git checkout BRANCH` in the `morphs` repository.
-Implementation: `morph petrify`
---------------
-
-Usage:
-
- morph petrify [MORPH]...
- morph petrify --petrify-from-system FILE
-
-This needs to be run in the `morphs` git repository in a system branch.
-
-In the first form:
-
-* read each of the given morphologies; if the morphology is a system one,
- follow references to stratum morphologies and process those instead
-* in each stratum morphology, replace a reference to a chunk with the
- absolute SHA-1: if the original reference was, say, `baserock/morph`,
- get the SHA-1 of the current tip commit in that branch and replace
- the reference in the morphology
-
-In the second form:
-
-* extract the system and stratum morphologies used in the system image file;
- these are in a petrified form already
-* copy the morphologies to the current working directory, overwriting the
- files from git
-
-In either case, the results need to be committed (with normal git commands)
-by the user.
-
-
Implementation: `morph edit`
--------------
diff --git a/morphlib/gitdir.py b/morphlib/gitdir.py
index 3966a0f0..fea26c2e 100644
--- a/morphlib/gitdir.py
+++ b/morphlib/gitdir.py
@@ -495,8 +495,17 @@ class GitDirectory(object):
raise InvalidRefError(self, ref)
def disambiguate_ref(self, ref): # pragma: no cover
- out = self._runcmd(['git', 'rev-parse', '--symbolic-full-name', ref])
- return out.strip()
+ try:
+ out = self._runcmd(['git', 'rev-parse', '--symbolic-full-name',
+ ref])
+ return out.strip()
+ except cliapp.AppException: # ref not found
+ if ref.startswith('refs/heads/'):
+ return ref
+ elif ref.startswith('heads/'):
+ return 'refs/' + ref
+ else:
+ return 'refs/heads/' + ref
def resolve_ref_to_commit(self, ref):
return self._rev_parse('%s^{commit}' % ref)
diff --git a/morphlib/morphset.py b/morphlib/morphset.py
index 590ac51e..fa525973 100644
--- a/morphlib/morphset.py
+++ b/morphlib/morphset.py
@@ -243,17 +243,3 @@ class MorphologySet(object):
return True
self.traverse_specs(process_chunk_spec, wanted_chunk_spec)
-
- def unpetrify_all(self):
- '''If a spec is petrified, unpetrify it.
-
- '''
-
- def wanted_spec(m, kind, spec):
- return ('unpetrify-ref' in spec and
- morphlib.git.is_valid_sha1(spec.get('ref')))
- def process_spec(m, kind, spec):
- spec['ref'] = spec.pop('unpetrify-ref')
- return True
-
- self.traverse_specs(process_spec, wanted_spec)
diff --git a/morphlib/morphset_tests.py b/morphlib/morphset_tests.py
index 8679c64a..af1333d8 100644
--- a/morphlib/morphset_tests.py
+++ b/morphlib/morphset_tests.py
@@ -200,18 +200,3 @@ class MorphologySetTests(unittest.TestCase):
'unpetrify-ref': 'master',
}
])
-
- def test_unpetrify_all(self):
- self.morphs.add_morphology(self.system)
- self.morphs.add_morphology(self.stratum)
- self.morphs.petrify_chunks({('test:foo-chunk', 'master'): '0'*40})
- self.morphs.unpetrify_all()
- self.assertEqual(
- self.stratum['chunks'],
- [
- {
- 'repo': 'test:foo-chunk',
- 'ref': 'master',
- 'morph': 'foo-chunk',
- }
- ])
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index a66098b8..a258cd70 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -38,10 +38,6 @@ class BranchAndMergePlugin(cliapp.Plugin):
self.app.add_subcommand(
'edit', self.edit, arg_synopsis='SYSTEM STRATUM [CHUNK]')
self.app.add_subcommand(
- 'petrify', self.petrify, arg_synopsis='')
- self.app.add_subcommand(
- 'unpetrify', self.unpetrify, arg_synopsis='')
- self.app.add_subcommand(
'show-system-branch', self.show_system_branch, arg_synopsis='')
self.app.add_subcommand(
'show-branch-root', self.show_branch_root, arg_synopsis='')
@@ -313,9 +309,17 @@ class BranchAndMergePlugin(cliapp.Plugin):
cached_repo = lrc.get_updated_repo(chunk_url)
gd = sb.clone_cached_repo(cached_repo, chunk_ref)
- if chunk_ref != sb.system_branch_name:
- gd.branch(sb.system_branch_name, chunk_ref)
- gd.checkout(sb.system_branch_name)
+ system_branch_ref = gd.disambiguate_ref(sb.system_branch_name)
+ sha1 = gd.resolve_ref_to_commit(chunk_ref)
+
+ try:
+ old_sha1 = gd.resolve_ref_to_commit(system_branch_ref)
+ except morphlib.gitdir.InvalidRefError as e:
+ pass
+ else:
+ gd.delete_ref(system_branch_ref, old_sha1)
+ gd.branch(sb.system_branch_name, sha1)
+ gd.checkout(sb.system_branch_name)
gd.update_submodules(self.app)
gd.update_remotes()
if gd.has_fat():
@@ -377,16 +381,17 @@ class BranchAndMergePlugin(cliapp.Plugin):
This would, for example, write out something like:
- /src/ws/master/baserock:baserock/morphs
+ /src/ws/master/baserock/baserock/definitions
- when the master branch of the `baserock:baserock/morphs`
+ when the master branch of the `baserock/baserock/definitions`
repository is checked out.
'''
ws = morphlib.workspace.open('.')
sb = morphlib.sysbranchdir.open_from_within('.')
- self.app.output.write('%s\n' % sb.get_config('branch.root'))
+ repo_url = sb.get_config('branch.root')
+ self.app.output.write('%s\n' % sb.get_git_directory_name(repo_url))
def _remove_branch_dir_safe(self, workspace_root, system_branch_root):
# This function avoids throwing any exceptions, so it is safe to call
@@ -486,100 +491,6 @@ class BranchAndMergePlugin(cliapp.Plugin):
morphs.add_morphology(morph)
return morphs
- def petrify(self, args):
- '''Convert all chunk refs in a system branch to be fixed SHA1s.
-
- This modifies all git commit references in system and stratum
- morphologies, in the current system branch, to be fixed SHA
- commit identifiers, rather than symbolic branch or tag names.
- This is useful for making sure none of the components in a system
- branch change accidentally.
-
- Consider the following scenario:
-
- * The `master` system branch refers to `gcc` using the
- `baserock/morph` ref. This is appropriate, since the main line
- of development should use the latest curated code.
-
- * You create a system branch to prepare for a release, called
- `TROVE_ID/release/2.0`. The reference to `gcc` is still
- `baserock/morph`.
-
- * You test everything, and make a release. You deploy the release
- images onto devices, which get shipped to your customers.
-
- * A new version GCC is committed to the `baserock/morph` branch.
-
- * Your release branch suddenly uses a new compiler, which may
- or may not work for your particular system at that release.
-
- To avoid this, you need to _petrify_ all git references
- so that they do not change accidentally. If you've tested
- your release with the GCC release that is stored in commit
- `94c50665324a7aeb32f3096393ec54b2e63bfb28`, then you should
- continue to use that version of GCC, regardless of what might
- happen in the master system branch. If, and only if, you decide
- that a new compiler would be good for your release should you
- include it in your release branch. This way, only the things
- that you change intentionally change in your release branch.
-
- '''
-
- if args:
- raise cliapp.AppException('morph petrify takes no arguments')
-
- ws = morphlib.workspace.open('.')
- sb = morphlib.sysbranchdir.open_from_within('.')
- loader = morphlib.morphloader.MorphologyLoader()
- lrc, rrc = morphlib.util.new_repo_caches(self.app)
- update_repos = not self.app.settings['no-git-update']
-
- morphs = self._load_all_sysbranch_morphologies(sb, loader)
-
- #TODO: Stop using app.resolve_ref
- def resolve_refs(morphs):
- for repo, ref in morphs.list_refs():
- # You can't resolve null refs, so don't attempt to.
- if repo is None or ref is None:
- continue
- # TODO: Handle refs that are only in workspace in general
- if (repo == sb.root_repository_url
- and ref == sb.system_branch_name):
- continue
- commit_sha1, tree_sha1 = self.app.resolve_ref(
- lrc, rrc, repo, ref, update=update_repos)
- yield ((repo, ref), commit_sha1)
-
- morphs.repoint_refs(sb.root_repository_url,
- sb.system_branch_name)
-
- morphs.petrify_chunks(dict(resolve_refs(morphs)))
-
- # Write morphologies back out again.
- self._save_dirty_morphologies(loader, sb, morphs.morphologies)
-
- def unpetrify(self, args):
- '''Reverse the process of petrification.
-
- This undoes the changes `morph petrify` did.
-
- '''
-
- if args:
- raise cliapp.AppException('morph petrify takes no arguments')
-
- ws = morphlib.workspace.open('.')
- sb = morphlib.sysbranchdir.open_from_within('.')
- loader = morphlib.morphloader.MorphologyLoader()
-
- morphs = self._load_all_sysbranch_morphologies(sb, loader)
-
- # Restore the ref for each stratum and chunk
- morphs.unpetrify_all()
-
- # Write morphologies back out again.
- self._save_dirty_morphologies(loader, sb, morphs.morphologies)
-
def status(self, args):
'''Show information about the current system branch or workspace
diff --git a/morphlib/sysbranchdir.py b/morphlib/sysbranchdir.py
index b8953c2f..19fba695 100644
--- a/morphlib/sysbranchdir.py
+++ b/morphlib/sysbranchdir.py
@@ -68,19 +68,13 @@ class SystemBranchDirectory(object):
value = cliapp.runcmd(['git', 'config', '-f', self._config_path, key])
return value.strip()
- def get_git_directory_name(self, repo_url):
- '''Return directory pathname for a given git repository.
-
- If the URL is a real one (not aliased), the schema and leading //
- are removed from it, as is a .git suffix.
-
- Any colons in the URL path or network location are replaced
- with slashes, so that directory paths do not contain colons.
- This avoids problems with PYTHONPATH, PATH, and other things
- that use colon as a separator.
-
- '''
+ def _find_git_directory(self, repo_url):
+ for gd in self.list_git_directories():
+ if gd.get_config('morph.repository') == repo_url:
+ return gd.dirname
+ return None
+ def _fabricate_git_directory_name(self, repo_url):
# Parse the URL. If the path component is absolute, we assume
# it's a real URL; otherwise, an aliased URL.
parts = urlparse.urlparse(repo_url)
@@ -107,6 +101,26 @@ class SystemBranchDirectory(object):
return os.path.join(self.root_directory, relative)
+ def get_git_directory_name(self, repo_url):
+ '''Return directory pathname for a given git repository.
+
+ If the repository has already been cloned, then it returns the
+ path to that, if not it will fabricate a path based on the url.
+
+ If the URL is a real one (not aliased), the schema and leading //
+ are removed from it, as is a .git suffix.
+
+ Any colons in the URL path or network location are replaced
+ with slashes, so that directory paths do not contain colons.
+ This avoids problems with PYTHONPATH, PATH, and other things
+ that use colon as a separator.
+
+ '''
+ found_repo = self._find_git_directory(repo_url)
+ if not found_repo:
+ return self._fabricate_git_directory_name(repo_url)
+ return found_repo
+
def get_filename(self, repo_url, relative):
'''Return full pathname to a file in a checked out repository.
diff --git a/tests.as-root/unimportant-morphology-contents-do-not-change-cache-keys.script b/tests.as-root/unimportant-morphology-contents-do-not-change-cache-keys.script
deleted file mode 100755
index a540cdee..00000000
--- a/tests.as-root/unimportant-morphology-contents-do-not-change-cache-keys.script
+++ /dev/null
@@ -1,45 +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.
-
-## Some contents of morphologies (description, build-depends, chunks)
-## should not change the cache keys of those morphs because they are
-## either already considered (build-depends and chunks) or do not affect
-## building (description). This test checks that changes to these parts
-## of a morphology do not force rebuilds.
-
-# 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 once.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" build linux-system
-ARTIFACT_COUNT="$(ls "$DATADIR/cache/artifacts" | wc -l)"
-
-# Petrify the refs, so the morphologies will be different
-(set -e && cd branch1/test/morphs && git push --quiet origin HEAD)
-(set -e && cd branch1/test/kernel-repo && git push --quiet origin HEAD)
-"$SRCDIR/scripts/test-morph" petrify
-
-# Build with the petrified morphologies.
-"$SRCDIR/scripts/test-morph" build linux-system
-[ "$ARTIFACT_COUNT" -eq $(ls "$DATADIR/cache/artifacts" | wc -l) ]
diff --git a/tests.branching.disabled/workflow-petrify.script b/tests.branching.disabled/workflow-petrify.script
deleted file mode 100755
index 3c561d5b..00000000
--- a/tests.branching.disabled/workflow-petrify.script
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# 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.
-
-
-## Do a complete workflow test, with strata outside the main morphologies
-## repository.
-
-set -eu
-
-. "$SRCDIR/scripts/setup-3rd-party-strata"
-
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" branch test:morphs test/petrify
-
-cd test/petrify
-"$SRCDIR/scripts/test-morph" petrify
-
-echo "test/petrify after petrifying:"
-cat test:morphs/hello-system.morph
-cat test:external-strata/stratum2.morph
-cat test:external-strata/stratum3.morph
-
-"$SRCDIR/scripts/test-morph" edit hello
-
-echo
-echo "test/petrify after editing a chunk:"
-cat test:morphs/hello-system.morph
-cat test:external-strata/stratum2.morph
-cat test:external-strata/stratum3.morph
-
-# me/readme-fixes in test:stratum2-hello should be 'master', but
-# that's the only ref upstream so we can infer that it is if we got here
-
-cd test:morphs
-git commit --quiet --all -m "Petrify branch test/petrify"
-git push --quiet origin test/petrify
-cd ../test:external-strata
-git commit --quiet --all -m "Petrify branch test/petrify"
-git push --quiet origin test/petrify
-
-# unpetrify is easy enough. Let's try unpetrifying a different branch that
-# was forked off the original while it was petrified, instead.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" branch test:morphs test/unpetrify test/petrify
-
-cd test/unpetrify
-"$SRCDIR/scripts/test-morph" unpetrify
-
-echo
-echo "test/unpetrify after unpetrifying:"
-cat test:morphs/hello-system.morph
-cat test:external-strata/stratum2.morph
-cat test:external-strata/stratum3.morph
diff --git a/tests.branching.disabled/workflow-petrify.stdout b/tests.branching.disabled/workflow-petrify.stdout
deleted file mode 100644
index a0ce82f4..00000000
--- a/tests.branching.disabled/workflow-petrify.stdout
+++ /dev/null
@@ -1,152 +0,0 @@
-test/petrify after petrifying:
-{
- "name": "hello-system",
- "kind": "system",
- "arch": "x86_64",
- "strata": [
- {
- "morph": "hello-stratum",
- "repo": "test:morphs",
- "ref": "test/petrify"
- },
- {
- "morph": "stratum2",
- "repo": "test:external-strata",
- "ref": "test/petrify"
- },
- {
- "morph": "stratum3",
- "repo": "test:external-strata",
- "ref": "test/petrify"
- }
- ]
-}
-{
- "name": "stratum2",
- "kind": "stratum",
- "chunks": [
- {
- "name": "hello",
- "repo": "test:stratum2-hello",
- "ref": "f4730636e429149bb923fa16be3aa9802d484b23",
- "build-mode": "test",
- "build-depends": [],
- "unpetrify-ref": "master"
- }
- ]
-}
-{
- "name": "stratum3",
- "kind": "stratum",
- "chunks": [
- {
- "name": "hello",
- "repo": "test:stratum3-hello",
- "ref": "f4730636e429149bb923fa16be3aa9802d484b23",
- "build-mode": "test",
- "build-depends": [],
- "unpetrify-ref": "master"
- }
- ]
-}
-
-test/petrify after editing a chunk:
-{
- "name": "hello-system",
- "kind": "system",
- "arch": "x86_64",
- "strata": [
- {
- "morph": "hello-stratum",
- "repo": "test:morphs",
- "ref": "test/petrify"
- },
- {
- "morph": "stratum2",
- "repo": "test:external-strata",
- "ref": "test/petrify"
- },
- {
- "morph": "stratum3",
- "repo": "test:external-strata",
- "ref": "test/petrify"
- }
- ]
-}
-{
- "name": "stratum2",
- "kind": "stratum",
- "chunks": [
- {
- "name": "hello",
- "repo": "test:stratum2-hello",
- "ref": "test/petrify",
- "build-mode": "test",
- "build-depends": []
- }
- ]
-}
-{
- "name": "stratum3",
- "kind": "stratum",
- "chunks": [
- {
- "name": "hello",
- "repo": "test:stratum3-hello",
- "ref": "f4730636e429149bb923fa16be3aa9802d484b23",
- "build-mode": "test",
- "build-depends": [],
- "unpetrify-ref": "master"
- }
- ]
-}
-
-test/unpetrify after unpetrifying:
-{
- "name": "hello-system",
- "kind": "system",
- "arch": "x86_64",
- "strata": [
- {
- "morph": "hello-stratum",
- "repo": "test:morphs",
- "ref": "test/unpetrify"
- },
- {
- "morph": "stratum2",
- "repo": "test:external-strata",
- "ref": "test/unpetrify"
- },
- {
- "morph": "stratum3",
- "repo": "test:external-strata",
- "ref": "test/unpetrify"
- }
- ]
-}
-{
- "name": "stratum2",
- "kind": "stratum",
- "chunks": [
- {
- "name": "hello",
- "repo": "test:stratum2-hello",
- "ref": "test/petrify",
- "build-mode": "test",
- "build-depends": []
- }
- ]
-}
-{
- "name": "stratum3",
- "kind": "stratum",
- "chunks": [
- {
- "name": "hello",
- "repo": "test:stratum3-hello",
- "ref": "master",
- "build-mode": "test",
- "build-depends": []
- }
- ]
-}
diff --git a/tests.branching/ambiguous-refs.script b/tests.branching/ambiguous-refs.script
deleted file mode 100755
index aeec61a1..00000000
--- a/tests.branching/ambiguous-refs.script
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-#
-# 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.
-
-
-## Guard against a bug that occurs if 'git show-ref' is used to resolve refs
-## instead of 'git rev-parse --verify': show-ref returns a list of partial
-## matches sorted alphabetically, so any code using it may resolve refs
-## incorrectly.
-
-set -eu
-
-. "$SRCDIR/scripts/fix-committer-info"
-
-cd "$DATADIR/morphs"
-git mv hello-stratum.morph goodbye-stratum.morph
-sed -e '/morph: hello-stratum/s/hello-stratum/goodbye-stratum/' \
- -i hello-system.morph
-
-git commit --quiet -am "Rename hello-system"
-
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" branch test:morphs release
-
-# Create an extra ref to confuse any users of git show-ref
-cd release/test/morphs
-git checkout --quiet -b alpha/master HEAD~1
-git checkout --quiet release
-
-# The petrify will fail if we resolved 'master' as 'alpha/master' by mistake.
-cd "$DATADIR/workspace/release/test/morphs"
-"$SRCDIR/scripts/test-morph" petrify
diff --git a/tests.branching/build-after-petrify.script b/tests.branching/build-after-petrify.script
deleted file mode 100755
index d3b75f07..00000000
--- a/tests.branching/build-after-petrify.script
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-#
-# Copyright (C) 2013 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.
-
-
-## Verify systems can be built after "morph petrify"
-
-set -eu
-
-. "$SRCDIR/tests.branching/setup-second-chunk"
-
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" branch test:morphs test/build-petrify master
-
-"$SRCDIR/scripts/test-morph" petrify
-
-"$SRCDIR/scripts/test-morph" build hello-system
diff --git a/tests.branching/petrify-no-double-petrify.script b/tests.branching/petrify-no-double-petrify.script
deleted file mode 100755
index 3c9185dc..00000000
--- a/tests.branching/petrify-no-double-petrify.script
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-#
-# 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.
-
-
-## It should be impossible to lose the original refs, or we risk making
-## unpetrify impossible.
-
-set -eu
-
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" branch test:morphs test/petrify
-
-cd test/petrify/test/morphs
-git push --quiet origin HEAD
-"$SRCDIR/scripts/test-morph" petrify
-"$SRCDIR/scripts/test-morph" petrify
-"$SRCDIR/scripts/test-morph" petrify
-
-cat hello-stratum.morph
diff --git a/tests.branching/petrify-no-double-petrify.stdout b/tests.branching/petrify-no-double-petrify.stdout
deleted file mode 100644
index 50da61ba..00000000
--- a/tests.branching/petrify-no-double-petrify.stdout
+++ /dev/null
@@ -1,9 +0,0 @@
-name: hello-stratum
-kind: stratum
-chunks:
-- name: hello
- repo: test:hello
- ref: 293fa0b08f0382c63181c36b6efa602876aa8c87
- unpetrify-ref: master
- build-depends: []
- build-mode: test
diff --git a/tests.branching/petrify.script b/tests.branching/petrify.script
deleted file mode 100755
index f8e7c1e9..00000000
--- a/tests.branching/petrify.script
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-#
-# 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.
-
-
-## Verify "morph petrify", and ensure it doesn't petrify chunks that have
-## already been edited.
-
-set -eu
-
-. "$SRCDIR/tests.branching/setup-second-chunk"
-
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" branch test:morphs test/petrify master
-
-cd test/petrify/test/morphs
-git push --quiet origin HEAD
-"$SRCDIR/scripts/test-morph" edit goodbye
-(cd ../goodbye && git push --quiet origin HEAD)
-
-"$SRCDIR/scripts/test-morph" petrify
-echo "Petrified:"
-cat hello-stratum.morph
-
-"$SRCDIR/scripts/test-morph" unpetrify
-echo
-echo "Unpetrified:"
-cat hello-stratum.morph
diff --git a/tests.branching/petrify.stdout b/tests.branching/petrify.stdout
deleted file mode 100644
index f9f35342..00000000
--- a/tests.branching/petrify.stdout
+++ /dev/null
@@ -1,31 +0,0 @@
-Petrified:
-name: hello-stratum
-kind: stratum
-chunks:
-- name: hello
- repo: test:hello
- ref: 293fa0b08f0382c63181c36b6efa602876aa8c87
- unpetrify-ref: master
- build-depends: []
- build-mode: test
-- name: goodbye
- repo: test:goodbye
- ref: 717c4a523fb5a94ca2f0a61e665fbc2da6a1f6ac
- unpetrify-ref: test/petrify
- build-depends: []
- build-mode: test
-
-Unpetrified:
-name: hello-stratum
-kind: stratum
-chunks:
-- name: hello
- repo: test:hello
- ref: master
- build-depends: []
- build-mode: test
-- name: goodbye
- repo: test:goodbye
- ref: test/petrify
- build-depends: []
- build-mode: test
diff --git a/tests.branching/show-branch-root-in-branched-branch.script b/tests.branching/show-branch-root-in-branched-branch.script
deleted file mode 100755
index 4598d6a9..00000000
--- a/tests.branching/show-branch-root-in-branched-branch.script
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-#
-# Copyright (C) 2012 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.
-
-
-## Check that 'morph show-branch-root' works when being run in a
-## local system branch created using 'morph branch ...'.
-
-set -eu
-
-# Create a workspace and branch.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" branch test:morphs testbranch
-
-# Try to print the branch root repository.
-"$SRCDIR/scripts/test-morph" show-branch-root
diff --git a/tests.branching/show-branch-root-in-branched-branch.stdout b/tests.branching/show-branch-root-in-branched-branch.stdout
deleted file mode 100644
index b2804d56..00000000
--- a/tests.branching/show-branch-root-in-branched-branch.stdout
+++ /dev/null
@@ -1 +0,0 @@
-test:morphs
diff --git a/tests.branching/show-branch-root-in-checked-out-branch.script b/tests.branching/show-branch-root-in-checked-out-branch.script
deleted file mode 100755
index 97f892b9..00000000
--- a/tests.branching/show-branch-root-in-checked-out-branch.script
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-#
-# Copyright (C) 2012 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.
-
-
-## Check that 'morph show-branch-root' works when being run in a
-## local system branch created using 'morph checkout ...'.
-
-set -eu
-
-# Create a workspace and branch.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" checkout test:morphs master
-
-# Try to print the branch root repository.
-"$SRCDIR/scripts/test-morph" show-branch-root
diff --git a/tests.branching/show-branch-root-in-checked-out-branch.stdout b/tests.branching/show-branch-root-in-checked-out-branch.stdout
deleted file mode 100644
index b2804d56..00000000
--- a/tests.branching/show-branch-root-in-checked-out-branch.stdout
+++ /dev/null
@@ -1 +0,0 @@
-test:morphs
diff --git a/tests.branching/show-branch-root-with-repo-url.script b/tests.branching/show-branch-root-with-repo-url.script
deleted file mode 100755
index 5480c3ef..00000000
--- a/tests.branching/show-branch-root-with-repo-url.script
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-#
-# Copyright (C) 2012 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.
-
-
-## Check that 'morph show-branch-root' works when being run in a
-## local system branch created from a full repository URL.
-
-set -eu
-
-# Create a workspace and branch.
-cd "$DATADIR/workspace"
-"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" branch "file://${DATADIR}/morphs.git" testbranch
-
-# Try to print the branch root repository.
-"$SRCDIR/scripts/test-morph" show-branch-root
diff --git a/tests.branching/show-branch-root-with-repo-url.stdout b/tests.branching/show-branch-root-with-repo-url.stdout
deleted file mode 100644
index 2d47eb40..00000000
--- a/tests.branching/show-branch-root-with-repo-url.stdout
+++ /dev/null
@@ -1 +0,0 @@
-file://TMP/morphs.git
diff --git a/yarns/branches-workspaces.yarn b/yarns/branches-workspaces.yarn
index 642beadd..7c85d6e0 100644
--- a/yarns/branches-workspaces.yarn
+++ b/yarns/branches-workspaces.yarn
@@ -39,7 +39,7 @@ existing workspace, initialising it should fail.
WHEN the user attempts to initialise a workspace
THEN morph failed
-Checking out or branching system branches
+Checking out system branches
-----------------------------------------
Once we have a workspace, we can check out a system branch.
@@ -50,6 +50,12 @@ Once we have a workspace, we can check out a system branch.
WHEN the user checks out the system branch called master
THEN the system branch master is checked out
+Edit is probably not the best name for is, but we can use `morph edit`
+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
+
Checking out a system branch should fail, if the branch doesn't exist.
SCENARIO checking out a system branch that doesn't exist
@@ -58,6 +64,9 @@ Checking out a system branch should fail, if the branch doesn't exist.
WHEN the user attempts to check out the system branch called foo
THEN morph failed
+Branching system branches
+-----------------------------------------
+
We can, instead, create a new system branch, off master.
SCENARIO branch off master
@@ -142,19 +151,19 @@ current directory, things should fail.
AND the user attempts to report the system branch from the directory .
THEN morph failed
-`morph show-branch-root` reports the URL (possibly aliases) of the
-system branch root repository. It can be run inside a checkout, or
-somewhere outside a checkout, where exactly one checkout exists below.
+`morph show-branch-root` reports the path of the system branch root
+repository. It can be run inside a checkout, or somewhere outside a
+checkout, where exactly one checkout exists below.
SCENARIO morph reports system branch root repository
GIVEN a workspace
AND a git server
WHEN the user checks out the system branch called master
AND the user reports the system branch root repository from the directory master
- THEN the system branch root repository is reported as test:morphs
+ THEN the system branch root repository is reported as workspace/master/test/morphs
WHEN the user reports the system branch root repository from the directory .
- THEN the system branch root repository is reported as test:morphs
+ THEN the system branch root repository is reported as workspace/master/test/morphs
However, it fails if run outside a checkout and there's no system
branches checked out.
@@ -178,7 +187,6 @@ all the refs are unchanged.
GIVEN a workspace
AND a git server
WHEN the user creates a system branch called foo
- THEN in branch foo, stratum strata/test-stratum.morph refs test-chunk in master
Edit the chunk. We make use of special knowledge here: `test:test-chunk`
is a chunk repository created in the mocked git server, for testing
@@ -406,41 +414,6 @@ branch checkout.
THEN morph ran command in test/morphs in foo
AND morph ran command in test/test-chunk in foo
-Explicit petrification
-----------------------
-
-We petrify branches explicitly (though this may later change so that
-`morph branch` does it automatically). To test this, we create a branch,
-petrify it, and verify that every ref looks like a SHA1. We then
-unpetrify and verify that we have all the same refs as before.
-
- SCENARIO morph petrifies and unpetrifies
- GIVEN a workspace
- AND a git server
- WHEN the user creates a system branch called foo
- AND the user pushes the system branch called foo to the git server
- AND remembering all refs in foo
- AND petrifying foo
- THEN foo is petrified
-
-Petrifying 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
-
-Unpetrify must put the morphologies back in the same logical state they
-were in before.
-
- WHEN unpetrifying foo
- THEN foo refs are as remembered
-
-Unpetrifying 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
-
Generating a manifest works
SCENARIO morph generates a manifest
diff --git a/yarns/implementations.yarn b/yarns/implementations.yarn
index a28fda54..d2e72ccf 100644
--- a/yarns/implementations.yarn
+++ b/yarns/implementations.yarn
@@ -67,7 +67,28 @@ another to hold a chunk.
# Create a directory for all the git repositories.
mkdir "$DATADIR/gits"
- # Create a repo for the system and stratum morphologies.
+ # Create the chunk repository.
+
+ mkdir "$DATADIR/gits/test-chunk"
+
+ run_in "$DATADIR/gits/test-chunk" git init .
+ cat > "$DATADIR/gits/test-chunk/test-bin" <<'EOF'
+ #!/bin/sh
+ echo Hello World
+ EOF
+ cat > "$DATADIR/gits/test-chunk/test.h" <<'EOF'
+ int foo(void);
+ EOF
+ cat > "$DATADIR/gits/test-chunk/test.pc" <<'EOF'
+ prefix=/usr
+ includedir=${prefix}/include
+ Name: test
+ Cflags: -I{includedir}
+ EOF
+ run_in "$DATADIR/gits/test-chunk" git add .
+ run_in "$DATADIR/gits/test-chunk" git commit --allow-empty -m Initial.
+
+ # Create a repo for the morphologies.
mkdir "$DATADIR/gits/morphs"
@@ -88,15 +109,12 @@ another to hold a chunk.
- name: test-chunk
repo: test:test-chunk
morph: test-chunk.morph
- ref: master
+ unpetrify-ref: master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
build-mode: test
build-depends: []
EOF
- # Create the chunk repository.
-
- mkdir "$DATADIR/gits/test-chunk"
-
# To verify that chunk splitting works, we have a chunk that installs
# dummy files in all the places that different kinds of files are
# usually installed. e.g. executables in `/bin` and `/usr/bin`
@@ -240,23 +258,6 @@ 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"
- run_in "$DATADIR/gits/test-chunk" git init .
- cat > "$DATADIR/gits/test-chunk/test-bin" <<'EOF'
- #!/bin/sh
- echo Hello World
- EOF
- cat > "$DATADIR/gits/test-chunk/test.h" <<'EOF'
- int foo(void);
- EOF
- cat > "$DATADIR/gits/test-chunk/test.pc" <<'EOF'
- prefix=/usr
- includedir=${prefix}/include
- Name: test
- Cflags: -I{includedir}
- EOF
- run_in "$DATADIR/gits/test-chunk" git add .
- run_in "$DATADIR/gits/test-chunk" git commit --allow-empty -m Initial.
-
# Create the Morph configuration file so we can access the repos
# using test:foo URL aliases.
@@ -293,7 +294,8 @@ have a morphology using the test architecture.
- name: stage1-chunk
morph: stage1-chunk.morph
repo: test:test-chunk
- ref: master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
+ unpetrify-ref: master
build-mode: bootstrap
build-depends: []
EOF
@@ -307,7 +309,8 @@ have a morphology using the test architecture.
- name: test-chunk
morph: test-chunk.morph
repo: test:test-chunk
- ref: master
+ unpetrify-ref: master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
build-mode: test
build-depends: []
EOF
@@ -416,7 +419,7 @@ Report system branch root repository.
else attempt_morph show-branch-root > "$@"; fi
IMPLEMENTS THEN the system branch root repository is reported as (.*)
- echo "$MATCH_1" > "$DATADIR/branch-root.actual"
+ echo "$DATADIR/$MATCH_1" > "$DATADIR/branch-root.actual"
diff -u "$DATADIR/branch-root.actual" "$DATADIR/branch-root.reported"
Editing morphologies with `morph edit`.
@@ -518,54 +521,6 @@ Running shell command in each checked out repository:
grep -Fx "$MATCH_1" "$DATADIR/morph.stdout"
grep -Fx "$DATADIR/workspace/$MATCH_2/$MATCH_1" "$DATADIR/morph.stdout"
-Petrification and unpetrification:
-
- IMPLEMENTS WHEN remembering all refs in (\S+)
- cd "$DATADIR/workspace/$MATCH_1/test/morphs"
- list_refs $(find . -type f) > "$DATADIR/refs.remembered"
-
- IMPLEMENTS THEN (\S+) refs are as remembered
- cd "$DATADIR/workspace/$MATCH_1/test/morphs"
-
- # FIXME: petrify/unpetrify doesn't work quite right at this time:
- # petrify can change a ref to a stratum to point at the system
- # branch, but does it without adding an unpetrify-ref, and so
- # unpetrify doesn't undo the change. We ignore this bug for the
- # time being, in order to make the test suite pass. When the
- # petrification code has been cleaned up to not be so hairy,
- # we'll fix the test and the code.
- #
- # We would like to verify the result like this:
- #
- # list_refs $(find . -type f) > "$DATADIR/refs.now"
- # diff -u "$DATADIR/refs.remembered" "$DATADIR/refs.now"
- #
- # However, due to the bug, we have to do it in a more complicated
- # manner.
-
- list_refs $(find . -type f) |
- while read filename ref
- do
- orig=$(awk -v "f=$filename" '$1 == f { print $2 }' \
- "$DATADIR/refs.remembered")
- if [ "$orig" != "$ref" ] && [ "$ref" != "$MATCH_1" ]
- then
- die "Un-petrified ref: $filename $ref (should be $orig)"
- fi
- done
-
- IMPLEMENTS WHEN petrifying (\S+)
- cd "$DATADIR/workspace/$MATCH_1/test/morphs"
- run_morph petrify
-
- IMPLEMENTS WHEN unpetrifying (\S+)
- cd "$DATADIR/workspace/$MATCH_1/test/morphs"
- run_morph unpetrify
-
- IMPLEMENTS THEN (\S+) is petrified
- cd "$DATADIR/workspace/$MATCH_1/test/morphs"
- assert_morphologies_are_petrified "$MATCH_1" $(find . -type f)
-
Generating a manifest.
IMPLEMENTS GIVEN a system artifact
diff --git a/yarns/regression.yarn b/yarns/regression.yarn
index e5b3d875..6f499d90 100644
--- a/yarns/regression.yarn
+++ b/yarns/regression.yarn
@@ -90,7 +90,8 @@ Implementations
- name: bootstrap-chunk
morph: bootstrap-chunk.morph
repo: test:test-chunk
- ref: master
+ unpetrify-ref: master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
build-mode: bootstrap
build-depends: []
EOF
diff --git a/yarns/splitting.yarn b/yarns/splitting.yarn
index 1b67a881..d4b942d8 100644
--- a/yarns/splitting.yarn
+++ b/yarns/splitting.yarn
@@ -141,7 +141,8 @@ Implementations
chunks:
- name: test-chunk
repo: test:test-chunk
- ref: master
+ unpetrify-ref: master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
morph: test-chunk.morph
build-mode: test
build-depends: []
@@ -189,13 +190,15 @@ Implementations
chunks:
- name: test-chunk
repo: test:test-chunk
- ref: master
morph: test-chunk.morph
+ unpetrify-ref: master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
build-mode: test
build-depends: []
- name: unbuildable-chunk
repo: test:test-chunk
- ref: refs/heads/master
+ unpetrify-ref: refs/heads/master
+ ref: $(run_in "$DATADIR/gits/test-chunk" git rev-parse master)
morph: unbuildable-chunk.morph
build-mode: test
build-depends: