Exemplo n.º 1
0
    def __call__(self):
        commit_parser = self.cz.commit_parser
        changelog_pattern = self.cz.changelog_pattern
        start_rev = self.start_rev
        unreleased_version = self.unreleased_version
        changelog_meta: Dict = {}
        change_type_map: Optional[Dict] = self.change_type_map
        changelog_message_builder_hook: Optional[
            Callable
        ] = self.cz.changelog_message_builder_hook
        changelog_hook: Optional[Callable] = self.cz.changelog_hook
        if not changelog_pattern or not commit_parser:
            raise NoPatternMapError(
                f"'{self.config.settings['name']}' rule does not support changelog"
            )

        tags = git.get_tags()
        if not tags:
            tags = []

        if self.incremental:
            changelog_meta = changelog.get_metadata(self.file_name)
            latest_version = changelog_meta.get("latest_version")
            if latest_version:
                start_rev = self._find_incremental_rev(latest_version, tags)

        commits = git.get_commits(start=start_rev, args="--author-date-order")
        if not commits:
            raise NoCommitsFoundError("No commits found")

        tree = changelog.generate_tree_from_commits(
            commits,
            tags,
            commit_parser,
            changelog_pattern,
            unreleased_version,
            change_type_map=change_type_map,
            changelog_message_builder_hook=changelog_message_builder_hook,
        )
        changelog_out = changelog.render_changelog(tree)
        changelog_out = changelog_out.lstrip("\n")

        if self.dry_run:
            out.write(changelog_out)
            raise DryRunExit()

        lines = []
        if self.incremental and os.path.isfile(self.file_name):
            with open(self.file_name, "r") as changelog_file:
                lines = changelog_file.readlines()

        with open(self.file_name, "w") as changelog_file:
            partial_changelog: Optional[str] = None
            if self.incremental:
                new_lines = changelog.incremental_build(
                    changelog_out, lines, changelog_meta
                )
                changelog_out = "".join(new_lines)
                partial_changelog = changelog_out

            if changelog_hook:
                changelog_out = changelog_hook(changelog_out, partial_changelog)
            changelog_file.write(changelog_out)
Exemplo n.º 2
0
def test_generate_tree_from_commits(gitcommits, tags):
    parser = defaults.commit_parser
    changelog_pattern = defaults.bump_pattern
    tree = changelog.generate_tree_from_commits(
        gitcommits, tags, parser, changelog_pattern
    )

    assert tuple(tree) == (
        {
            "version": "v1.2.0",
            "date": "2019-04-19",
            "changes": {
                "feat": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "custom cz plugins now support bumping version",
                    }
                ]
            },
        },
        {
            "version": "v1.1.1",
            "date": "2019-04-18",
            "changes": {
                "refactor": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "changed stdout statements",
                    },
                    {
                        "scope": "schema",
                        "breaking": None,
                        "message": "command logic removed from commitizen base",
                    },
                    {
                        "scope": "info",
                        "breaking": None,
                        "message": "command logic removed from commitizen base",
                    },
                    {
                        "scope": "example",
                        "breaking": None,
                        "message": "command logic removed from commitizen base",
                    },
                    {
                        "scope": "commit",
                        "breaking": None,
                        "message": "moved most of the commit logic to the commit command",
                    },
                ],
                "fix": [
                    {
                        "scope": "bump",
                        "breaking": None,
                        "message": "commit message now fits better with semver",
                    },
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "conventional commit 'breaking change' in body instead of title",
                    },
                ],
            },
        },
        {
            "version": "v1.1.0",
            "date": "2019-04-14",
            "changes": {
                "feat": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "new working bump command",
                    },
                    {"scope": None, "breaking": None, "message": "create version tag"},
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "update given files with new version",
                    },
                    {
                        "scope": "config",
                        "breaking": None,
                        "message": "new set key, used to set version to cfg",
                    },
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "support for pyproject.toml",
                    },
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "first semantic version bump implementation",
                    },
                ],
                "fix": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "removed all from commit",
                    },
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "fix config file not working",
                    },
                ],
                "refactor": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "added commands folder, better integration with decli",
                    }
                ],
            },
        },
        {
            "version": "v1.0.0",
            "date": "2019-03-01",
            "changes": {
                "refactor": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "removed delegator, added decli and many tests",
                    }
                ],
                "BREAKING CHANGE": [
                    {"scope": None, "breaking": None, "message": "API is stable"}
                ],
            },
        },
        {"version": "1.0.0b2", "date": "2019-01-18", "changes": {}},
        {
            "version": "v1.0.0b1",
            "date": "2019-01-17",
            "changes": {
                "feat": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "py3 only, tests and conventional commits 1.0",
                    }
                ]
            },
        },
        {
            "version": "v0.9.11",
            "date": "2018-12-17",
            "changes": {
                "fix": [
                    {
                        "scope": "config",
                        "breaking": None,
                        "message": "load config reads in order without failing if there is no commitizen section",
                    }
                ]
            },
        },
        {
            "version": "v0.9.10",
            "date": "2018-09-22",
            "changes": {
                "fix": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "parse scope (this is my punishment for not having tests)",
                    }
                ]
            },
        },
        {
            "version": "v0.9.9",
            "date": "2018-09-22",
            "changes": {
                "fix": [
                    {"scope": None, "breaking": None, "message": "parse scope empty"}
                ]
            },
        },
        {
            "version": "v0.9.8",
            "date": "2018-09-22",
            "changes": {
                "fix": [
                    {
                        "scope": "scope",
                        "breaking": None,
                        "message": "parse correctly again",
                    }
                ]
            },
        },
        {
            "version": "v0.9.7",
            "date": "2018-09-22",
            "changes": {
                "fix": [
                    {"scope": "scope", "breaking": None, "message": "parse correctly"}
                ]
            },
        },
        {
            "version": "v0.9.6",
            "date": "2018-09-19",
            "changes": {
                "refactor": [
                    {
                        "scope": "conventionalCommit",
                        "breaking": None,
                        "message": "moved filters to questions instead of message",
                    }
                ],
                "fix": [
                    {
                        "scope": "manifest",
                        "breaking": None,
                        "message": "included missing files",
                    }
                ],
            },
        },
        {
            "version": "v0.9.5",
            "date": "2018-08-24",
            "changes": {
                "fix": [
                    {
                        "scope": "config",
                        "breaking": None,
                        "message": "home path for python versions between 3.0 and 3.5",
                    }
                ]
            },
        },
        {
            "version": "v0.9.4",
            "date": "2018-08-02",
            "changes": {
                "feat": [{"scope": "cli", "breaking": None, "message": "added version"}]
            },
        },
        {
            "version": "v0.9.3",
            "date": "2018-07-28",
            "changes": {
                "feat": [
                    {
                        "scope": "committer",
                        "breaking": None,
                        "message": "conventional commit is a bit more intelligent now",
                    }
                ]
            },
        },
        {
            "version": "v0.9.2",
            "date": "2017-11-11",
            "changes": {
                "refactor": [
                    {
                        "scope": None,
                        "breaking": None,
                        "message": "renamed conventional_changelog to conventional_commits, not backward compatible",
                    }
                ]
            },
        },
        {
            "version": "v0.9.1",
            "date": "2017-11-11",
            "changes": {
                "fix": [
                    {
                        "scope": "setup.py",
                        "breaking": None,
                        "message": "future is now required for every python version",
                    }
                ]
            },
        },
    )