Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5a606cd

Browse files
committed
feat(changelog): add support for single version and version range
Closes #399 #225
1 parent bec20eb commit 5a606cd

File tree

3 files changed

+70
-3
lines changed

3 files changed

+70
-3
lines changed

‎commitizen/changelog.py‎

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import re
3030
from collections import OrderedDict, defaultdict
3131
from datetime import date
32-
from typing import Callable, Dict, Iterable, List, Optional
32+
from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple
3333

3434
from jinja2 import Environment, PackageLoader
3535

@@ -281,3 +281,49 @@ def incremental_build(new_content: str, lines: List, metadata: Dict) -> List:
281281
if not isinstance(latest_version_position, int):
282282
output_lines.append(new_content)
283283
return output_lines
284+
285+
286+
def get_tag_range(tags: List[GitTag], start: str, end: Optional[str]) -> List[GitTag]:
287+
accumulator = []
288+
keep = False
289+
if not end:
290+
end = start
291+
for index, tag in enumerate(tags):
292+
if tag.name == start:
293+
keep = True
294+
if keep:
295+
accumulator.append(tag)
296+
if tag.name == end:
297+
keep = False
298+
try:
299+
accumulator.append(tags[index + 1])
300+
except IndexError:
301+
pass
302+
break
303+
return accumulator
304+
305+
306+
def get_star_and_end_rev(
307+
tags: List[GitTag], version: str, tag_format: str, create_tag: Callable
308+
) -> Tuple[str, Any]:
309+
left: Optional[str] = None
310+
right: Optional[str] = None
311+
312+
try:
313+
left, right = version.split("..")
314+
except ValueError:
315+
right = version
316+
317+
if right:
318+
rtag = create_tag(right, tag_format=tag_format)
319+
else:
320+
rtag = None
321+
if left:
322+
ltag = create_tag(left, tag_format=tag_format)
323+
else:
324+
ltag = None
325+
326+
tags = get_tag_range(tags, start=rtag, end=ltag)
327+
start_rev = tags[-1].name
328+
end_rev = rtag
329+
return start_rev, end_rev

‎commitizen/cli.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@
183183
"useful if the changelog has been manually modified"
184184
),
185185
},
186+
{
187+
"name": "version_range",
188+
"type": str,
189+
"nargs": "?",
190+
"help": "generates changelog for the given version range",
191+
},
186192
{
187193
"name": "--start-rev",
188194
"default": None,

‎commitizen/commands/changelog.py‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from operator import itemgetter
44
from typing import Callable, Dict, List, Optional
55

6-
from commitizen import changelog, factory, git, out
6+
from commitizen import bump, changelog, factory, git, out
77
from commitizen.config import BaseConfig
88
from commitizen.exceptions import (
99
DryRunExit,
@@ -46,6 +46,10 @@ def __init__(self, config: BaseConfig, args):
4646
self.change_type_order = (
4747
self.config.settings.get("change_type_order") or self.cz.change_type_order
4848
)
49+
self.version = args.get("version_range")
50+
self.tag_format = args.get("tag_format") or self.config.settings.get(
51+
"tag_format"
52+
)
4953

5054
def _find_incremental_rev(self, latest_version: str, tags: List[GitTag]) -> str:
5155
"""Try to find the 'start_rev'.
@@ -93,13 +97,24 @@ def __call__(self):
9397
if not tags:
9498
tags = []
9599

100+
end_rev = "HEAD"
101+
if self.version and self.tag_format:
102+
start_rev, end_rev = changelog.get_star_and_end_rev(
103+
tags,
104+
version=self.version,
105+
tag_format=self.tag_format,
106+
create_tag=bump.create_tag,
107+
)
108+
96109
if self.incremental:
97110
changelog_meta = changelog.get_metadata(self.file_name)
98111
latest_version = changelog_meta.get("latest_version")
99112
if latest_version:
100113
start_rev = self._find_incremental_rev(latest_version, tags)
101114

102-
commits = git.get_commits(start=start_rev, args="--author-date-order")
115+
commits = git.get_commits(
116+
start=start_rev, end=end_rev, args="--author-date-order"
117+
)
103118
if not commits:
104119
raise NoCommitsFoundError("No commits found")
105120

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /