1111from commitizen import changelog , defaults , factory , git , out
1212from commitizen .changelog_formats import get_changelog_format
1313from commitizen .config import BaseConfig
14- from commitizen .cz .base import ChangelogReleaseHook , MessageBuilderHook
1514from commitizen .cz .utils import strip_local_version
1615from commitizen .exceptions import (
1716 DryRunExit ,
@@ -174,28 +173,23 @@ def _write_changelog(
174173
175174 changelog_file .write (changelog_out )
176175
177- def _export_template (self ) -> None :
178- tpl = changelog .get_changelog_template (self .cz .template_loader , self .template )
179- # TODO: fix the following type ignores
180- src = Path (tpl .filename ) # type: ignore[arg-type]
181- Path (self .export_template_to ).write_text (src .read_text ()) # type: ignore[arg-type]
176+ def _export_template (self , dist : str ) -> None :
177+ filename = changelog .get_changelog_template (
178+ self .cz .template_loader , self .template
179+ ).filename
180+ if filename is None :
181+ raise NotAllowed ("Template filename is not set" )
182+
183+ text = Path (filename ).read_text ()
184+ Path (dist ).write_text (text )
182185
183186 def __call__ (self ) -> None :
184187 commit_parser = self .cz .commit_parser
185188 changelog_pattern = self .cz .changelog_pattern
186189 start_rev = self .start_rev
187- unreleased_version = self .unreleased_version
188- changelog_meta = changelog .Metadata ()
189- change_type_map : dict [str , str ] | None = self .change_type_map
190- changelog_message_builder_hook : MessageBuilderHook | None = (
191- self .cz .changelog_message_builder_hook
192- )
193- changelog_release_hook : ChangelogReleaseHook | None = (
194- self .cz .changelog_release_hook
195- )
196190
197191 if self .export_template_to :
198- return self ._export_template ()
192+ return self ._export_template (self . export_template_to )
199193
200194 if not changelog_pattern or not commit_parser :
201195 raise NoPatternMapError (
@@ -209,45 +203,53 @@ def __call__(self) -> None:
209203 assert self .file_name
210204
211205 tags = self .tag_rules .get_version_tags (git .get_tags (), warn = True )
212- end_rev = ""
206+ changelog_meta = changelog . Metadata ()
213207 if self .incremental :
214208 changelog_meta = self .changelog_format .get_metadata (self .file_name )
215209 if changelog_meta .latest_version :
216210 start_rev = self ._find_incremental_rev (
217211 strip_local_version (changelog_meta .latest_version_tag or "" ), tags
218212 )
213+
214+ end_rev = ""
219215 if self .rev_range :
220216 start_rev , end_rev = changelog .get_oldest_and_newest_rev (
221217 tags ,
222218 self .rev_range ,
223219 self .tag_rules ,
224220 )
221+
225222 commits = git .get_commits (start = start_rev , end = end_rev , args = "--topo-order" )
226223 if not commits and (
227224 self .current_version is None or not self .current_version .is_prerelease
228225 ):
229226 raise NoCommitsFoundError ("No commits found" )
227+
230228 tree = changelog .generate_tree_from_commits (
231229 commits ,
232230 tags ,
233231 commit_parser ,
234232 changelog_pattern ,
235- unreleased_version ,
236- change_type_map = change_type_map ,
237- changelog_message_builder_hook = changelog_message_builder_hook ,
238- changelog_release_hook = changelog_release_hook ,
233+ self . unreleased_version ,
234+ change_type_map = self . change_type_map ,
235+ changelog_message_builder_hook = self . cz . changelog_message_builder_hook ,
236+ changelog_release_hook = self . cz . changelog_release_hook ,
239237 rules = self .tag_rules ,
240238 )
241239 if self .change_type_order :
242240 tree = changelog .generate_ordered_changelog_tree (
243241 tree , self .change_type_order
244242 )
245243
246- extras = self .cz .template_extras .copy ()
247- extras .update (self .config .settings ["extras" ])
248- extras .update (self .extras )
249244 changelog_out = changelog .render_changelog (
250- tree , loader = self .cz .template_loader , template = self .template , ** extras
245+ tree ,
246+ self .cz .template_loader ,
247+ self .template ,
248+ ** {
249+ ** self .cz .template_extras ,
250+ ** self .config .settings ["extras" ],
251+ ** self .extras ,
252+ },
251253 ).lstrip ("\n " )
252254
253255 # Dry_run is executed here to avoid checking and reading the files
0 commit comments