summaryrefslogtreecommitdiff
path: root/import/main.py
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2014-09-01 17:02:18 +0100
committerSam Thursfield <sam.thursfield@codethink.co.uk>2014-09-01 17:02:18 +0100
commit6e0a751d48f2b1d9e4207afec7bf32eb71f5fac8 (patch)
tree7d5541490af5aaab4be503199511676fd9873bfc /import/main.py
parent0c1b5b483f267da6161dd3636682fe50152ea2a9 (diff)
downloadmorph-6e0a751d48f2b1d9e4207afec7bf32eb71f5fac8.tar.gz
import: Fix some issues, start stratum writing code
Diffstat (limited to 'import/main.py')
-rw-r--r--import/main.py68
1 files changed, 58 insertions, 10 deletions
diff --git a/import/main.py b/import/main.py
index e3d46ed8..f2aab873 100644
--- a/import/main.py
+++ b/import/main.py
@@ -21,6 +21,7 @@ import cliapp
import morphlib
import contextlib
+import copy
import json
import logging
import os
@@ -83,11 +84,12 @@ class LorrySet(object):
return {name: self.data[name]}
def find_lorry_for_package(self, kind, package_name):
- key = 'x-%s-products' % kind
+ key = 'x-products-%s' % kind
for name, lorry in self.data.iteritems():
products = lorry.get(key, [])
- if package_name in products:
- return {name: lorry}
+ for entry in products:
+ if entry == package_name:
+ return {name: lorry}
return None
@@ -133,6 +135,11 @@ class LorrySet(object):
project_name = lorry_entry.keys()[0]
info = lorry_entry.values()[0]
+
+ if len(project_name) == 0:
+ raise cliapp.AppException(
+ 'Invalid lorry %s: %s' % (filename, lorry_entry))
+
if project_name in self.data:
stored_lorry = self.get_lorry(project_name)
@@ -202,7 +209,10 @@ class MorphologySet(morphlib.morphset.MorphologySet):
def save_morphology(self, filename, morphology):
self.add_morphology(morphology)
- self.loader.save_to_file(os.path.join(self.path, filename), morphology)
+ morphology_to_save = copy.copy(morphology)
+ self.loader.unset_defaults(morphology_to_save)
+ filename = os.path.join(self.path, filename)
+ self.loader.save_to_file(filename, morphology_to_save)
class GitDirectory(morphlib.gitdir.GitDirectory):
@@ -373,8 +383,7 @@ class BaserockImportApplication(cliapp.Application):
sys.stderr.write('Ignored errors in %i packages: %s\n' %
(len(ignored_errors), ', '.join(ignored_errors)))
- # Now: solve the dependencies and generate the bootstrap set!
- # generate the stratum!
+ stratum_morph = self.generate_stratum_morph(morph_set, goal_name)
def generate_lorry_for_package(self, kind, name):
tool = '%s.to_lorry' % kind
@@ -452,12 +461,15 @@ class BaserockImportApplication(cliapp.Application):
source_repo.checkout(tag_name)
break
else:
+ #raise BaserockImportException(
+ # 'Could not find ref for %s version %s.' % (name, version))
logging.error(
"Couldn't find tag %s in repo %s. I'm going to cheat and "
"use 'master' for now.", tag_name, source_repo)
source_repo.checkout('master')
- #raise BaserockImportException(
- # 'Could not find ref for %s version %s.' % (name, version))
+ version = 'master'
+
+ return version
def generate_chunk_morph_for_package(self, kind, source_repo, name,
filename):
@@ -474,17 +486,53 @@ class BaserockImportApplication(cliapp.Application):
def find_or_create_chunk_morph(self, morph_set, kind, name, version,
source_repo):
- morphology_filename = '%s-%s.morph' % (name, version)
+ checked_out_version = self.checkout_source_version(source_repo, name,
+ version)
+
+ morphology_filename = '%s-%s.morph' % (name, checked_out_version)
morphology = morph_set.get_morphology(morphology_filename)
if morphology is None:
- self.checkout_source_version(source_repo, name, version)
morphology = self.generate_chunk_morph_for_package(
kind, source_repo, name, morphology_filename)
morph_set.save_morphology(morphology_filename, morphology)
return morphology
+ def generate_stratum_morph(self, morph_set, goal_name):
+ # This assumes that morph_set contains only chunk morphs, and that they
+ # should all be part of the stratum.
+ chunk_entries = []
+
+ for m in morph_set.morphologies:
+ print m['name']
+ entry = {
+ 'name': m['name'],
+ 'repo': m.repo_url,
+ 'ref': m.ref,
+ 'morph': m.filename,
+ 'build-depends': m['x-build-dependencies-rubygem'],
+ }
+ chunk_entries.append(entry)
+
+ stratum = {
+ 'name': stratum_name,
+ 'kind': 'stratum',
+ 'description': 'Autogenerated by Baserock import tool',
+ 'build-depends': [
+ {'morph': 'strata/ruby.morph'}
+ ],
+ 'chunks': chunk_entries,
+ }
+
+ # Hard part is: generate graph of dependencies and sort it
+
+ filename = '%s.morph'
+ morphology = morph_set.loader.load_from_string(
+ json.dumps(stratum), filename=filename)
+
+ morph_set.loader.save_to_file(filename, morphology)
+
app = BaserockImportApplication(progname='import')
app.run()