summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/buildbranch.py23
-rw-r--r--morphlib/definitions_repo.py27
-rw-r--r--morphlib/definitions_version.py2
-rw-r--r--morphlib/morphologyfinder.py2
-rw-r--r--morphlib/morphologyfinder_tests.py10
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py6
-rw-r--r--morphlib/plugins/diff_plugin.py2
-rw-r--r--morphlib/plugins/get_chunk_details_plugin.py3
-rw-r--r--morphlib/plugins/get_repo_plugin.py3
-rw-r--r--morphlib/sysbranchdir.py7
-rwxr-xr-xtests.branching/add-then-edit.script1
-rw-r--r--tests.branching/branch-creates-new-system-branch-not-from-master.stdout1
-rw-r--r--tests.branching/branch-creates-new-system-branch.stdout1
-rw-r--r--tests.branching/branch-works-anywhere.stdout10
-rw-r--r--tests.branching/checkout-existing-branch.stdout1
-rw-r--r--tests.branching/checkout-works-anywhere.stdout3
-rw-r--r--tests.branching/edit-checkouts-existing-chunk.stdout2
-rw-r--r--tests.branching/edit-updates-stratum.stdout5
-rwxr-xr-xtests.branching/setup11
-rwxr-xr-xtests.branching/setup-second-chunk3
20 files changed, 82 insertions, 41 deletions
diff --git a/morphlib/buildbranch.py b/morphlib/buildbranch.py
index e16bf2b4..6cec97fb 100644
--- a/morphlib/buildbranch.py
+++ b/morphlib/buildbranch.py
@@ -159,27 +159,31 @@ class BuildBranch(object):
sha1 = gd.store_blob(loader.save_to_string(morphology))
yield 0o100644, sha1, morphology.filename
+ def get_morphology_loader(self):
+ if self._sb:
+ return self._sb.get_morphology_loader()
+ else:
+ return self._root.get_morphology_loader()
+
def load_all_morphologies(self, loader):
if self._sb:
- return self._sb.load_all_morphologies(loader)
+ return self._sb.load_all_morphologies()
else:
- return self._root.load_all_morphologies(loader)
+ return self._root.load_all_morphologies()
- def inject_build_refs(self, loader, use_local_repos,
- inject_cb=lambda **kwargs: None):
+ def inject_build_refs(self, use_local_repos, inject_cb=lambda **kwargs:
+ None):
'''Update system and stratum morphologies to point to our branch.
For all edited repositories, this alter the temporary GitIndex
of the morphs repositories to point their temporary build branch
versions.
- `loader` is a MorphologyLoader that is used to convert morphology
- files into their in-memory representations and back again.
-
'''
root_repo = self._root.remote_url
root_ref = self._root.HEAD
morphs = morphlib.morphset.MorphologySet()
+ loader = self.get_morphology_loader()
for morph in self.load_all_morphologies(loader):
morphs.add_morphology(morph)
@@ -362,7 +366,7 @@ class BuildBranch(object):
@contextlib.contextmanager
-def pushed_build_branch(bb, loader, changes_need_pushing, name, email,
+def pushed_build_branch(bb, changes_need_pushing, name, email,
build_uuid, status):
with contextlib.closing(bb) as bb:
def report_add(gd, build_ref, changed):
@@ -385,8 +389,7 @@ def pushed_build_branch(bb, loader, changes_need_pushing, name, email,
status(msg='Injecting temporary build refs '\
'into morphologies in %(dirname)s',
dirname=gd.dirname, chatty=True)
- bb.inject_build_refs(loader=loader,
- use_local_repos=not changes_need_pushing,
+ bb.inject_build_refs(use_local_repos=not changes_need_pushing,
inject_cb=report_inject)
def report_commit(gd, build_ref):
diff --git a/morphlib/definitions_repo.py b/morphlib/definitions_repo.py
index c1381af6..53328e85 100644
--- a/morphlib/definitions_repo.py
+++ b/morphlib/definitions_repo.py
@@ -124,10 +124,8 @@ class DefinitionsRepo(gitdir.GitDirectory):
bb = morphlib.buildbranch.BuildBranch(
build_ref_prefix, uuid, definitions_repo=self)
- loader = morphlib.morphloader.MorphologyLoader()
pbb = morphlib.buildbranch.pushed_build_branch(
- bb, loader=loader,
- changes_need_pushing=push, name=git_user_name,
+ bb, changes_need_pushing=push, name=git_user_name,
email=git_user_email, build_uuid=uuid,
status=status_cb)
return pbb # (repo_url, commit, original_ref)
@@ -228,11 +226,30 @@ class DefinitionsRepo(gitdir.GitDirectory):
'to "origin", or use the --local-changes=include feature '
'of Morph.' % (e.ref, e.repo_url, ref))
- def load_all_morphologies(self, loader):
+ def get_morphology_loader(self):
+ '''Return a MorphologyLoader instance.
+
+ This may read the VERSION and DEFAULTS file and pass appropriate
+ information to the MorphologyLoader constructor.
+
+ '''
+ mf = morphlib.morphologyfinder.MorphologyFinder(self)
+
+ version_text = mf.read_file('VERSION')
+ version = morphlib.definitions_version.check_version_file(version_text)
+
+ loader = morphlib.morphloader.MorphologyLoader(
+ definitions_version=version)
+
+ return loader
+
+ def load_all_morphologies(self, loader=None):
+ loader = loader or self.get_morphology_loader()
+
mf = morphlib.morphologyfinder.MorphologyFinder(self)
for filename in (f for f in mf.list_morphologies()
if not self.is_symlink(f)):
- text = mf.read_morphology(filename)
+ text = mf.read_file(filename)
m = loader.load_from_string(text, filename=filename)
m.repo_url = self.remote_url
m.ref = self.HEAD
diff --git a/morphlib/definitions_version.py b/morphlib/definitions_version.py
index 44bed178..56cef164 100644
--- a/morphlib/definitions_version.py
+++ b/morphlib/definitions_version.py
@@ -76,3 +76,5 @@ def check_version_file(version_text): # pragma: no cover
if version not in SUPPORTED_VERSIONS:
raise UnknownVersionError(version)
+
+ return version
diff --git a/morphlib/morphologyfinder.py b/morphlib/morphologyfinder.py
index 708c86a9..335c01b6 100644
--- a/morphlib/morphologyfinder.py
+++ b/morphlib/morphologyfinder.py
@@ -33,7 +33,7 @@ class MorphologyFinder(object):
self.gitdir = gitdir
self.ref = ref
- def read_morphology(self, filename):
+ def read_file(self, filename):
'''Return the un-parsed text of a morphology.
For the given morphology name, locate and return the contents
diff --git a/morphlib/morphologyfinder_tests.py b/morphlib/morphologyfinder_tests.py
index a83f89a5..59772e23 100644
--- a/morphlib/morphologyfinder_tests.py
+++ b/morphlib/morphologyfinder_tests.py
@@ -83,29 +83,29 @@ class MorphologyFinderTests(unittest.TestCase):
def test_read_morph_in_HEAD(self):
gd = morphlib.gitdir.GitDirectory(self.dirname)
mf = morphlib.morphologyfinder.MorphologyFinder(gd, 'HEAD')
- self.assertEqual(mf.read_morphology('bar.morph'),
+ self.assertEqual(mf.read_file('bar.morph'),
"dummy morphology text")
def test_read_morph_in_master(self):
gd = morphlib.gitdir.GitDirectory(self.dirname)
mf = morphlib.morphologyfinder.MorphologyFinder(gd, 'master')
- self.assertEqual(mf.read_morphology('bar.morph'),
+ self.assertEqual(mf.read_file('bar.morph'),
"dummy morphology text")
def test_read_morph_raises_with_invalid_ref(self):
gd = morphlib.gitdir.GitDirectory(self.dirname)
mf = morphlib.morphologyfinder.MorphologyFinder(gd, 'invalid_ref')
self.assertRaises(morphlib.gitdir.InvalidRefError,
- mf.read_morphology, 'bar')
+ mf.read_file, 'bar')
def test_read_morph_in_work_tree(self):
gd = morphlib.gitdir.GitDirectory(self.dirname)
mf = morphlib.morphologyfinder.MorphologyFinder(gd)
- self.assertEqual(mf.read_morphology('foo.morph'),
+ self.assertEqual(mf.read_file('foo.morph'),
"altered morphology text")
def test_read_morph_raises_no_worktree_no_ref(self):
gd = morphlib.gitdir.GitDirectory(self.mirror)
mf = morphlib.morphologyfinder.MorphologyFinder(gd)
self.assertRaises(morphlib.gitdir.NoWorkingTreeError,
- mf.read_morphology, 'bar.morph')
+ mf.read_file, 'bar.morph')
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index 08589ea6..f206ef73 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -294,7 +294,7 @@ class BranchAndMergePlugin(cliapp.Plugin):
ws = morphlib.workspace.open('.')
sb = morphlib.sysbranchdir.open_from_within('.')
- loader = morphlib.morphloader.MorphologyLoader()
+ loader = sb.get_morphology_loader()
morphs = self._load_all_sysbranch_morphologies(sb, loader)
def edit_chunk(morph, chunk_name):
@@ -486,7 +486,7 @@ class BranchAndMergePlugin(cliapp.Plugin):
'''Read in all the morphologies in the root repository.'''
self.app.status(msg='Loading in all morphologies')
morphs = morphlib.morphset.MorphologySet()
- for morph in sb.load_all_morphologies(loader):
+ for morph in sb.load_all_morphologies():
morphs.add_morphology(morph)
return morphs
@@ -606,7 +606,7 @@ class BranchAndMergePlugin(cliapp.Plugin):
gd.branch(system_branch, base_ref)
gd.checkout(system_branch)
- loader = morphlib.morphloader.MorphologyLoader()
+ loader = sb.get_morphology_loader()
morphs = self._load_all_sysbranch_morphologies(sb, loader)
morphs.repoint_refs(sb.root_repository_url,
diff --git a/morphlib/plugins/diff_plugin.py b/morphlib/plugins/diff_plugin.py
index 06566438..9855c39f 100644
--- a/morphlib/plugins/diff_plugin.py
+++ b/morphlib/plugins/diff_plugin.py
@@ -108,7 +108,7 @@ class DiffPlugin(cliapp.Plugin):
definitions = mf.list_morphologies()
system_paths = set()
for definition in definitions:
- m = ml.parse_morphology_text(mf.read_morphology(definition),
+ m = ml.parse_morphology_text(mf.read_file(definition),
definition)
if m.get('kind') == 'system' or 'strata' in m:
system_paths.add(definition)
diff --git a/morphlib/plugins/get_chunk_details_plugin.py b/morphlib/plugins/get_chunk_details_plugin.py
index e58ed6c5..90e71c52 100644
--- a/morphlib/plugins/get_chunk_details_plugin.py
+++ b/morphlib/plugins/get_chunk_details_plugin.py
@@ -49,13 +49,12 @@ class GetChunkDetailsPlugin(cliapp.Plugin):
definitions_repo = morphlib.definitions_repo.open(
'.', search_for_root=True, search_workspace=True, app=self.app)
- loader = morphlib.morphloader.MorphologyLoader()
aliases = self.app.settings['repo-alias']
self.resolver = morphlib.repoaliasresolver.RepoAliasResolver(aliases)
found = 0
- for morph in definitions_repo.load_all_morphologies(loader):
+ for morph in definitions_repo.load_all_morphologies():
if morph['kind'] == 'stratum':
if (stratum_name == None or
morph['name'] == stratum_name):
diff --git a/morphlib/plugins/get_repo_plugin.py b/morphlib/plugins/get_repo_plugin.py
index 38039406..9c1c19f1 100644
--- a/morphlib/plugins/get_repo_plugin.py
+++ b/morphlib/plugins/get_repo_plugin.py
@@ -122,10 +122,9 @@ class GetRepoPlugin(cliapp.Plugin):
definitions_repo = morphlib.definitions_repo.open(
'.', search_for_root=True, search_workspace=True, app=self.app)
- loader = morphlib.morphloader.MorphologyLoader()
self.app.status(msg='Loading in all morphologies')
- for morph in definitions_repo.load_all_morphologies(loader):
+ for morph in definitions_repo.load_all_morphologies():
if morph['kind'] == 'stratum':
for chunk in morph['chunks']:
if chunk['name'] == chunk_name:
diff --git a/morphlib/sysbranchdir.py b/morphlib/sysbranchdir.py
index d23d9eea..25fc7f67 100644
--- a/morphlib/sysbranchdir.py
+++ b/morphlib/sysbranchdir.py
@@ -207,8 +207,11 @@ class SystemBranchDirectory(object):
for dirname in
morphlib.util.find_leaves(self.root_directory, '.git'))
- def load_all_morphologies(self, loader): # pragma: no cover
- return self.definitions_repo.load_all_morphologies(loader)
+ def get_morphology_loader(self): # pragma: no cover
+ return self.definitions_repo.get_morphology_loader()
+
+ def load_all_morphologies(self): # pragma: no cover
+ return self.definitions_repo.load_all_morphologies()
def create(root_directory, root_repository_url, system_branch_name):
diff --git a/tests.branching/add-then-edit.script b/tests.branching/add-then-edit.script
index bd1094e5..59b7e60f 100755
--- a/tests.branching/add-then-edit.script
+++ b/tests.branching/add-then-edit.script
@@ -36,6 +36,7 @@ stratum["chunks"].append({
"name": "goodbye",
"ref": "master",
"repo": "test:goodbye",
+ "build-system": "manual",
})
with open("hello-stratum.morph", "w") as f:
yaml.dump(stratum, f)
diff --git a/tests.branching/branch-creates-new-system-branch-not-from-master.stdout b/tests.branching/branch-creates-new-system-branch-not-from-master.stdout
index c61624b4..78b3ca33 100644
--- a/tests.branching/branch-creates-new-system-branch-not-from-master.stdout
+++ b/tests.branching/branch-creates-new-system-branch-not-from-master.stdout
@@ -7,6 +7,7 @@ d ./newbranch/test
d ./newbranch/test/morphs
d ./newbranch/test/morphs/.git
f ./newbranch/.morph-system-branch/config
+f ./newbranch/test/morphs/VERSION
f ./newbranch/test/morphs/hello-stratum.morph
f ./newbranch/test/morphs/hello-system.morph
f ./newbranch/test/morphs/this.is.alfred
diff --git a/tests.branching/branch-creates-new-system-branch.stdout b/tests.branching/branch-creates-new-system-branch.stdout
index a7318378..882d5401 100644
--- a/tests.branching/branch-creates-new-system-branch.stdout
+++ b/tests.branching/branch-creates-new-system-branch.stdout
@@ -7,6 +7,7 @@ d ./newbranch/test
d ./newbranch/test/morphs
d ./newbranch/test/morphs/.git
f ./newbranch/.morph-system-branch/config
+f ./newbranch/test/morphs/VERSION
f ./newbranch/test/morphs/hello-stratum.morph
f ./newbranch/test/morphs/hello-system.morph
Current branches:
diff --git a/tests.branching/branch-works-anywhere.stdout b/tests.branching/branch-works-anywhere.stdout
index 4e317902..4e6c3e27 100644
--- a/tests.branching/branch-works-anywhere.stdout
+++ b/tests.branching/branch-works-anywhere.stdout
@@ -7,6 +7,7 @@ d ./branch1/test
d ./branch1/test/morphs
d ./branch1/test/morphs/.git
f ./branch1/.morph-system-branch/config
+f ./branch1/test/morphs/VERSION
f ./branch1/test/morphs/hello-stratum.morph
f ./branch1/test/morphs/hello-system.morph
Workspace after creating the second branch:
@@ -23,9 +24,11 @@ d ./branch2/test
d ./branch2/test/morphs
d ./branch2/test/morphs/.git
f ./branch1/.morph-system-branch/config
+f ./branch1/test/morphs/VERSION
f ./branch1/test/morphs/hello-stratum.morph
f ./branch1/test/morphs/hello-system.morph
f ./branch2/.morph-system-branch/config
+f ./branch2/test/morphs/VERSION
f ./branch2/test/morphs/hello-stratum.morph
f ./branch2/test/morphs/hello-system.morph
Workspace after creating the third branch:
@@ -47,12 +50,15 @@ d ./branch3/test
d ./branch3/test/morphs
d ./branch3/test/morphs/.git
f ./branch1/.morph-system-branch/config
+f ./branch1/test/morphs/VERSION
f ./branch1/test/morphs/hello-stratum.morph
f ./branch1/test/morphs/hello-system.morph
f ./branch2/.morph-system-branch/config
+f ./branch2/test/morphs/VERSION
f ./branch2/test/morphs/hello-stratum.morph
f ./branch2/test/morphs/hello-system.morph
f ./branch3/.morph-system-branch/config
+f ./branch3/test/morphs/VERSION
f ./branch3/test/morphs/hello-stratum.morph
f ./branch3/test/morphs/hello-system.morph
Workspace after creating the fourth branch:
@@ -79,14 +85,18 @@ d ./branch4/test
d ./branch4/test/morphs
d ./branch4/test/morphs/.git
f ./branch1/.morph-system-branch/config
+f ./branch1/test/morphs/VERSION
f ./branch1/test/morphs/hello-stratum.morph
f ./branch1/test/morphs/hello-system.morph
f ./branch2/.morph-system-branch/config
+f ./branch2/test/morphs/VERSION
f ./branch2/test/morphs/hello-stratum.morph
f ./branch2/test/morphs/hello-system.morph
f ./branch3/.morph-system-branch/config
+f ./branch3/test/morphs/VERSION
f ./branch3/test/morphs/hello-stratum.morph
f ./branch3/test/morphs/hello-system.morph
f ./branch4/.morph-system-branch/config
+f ./branch4/test/morphs/VERSION
f ./branch4/test/morphs/hello-stratum.morph
f ./branch4/test/morphs/hello-system.morph
diff --git a/tests.branching/checkout-existing-branch.stdout b/tests.branching/checkout-existing-branch.stdout
index a6026269..f2b704e9 100644
--- a/tests.branching/checkout-existing-branch.stdout
+++ b/tests.branching/checkout-existing-branch.stdout
@@ -7,6 +7,7 @@ d ./master/test
d ./master/test/morphs
d ./master/test/morphs/.git
f ./master/.morph-system-branch/config
+f ./master/test/morphs/VERSION
f ./master/test/morphs/hello-stratum.morph
f ./master/test/morphs/hello-system.morph
Current branches:
diff --git a/tests.branching/checkout-works-anywhere.stdout b/tests.branching/checkout-works-anywhere.stdout
index ed8b1567..d7f6903a 100644
--- a/tests.branching/checkout-works-anywhere.stdout
+++ b/tests.branching/checkout-works-anywhere.stdout
@@ -7,6 +7,7 @@ d ./master/test
d ./master/test/morphs
d ./master/test/morphs/.git
f ./master/.morph-system-branch/config
+f ./master/test/morphs/VERSION
f ./master/test/morphs/hello-stratum.morph
f ./master/test/morphs/hello-system.morph
Workspace after checking out master from within a new branch:
@@ -23,8 +24,10 @@ d ./newbranch/test
d ./newbranch/test/morphs
d ./newbranch/test/morphs/.git
f ./master/.morph-system-branch/config
+f ./master/test/morphs/VERSION
f ./master/test/morphs/hello-stratum.morph
f ./master/test/morphs/hello-system.morph
f ./newbranch/.morph-system-branch/config
+f ./newbranch/test/morphs/VERSION
f ./newbranch/test/morphs/hello-stratum.morph
f ./newbranch/test/morphs/hello-system.morph
diff --git a/tests.branching/edit-checkouts-existing-chunk.stdout b/tests.branching/edit-checkouts-existing-chunk.stdout
index f6ac79c2..a859587b 100644
--- a/tests.branching/edit-checkouts-existing-chunk.stdout
+++ b/tests.branching/edit-checkouts-existing-chunk.stdout
@@ -8,4 +8,4 @@ test:morphs
Files in hello:
-hello.morph
+dummy
diff --git a/tests.branching/edit-updates-stratum.stdout b/tests.branching/edit-updates-stratum.stdout
index ee9510b5..2372745e 100644
--- a/tests.branching/edit-updates-stratum.stdout
+++ b/tests.branching/edit-updates-stratum.stdout
@@ -1,8 +1,8 @@
diff --git a/hello-stratum.morph b/hello-stratum.morph
-index f335879..7bf9d37 100644
+index 159854f..0036ee3 100644
--- a/hello-stratum.morph
+++ b/hello-stratum.morph
-@@ -3,6 +3,7 @@ kind: stratum
+@@ -3,7 +3,8 @@ kind: stratum
chunks:
- name: hello
repo: test:hello
@@ -11,3 +11,4 @@ index f335879..7bf9d37 100644
+ unpetrify-ref: master
build-depends: []
build-mode: bootstrap
+ build-system: manual
diff --git a/tests.branching/setup b/tests.branching/setup
index 59979ca8..8e82f32c 100755
--- a/tests.branching/setup
+++ b/tests.branching/setup
@@ -46,6 +46,8 @@ mkdir "$DATADIR/morphs"
## Create a link to this repo that has a .git suffix
ln -s "$DATADIR/morphs" "$DATADIR/morphs.git"
+echo 'version: 6' > "$DATADIR/morphs/VERSION"
+
cat <<EOF > "$DATADIR/morphs/hello-system.morph"
name: hello-system
kind: system
@@ -63,8 +65,10 @@ chunks:
ref: master
build-depends: []
build-mode: bootstrap
+ build-system: manual
EOF
+
scripts/run-git-in "$DATADIR/morphs" init
scripts/run-git-in "$DATADIR/morphs" add .
scripts/run-git-in "$DATADIR/morphs" commit -m initial
@@ -77,15 +81,10 @@ scripts/run-git-in "$DATADIR/morphs" add this.is.alfred
scripts/run-git-in "$DATADIR/morphs" commit --quiet -m 'mark as alfred'
scripts/run-git-in "$DATADIR/morphs" checkout master
-
# Create a dummy chunk repository
mkdir "$DATADIR/hello"
-cat <<EOF > "$DATADIR/hello/hello.morph"
-name: hello
-kind: chunk
-build-system: dummy
-EOF
+echo 'Chunk repo is empty' > "$DATADIR"/hello/dummy
scripts/run-git-in "$DATADIR/hello" init
scripts/run-git-in "$DATADIR/hello" add .
diff --git a/tests.branching/setup-second-chunk b/tests.branching/setup-second-chunk
index c8baa946..416a773a 100755
--- a/tests.branching/setup-second-chunk
+++ b/tests.branching/setup-second-chunk
@@ -27,7 +27,6 @@ create_chunk() {
cd "$1"
cat <<EOF > "$1/$2.morph"
-build-system: dummy
kind: chunk
name: $2
EOF
@@ -49,11 +48,13 @@ chunks:
ref: master
build-depends: []
build-mode: bootstrap
+ build-system: manual
- name: goodbye
repo: test:goodbye
ref: master
build-depends: []
build-mode: bootstrap
+ build-system: manual
EOF
git commit -q --all -m "Add goodbye to hello-stratum"