summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/buildbranch.py32
-rw-r--r--morphlib/definitions_repo.py26
-rw-r--r--morphlib/definitions_version.py2
-rw-r--r--morphlib/morphologyfinder.py12
-rw-r--r--morphlib/morphologyfinder_tests.py10
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py4
-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
-rw-r--r--tests.branching/branch-creates-new-system-branch-not-from-master.stdout1
-rw-r--r--tests.branching/branch-works-anywhere.stdout10
-rw-r--r--tests.branching/checkout-works-anywhere.stdout3
-rwxr-xr-xtests.branching/setup2
-rwxr-xr-xtests.branching/setup-second-chunk1
15 files changed, 73 insertions, 45 deletions
diff --git a/morphlib/buildbranch.py b/morphlib/buildbranch.py
index e16bf2b4..c1d15874 100644
--- a/morphlib/buildbranch.py
+++ b/morphlib/buildbranch.py
@@ -151,37 +151,40 @@ class BuildBranch(object):
index.add_files_from_working_tree(changed)
return changes_made
- @staticmethod
- def _hash_morphologies(gd, morphologies, loader):
+ def _hash_morphologies(self, gd, morphologies):
'''Hash morphologies and return object info'''
+ loader = self.get_morphology_loader()
for morphology in morphologies:
loader.unset_defaults(morphology)
sha1 = gd.store_blob(loader.save_to_string(morphology))
yield 0o100644, sha1, morphology.filename
- def load_all_morphologies(self, loader):
+ def get_morphology_loader(self):
if self._sb:
- return self._sb.load_all_morphologies(loader)
+ return self._sb.get_morphology_loader()
else:
- return self._root.load_all_morphologies(loader)
+ return self._root.get_morphology_loader()
- def inject_build_refs(self, loader, use_local_repos,
- inject_cb=lambda **kwargs: None):
+ def load_all_morphologies(self):
+ if self._sb:
+ return self._sb.load_all_morphologies()
+ else:
+ return self._root.load_all_morphologies()
+
+ 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()
- for morph in self.load_all_morphologies(loader):
+ for morph in self.load_all_morphologies():
morphs.add_morphology(morph)
sb_info = {}
@@ -216,7 +219,7 @@ class BuildBranch(object):
# TODO: Prevent it hashing unchanged morphologies, while still
# hashing uncommitted ones.
self._root_index.add_files_from_index_info(
- self._hash_morphologies(self._root, morphs.morphologies, loader))
+ self._hash_morphologies(self._root, morphs.morphologies))
def update_build_refs(self, name, email, uuid,
commit_cb=lambda **kwargs: None):
@@ -362,7 +365,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 +388,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..301e5b86 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,29 @@ 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')
+ morphlib.definitions_version.check_version_file(version_text)
+
+ loader = morphlib.morphloader.MorphologyLoader()
+
+ 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 3ed5d19a..bc72d2ad 100644
--- a/morphlib/definitions_version.py
+++ b/morphlib/definitions_version.py
@@ -77,3 +77,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..9184c160 100644
--- a/morphlib/morphologyfinder.py
+++ b/morphlib/morphologyfinder.py
@@ -33,16 +33,8 @@ class MorphologyFinder(object):
self.gitdir = gitdir
self.ref = ref
- def read_morphology(self, filename):
- '''Return the un-parsed text of a morphology.
-
- For the given morphology name, locate and return the contents
- of the morphology as a string.
-
- Parsing of this morphology into a form useful for manipulating
- is handled by the MorphologyLoader class.
-
- '''
+ def read_file(self, filename):
+ '''Return the text of a file inside the Git repo.'''
return self.gitdir.read_file(filename, self.ref)
def list_morphologies(self):
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 9421e4e5..ba4fab55 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -333,7 +333,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
@@ -453,7 +453,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/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-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-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/setup b/tests.branching/setup
index 497e9cff..816d5830 100755
--- a/tests.branching/setup
+++ b/tests.branching/setup
@@ -47,6 +47,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
diff --git a/tests.branching/setup-second-chunk b/tests.branching/setup-second-chunk
index ca6882e8..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