From c533e70f1f324d0223105c817f06f1bf986096fb Mon Sep 17 00:00:00 2001 From: Josix Date: Thu, 29 Feb 2024 22:14:32 +0800 Subject: [PATCH 1/4] fix(commands/bump): prevent using incremental changelog when it is set to false in config --- commitizen/commands/bump.py | 13 +++++++++++-- commitizen/config/base_config.py | 16 ++++++++++++++++ commitizen/config/json_config.py | 1 + commitizen/config/toml_config.py | 1 + commitizen/config/yaml_config.py | 1 + 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/commitizen/commands/bump.py b/commitizen/commands/bump.py index 6084c8c15..ff955a2d9 100644 --- a/commitizen/commands/bump.py +++ b/commitizen/commands/bump.py @@ -314,7 +314,9 @@ def __call__(self) -> None: "unreleased_version": new_tag_version, "template": self.template, "extras": self.extras, - "incremental": True, + "incremental": self.config.mutated_settings.get( + "changelog_incremental", True + ), "dry_run": dry_run, # governs logic for merge_prerelease "during_version_bump": self.arguments["prerelease"] is None, @@ -330,7 +332,14 @@ def __call__(self) -> None: changelog_cmd = Changelog( self.config, - {**changelog_args, "file_name": self.file_name}, # type: ignore[typeddict-item] + { + "unreleased_version": new_tag_version, + "incremental": True, + "dry_run": dry_run, + "template": self.template, + "extras": self.extras, + "file_name": self.file_name, + }, ) changelog_cmd() changelog_file_name = changelog_cmd.file_name diff --git a/commitizen/config/base_config.py b/commitizen/config/base_config.py index f100cf995..849c182ab 100644 --- a/commitizen/config/base_config.py +++ b/commitizen/config/base_config.py @@ -19,6 +19,14 @@ class BaseConfig: def __init__(self) -> None: self._settings: Settings = DEFAULT_SETTINGS.copy() self._path: Path | None = None + self._settings_from_configs: Settings = {} + + def contains_commitizen_section(self) -> bool: + """Check if the config file contains a commitizen section. + + The implementation is different for each config file type. + """ + raise NotImplementedError() def contains_commitizen_section(self) -> bool: """Check if the config file contains a commitizen section. @@ -31,6 +39,14 @@ def contains_commitizen_section(self) -> bool: def settings(self) -> Settings: return self._settings + @property + def mutated_settings(self) -> Settings: + return self._settings_from_configs + + @property + def mutated_settings(self) -> Settings: + return self._settings_from_configs + @property def path(self) -> Path: return self._path # type: ignore[return-value] diff --git a/commitizen/config/json_config.py b/commitizen/config/json_config.py index 3951c5285..d0fc245e5 100644 --- a/commitizen/config/json_config.py +++ b/commitizen/config/json_config.py @@ -63,5 +63,6 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["commitizen"]) + self.mutated_settings.update(doc["commitizen"]) except KeyError: pass diff --git a/commitizen/config/toml_config.py b/commitizen/config/toml_config.py index 8324bd03a..718e7178f 100644 --- a/commitizen/config/toml_config.py +++ b/commitizen/config/toml_config.py @@ -70,5 +70,6 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["tool"]["commitizen"]) # type: ignore[index,typeddict-item] # TODO: fix this + self.mutated_settings.update(doc["tool"]["commitizen"]) # type: ignore except exceptions.NonExistentKey: pass diff --git a/commitizen/config/yaml_config.py b/commitizen/config/yaml_config.py index 0e79735f2..4c96e36c7 100644 --- a/commitizen/config/yaml_config.py +++ b/commitizen/config/yaml_config.py @@ -52,6 +52,7 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["commitizen"]) + self.mutated_settings.update(doc["commitizen"]) except (KeyError, TypeError): pass From aef20049d685809d9a820e75c4c3a8e1044beb10 Mon Sep 17 00:00:00 2001 From: josix Date: Fri, 8 Mar 2024 19:29:48 +0800 Subject: [PATCH 2/4] docs(BaseConfig): add elaboration on the mutated_settings property --- commitizen/config/base_config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/commitizen/config/base_config.py b/commitizen/config/base_config.py index 849c182ab..40bc73584 100644 --- a/commitizen/config/base_config.py +++ b/commitizen/config/base_config.py @@ -41,6 +41,11 @@ def settings(self) -> Settings: @property def mutated_settings(self) -> Settings: + """It is used to record the changes from the config file defined by users, + which helps distinguish the ambiguous default behavior of + `changelog_incremental`. + Please refer to https://github.com/commitizen-tools/commitizen/pull/996 + """ return self._settings_from_configs @property From d9f9fae874dc36ead6e04724bafd8a24b6617cae Mon Sep 17 00:00:00 2001 From: josix Date: Wed, 4 Feb 2026 23:37:32 +0800 Subject: [PATCH 3/4] fix: ci build error --- commitizen/commands/bump.py | 9 +-------- commitizen/config/base_config.py | 11 ----------- commitizen/config/toml_config.py | 2 +- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/commitizen/commands/bump.py b/commitizen/commands/bump.py index ff955a2d9..4793cea94 100644 --- a/commitizen/commands/bump.py +++ b/commitizen/commands/bump.py @@ -332,14 +332,7 @@ def __call__(self) -> None: changelog_cmd = Changelog( self.config, - { - "unreleased_version": new_tag_version, - "incremental": True, - "dry_run": dry_run, - "template": self.template, - "extras": self.extras, - "file_name": self.file_name, - }, + {**changelog_args, "file_name": self.file_name}, # type: ignore[typeddict-item] ) changelog_cmd() changelog_file_name = changelog_cmd.file_name diff --git a/commitizen/config/base_config.py b/commitizen/config/base_config.py index 40bc73584..3b42789a6 100644 --- a/commitizen/config/base_config.py +++ b/commitizen/config/base_config.py @@ -28,13 +28,6 @@ def contains_commitizen_section(self) -> bool: """ raise NotImplementedError() - def contains_commitizen_section(self) -> bool: - """Check if the config file contains a commitizen section. - - The implementation is different for each config file type. - """ - raise NotImplementedError() - @property def settings(self) -> Settings: return self._settings @@ -48,10 +41,6 @@ def mutated_settings(self) -> Settings: """ return self._settings_from_configs - @property - def mutated_settings(self) -> Settings: - return self._settings_from_configs - @property def path(self) -> Path: return self._path # type: ignore[return-value] diff --git a/commitizen/config/toml_config.py b/commitizen/config/toml_config.py index 718e7178f..b6749618e 100644 --- a/commitizen/config/toml_config.py +++ b/commitizen/config/toml_config.py @@ -70,6 +70,6 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["tool"]["commitizen"]) # type: ignore[index,typeddict-item] # TODO: fix this - self.mutated_settings.update(doc["tool"]["commitizen"]) # type: ignore + self.mutated_settings.update(doc["tool"]["commitizen"]) # type: ignore[index,typeddict-item] except exceptions.NonExistentKey: pass From 9c8f89ae390db196280d1fcc390a9280cca891e4 Mon Sep 17 00:00:00 2001 From: josix Date: Wed, 4 Feb 2026 23:34:14 +0800 Subject: [PATCH 4/4] refactor: simplify changelog incremental setting handling --- commitizen/commands/bump.py | 7 ++++--- commitizen/config/base_config.py | 10 ---------- commitizen/config/json_config.py | 1 - commitizen/config/toml_config.py | 1 - commitizen/config/yaml_config.py | 1 - commitizen/defaults.py | 4 ++-- tests/test_conf.py | 4 ++-- 7 files changed, 8 insertions(+), 20 deletions(-) diff --git a/commitizen/commands/bump.py b/commitizen/commands/bump.py index 4793cea94..ec1b9dee9 100644 --- a/commitizen/commands/bump.py +++ b/commitizen/commands/bump.py @@ -310,13 +310,14 @@ def __call__(self) -> None: changelog_file_name = None dry_run = self.arguments["dry_run"] if self.changelog_flag: + incremental_setting = self.config.settings.get("changelog_incremental") changelog_args = { "unreleased_version": new_tag_version, "template": self.template, "extras": self.extras, - "incremental": self.config.mutated_settings.get( - "changelog_incremental", True - ), + "incremental": incremental_setting + if incremental_setting is not None + else True, "dry_run": dry_run, # governs logic for merge_prerelease "during_version_bump": self.arguments["prerelease"] is None, diff --git a/commitizen/config/base_config.py b/commitizen/config/base_config.py index 3b42789a6..f100cf995 100644 --- a/commitizen/config/base_config.py +++ b/commitizen/config/base_config.py @@ -19,7 +19,6 @@ class BaseConfig: def __init__(self) -> None: self._settings: Settings = DEFAULT_SETTINGS.copy() self._path: Path | None = None - self._settings_from_configs: Settings = {} def contains_commitizen_section(self) -> bool: """Check if the config file contains a commitizen section. @@ -32,15 +31,6 @@ def contains_commitizen_section(self) -> bool: def settings(self) -> Settings: return self._settings - @property - def mutated_settings(self) -> Settings: - """It is used to record the changes from the config file defined by users, - which helps distinguish the ambiguous default behavior of - `changelog_incremental`. - Please refer to https://github.com/commitizen-tools/commitizen/pull/996 - """ - return self._settings_from_configs - @property def path(self) -> Path: return self._path # type: ignore[return-value] diff --git a/commitizen/config/json_config.py b/commitizen/config/json_config.py index d0fc245e5..3951c5285 100644 --- a/commitizen/config/json_config.py +++ b/commitizen/config/json_config.py @@ -63,6 +63,5 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["commitizen"]) - self.mutated_settings.update(doc["commitizen"]) except KeyError: pass diff --git a/commitizen/config/toml_config.py b/commitizen/config/toml_config.py index b6749618e..8324bd03a 100644 --- a/commitizen/config/toml_config.py +++ b/commitizen/config/toml_config.py @@ -70,6 +70,5 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["tool"]["commitizen"]) # type: ignore[index,typeddict-item] # TODO: fix this - self.mutated_settings.update(doc["tool"]["commitizen"]) # type: ignore[index,typeddict-item] except exceptions.NonExistentKey: pass diff --git a/commitizen/config/yaml_config.py b/commitizen/config/yaml_config.py index 4c96e36c7..0e79735f2 100644 --- a/commitizen/config/yaml_config.py +++ b/commitizen/config/yaml_config.py @@ -52,7 +52,6 @@ def _parse_setting(self, data: bytes | str) -> None: try: self.settings.update(doc["commitizen"]) - self.mutated_settings.update(doc["commitizen"]) except (KeyError, TypeError): pass diff --git a/commitizen/defaults.py b/commitizen/defaults.py index 4865ccc18..cdf6238c6 100644 --- a/commitizen/defaults.py +++ b/commitizen/defaults.py @@ -38,7 +38,7 @@ class Settings(TypedDict, total=False): change_type_map: dict[str, str] changelog_file: str changelog_format: str | None - changelog_incremental: bool + changelog_incremental: bool | None changelog_merge_prerelease: bool changelog_start_rev: str | None customize: CzSettings @@ -100,7 +100,7 @@ class Settings(TypedDict, total=False): ], "changelog_file": "CHANGELOG.md", "changelog_format": None, # default guessed from changelog_file - "changelog_incremental": False, + "changelog_incremental": None, "changelog_start_rev": None, "changelog_merge_prerelease": False, "update_changelog_on_bump": False, diff --git a/tests/test_conf.py b/tests/test_conf.py index 923535e0c..fc7f5d4c6 100644 --- a/tests/test_conf.py +++ b/tests/test_conf.py @@ -97,7 +97,7 @@ "style": [["pointer", "reverse"], ["question", "underline"]], "changelog_file": "CHANGELOG.md", "changelog_format": None, - "changelog_incremental": False, + "changelog_incremental": None, "changelog_start_rev": None, "changelog_merge_prerelease": False, "update_changelog_on_bump": False, @@ -137,7 +137,7 @@ "style": [["pointer", "reverse"], ["question", "underline"]], "changelog_file": "CHANGELOG.md", "changelog_format": None, - "changelog_incremental": False, + "changelog_incremental": None, "changelog_start_rev": None, "changelog_merge_prerelease": False, "update_changelog_on_bump": False,