From 6e0a751d48f2b1d9e4207afec7bf32eb71f5fac8 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Mon, 1 Sep 2014 17:02:18 +0100 Subject: import: Fix some issues, start stratum writing code --- import/main.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 10 deletions(-) (limited to 'import/main.py') 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() -- cgit v1.2.1