Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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)
Пример #5
0
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, ))
Пример #6
0
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,
            )
        )
Пример #7
0
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,
            )
        )
Пример #8
0
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
Пример #9
0
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