def component(releases_dir, components_dir, subparser, **kwargs): os.makedirs(components_dir, exist_ok=True) component_name = kwargs.pop("component_name") if subparser == "get": component = c_lib.Component.from_file( component_name, components_dir ) elif subparser == "add": try: component = c_lib.Component.from_file( component_name, components_dir ) except c_lib.ComponentError: component = c_lib.Component( name=component_name, directory=components_dir, **kwargs ) else: raise c_lib.ComponentError( "Component '{name}' already exists.".format( name=component_name, ) ) try: with TemporaryDirectory() as tmp_dir: git.Repo.clone_from( c_lib.git_http_to_ssh(component.repo_url), tmp_dir ) except FileNotFoundError as e: raise c_lib.ComponentError( "The repo_url provided is inaccessible, please check." ) elif subparser == "update": component = c_lib.Component.from_file( component_name, components_dir ) if kwargs["new_name"]: component.name = kwargs["new_name"] if kwargs["repo_url"]: component.repo_url = kwargs["repo_url"] if "is_product" in kwargs: component.is_product = kwargs["is_product"] else: raise c_lib.ComponentError( "The component subparser '{sp}' is not recognised.".format( sp=subparser, ) ) if component._is_changed: component.to_file() msg = "{change} component {name}".format( change=subparser.capitalize(), name=component.name, ) c_lib.commit_changes(releases_dir, components_dir, msg) return component
def release(releases_dir, components_dir, **kwargs): component_name = kwargs.pop("component_name") subparser = kwargs.pop("release_subparser") component = c_lib.Component.from_file( component_name, components_dir ) if subparser == "get": release = component.get_release(kwargs["version"], kwargs["pred"]) elif subparser == "add": release = component.create_release( version=kwargs["version"], sha=kwargs["sha"], series=kwargs["series_name"] ) if component._is_changed: component.to_file() msg = "Add component {name} release {version}".format( name=component.name, version=release.version, ) c_lib.commit_changes(releases_dir, components_dir, msg) else: raise c_lib.ComponentError( "The release subparser '{sp}' is not recognised.".format( sp=subparser, ) ) return release
def artifact_store(releases_dir, components_dir, **kwargs): component_name = kwargs.pop("component_name") commit_changes = kwargs.pop("commit_changes") subparser = kwargs.pop("artifact_store_subparser") component = c_lib.Component.from_file(component_name, components_dir) if subparser == "get": store = component.get_artifact_store(kwargs["name"]) elif subparser == "add": store = component.add_artifact_store( name=kwargs["name"], store_type=kwargs["type"], public_url=kwargs["public_url"], description=kwargs["description"], ) component.to_file() if commit_changes and component._is_changed: msg = "Add component {name} artifact store {store_name}".format( name=component.name, store_name=store["name"], ) c_lib.commit_changes(releases_dir, components_dir, msg) else: raise c_lib.ComponentError( "The artifact-store subparser '{sp}' is not recognised.".format( sp=subparser, )) return store
def main(): raw_args = sys.argv[1:] try: kwargs = parse_args(raw_args) subparser = kwargs.pop("subparser") releases_repo = kwargs.pop("releases_repo") releases_dir = os.path.expanduser(kwargs.pop("releases_dir") or "") if not releases_dir: releases_dir = update_releases_repo(repo_url=releases_repo) components_dir = os.path.join(releases_dir, "components") if subparser in ("get", "add", "update"): resp = component(releases_dir, components_dir, subparser, **kwargs) elif subparser == "release": resp = release(releases_dir, components_dir, **kwargs) elif subparser == "dependency": resp = dependency(components_dir, **kwargs) elif subparser == "compare": resp = compare(releases_dir, components_dir, **kwargs) else: raise c_lib.ComponentError( "The subparser '{sp}' is not recognised.".format(sp=subparser)) except SchemaError as e: error_message = e.code except c_lib.ComponentError as e: error_message = e else: error_message = None if resp is not None: print(yaml.dump(resp, default_flow_style=False), end="") sys.exit(error_message)
def metadata(components_dir, **kwargs): metadata_dir = kwargs.pop("metadata_dir") subparser = kwargs.pop("metadata_subparser") if subparser == "get": return get_metadata(metadata_dir) else: raise c_lib.ComponentError( "The metadata subparser '{sp}' is not recognised.".format( sp=subparser, ))
def dependency(components_dir, **kwargs): dependency_dir = kwargs.pop("dependency_dir") metadata_filename = "component_metadata.yml" filepath = os.path.join(dependency_dir, metadata_filename) new_metadata = {"dependencies": []} try: metadata = c_lib.load_data(filepath) except FileNotFoundError: metadata = deepcopy(new_metadata) metadata = s_lib.component_metadata_schema.validate(metadata) subparser = kwargs.pop("dependency_subparser") if subparser == "set-dependency": data = c_lib.set_dependency(metadata, **kwargs) if data != metadata or data == new_metadata: c_lib.save_data( filepath, s_lib.component_metadata_schema.validate(data) ) msg = "Set component dependency {name}".format( name=kwargs["name"], ) c_lib.commit_changes(dependency_dir, metadata_filename, msg) elif subparser == "update-requirements": existing_requirements = c_lib.load_requirements(dependency_dir) requirements = c_lib.update_requirements(metadata, components_dir) if existing_requirements != requirements: c_lib.save_requirements(requirements, dependency_dir) msg = "Update component dependency requirements" c_lib.commit_changes( dependency_dir, c_lib.REQUIREMENTS_FILENAME, msg ) elif subparser == "download-requirements": requirements = c_lib.load_requirements(dependency_dir) c_lib.download_requirements( requirements["dependencies"], kwargs["download_dir"] ) else: raise c_lib.ComponentError( "The dependency subparser '{sp}' is not recognised.".format( sp=subparser, ) )
def metadata(components_dir, **kwargs): metadata_dir = kwargs.pop("metadata_dir") metadata_filename = "component_metadata.yml" filepath = os.path.join(metadata_dir, metadata_filename) new_metadata = {"artifacts": [], "dependencies": []} try: metadata = c_lib.load_data(filepath) except FileNotFoundError: metadata = deepcopy(new_metadata) subparser = kwargs.pop("metadata_subparser") if subparser == "get": return s_lib.component_metadata_schema.validate(metadata) else: raise c_lib.ComponentError( "The metadata subparser '{sp}' is not recognised.".format( sp=subparser, ) )
def compare(releases_dir, components_dir, **kwargs): from_ = c_lib.load_all_components( components_dir, releases_dir, kwargs["from"] ) to = c_lib.load_all_components( components_dir, releases_dir, kwargs["to"] ) to_compare = defaultdict(lambda: [{}, {}]) for c in from_: to_compare[c.name][0] = c for c in to: to_compare[c.name][1] = c comparison = {} for name, (f, t) in to_compare.items(): if f and not t: deleted = f.to_dict() added = {} elif t and not f: deleted = {} added = t.to_dict() else: deleted = f.difference(t) added = t.difference(f) if added or deleted: comparison[name] = {"added": added, "deleted": deleted} comparison_yaml = yaml.dump(comparison, default_flow_style=False) if kwargs["verify"] == "release": try: s_lib.comparison_added_version_schema.validate(comparison) except SchemaError as e: raise c_lib.ComponentError( "The changes from `{f}` to `{t}` do not represent the " "addition of a new release.\nValidation error:" "\n{e}\nChanges found:\n{c}".format( f=kwargs["from"], t=kwargs["to"], e=e, c=comparison_yaml, ) ) else: name, data = comparison.popitem() version = data["added"]["releases"][0]["versions"][0]["version"] component = [c for c in to if c.name == name][0] output = component.get_release(version) elif kwargs["verify"] == "registration": try: s_lib.comparison_added_component_schema.validate(comparison) except SchemaError as e: raise c_lib.ComponentError( "The changes from `{f}` to `{t}` do not represent the " "registration of a new component.\nValidation error:" "\n{e}\nChanges found:\n{c}".format( f=kwargs["from"], t=kwargs["to"], e=e, c=comparison_yaml, ) ) else: name, _ = comparison.popitem() component = [c for c in to if c.name == name][0] output = component else: output = comparison return output
def component(releases_dir, components_dir, subparser, **kwargs): os.makedirs(components_dir, exist_ok=True) component_name = kwargs.pop("component_name") if subparser == "get": component = c_lib.Component.from_file( component_name, components_dir ) elif subparser == "add": import_releases = kwargs.pop("import_releases", []) try: component = c_lib.Component.from_file( component_name, components_dir ) except c_lib.ComponentError: pass else: raise c_lib.ComponentError( "Component '{name}' already exists.".format( name=component_name, ) ) ssh_url = c_lib.git_http_to_ssh(kwargs["repo_url"]) with TemporaryDirectory() as tmp_dir: try: repo = git.Repo.clone_from(ssh_url, tmp_dir) except FileNotFoundError as e: raise c_lib.ComponentError( "The repo_url provided is inaccessible, please check." ) else: repo.remotes.origin.fetch() releases = [] for each in import_releases: series, tag_regex = each.split(":", 1) for tag in repo.tags: if re.search(tag_regex, tag.name): releases.append( { "version": tag.name, "sha": str(tag.commit), "series": series, } ) component = c_lib.Component( name=component_name, directory=components_dir, releases=releases, **kwargs ) elif subparser == "update": component = c_lib.Component.from_file( component_name, components_dir ) if kwargs["new_name"]: component.name = kwargs["new_name"] if kwargs["repo_url"]: component.repo_url = kwargs["repo_url"] if "is_product" in kwargs: component.is_product = kwargs["is_product"] else: raise c_lib.ComponentError( "The component subparser '{sp}' is not recognised.".format( sp=subparser, ) ) if component._is_changed: component.to_file() msg = "{change} component {name}".format( change=subparser.capitalize(), name=component.name, ) c_lib.commit_changes(releases_dir, components_dir, msg) return component