Skip to content

Conversation

@zimmermannJakob
Copy link

@zimmermannJakob zimmermannJakob commented Dec 7, 2025

Description

This PR solves issue #1694.

Checklist

Code Changes

  • Add test cases to all the changes you introduce
  • Run poetry all locally to ensure this change passes linter check and tests (Some error out on mac. I will investigate if they fail in ci)
  • Manually test the changes:
    • Verify the feature/bug fix works as expected in real-world scenarios
    • Test edge cases and error conditions (I thought about breaking changes and starting an empty changelog with prereleases.)
    • Ensure backward compatibility is maintained
    • Document any manual testing steps performed
      - [ ] Update the documentation for the changes (I do not think this applies. It works now as documented.)

### Documentation Changes

- [ ] Run poetry doc locally to ensure the documentation pages renders correctly
- [ ] Check and fix any broken links (internal or external) in the documentation

When running poetry doc, any broken internal documentation links will be reported in the console output like this:

INFO    -  Doc file 'config.md' contains a link 'commands/bump.md#-post_bump_hooks', but the doc 'commands/bump.md' does not contain an anchor '#-post_bump_hooks'.

Expected Behavior

See issue #1694.

Steps to Test This Pull Request

  1. build the changes on the branch. poetry build.
  2. Take the resulting .wheel file from dist/
  3. Install the file in a separate python environment:
  • python3 -m venv .venv && source .venv/bin/activate
  • verify env: which pip
  • pip install commitizen-4.10.0-py3-none-any.whl
  1. Go through the steps in the issue description and try reproducing the bug.

Additional Context

Known issue: When the changelog only contains pre-releases, the old behavior can still be observed. (Fixed)

@codecov
Copy link

codecov bot commented Dec 9, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.91%. Comparing base (120d514) to head (747ed1f).
⚠️ Report is 885 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1700      +/-   ##
==========================================
+ Coverage   97.33%   97.91%   +0.57%     
==========================================
  Files          42       60      +18     
  Lines        2104     2642     +538     
==========================================
+ Hits         2048     2587     +539     
+ Misses         56       55       -1     
Flag Coverage Δ
unittests 97.91% <100.00%> (+0.57%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@zimmermannJakob zimmermannJakob marked this pull request as ready for review December 13, 2025 14:29
Copy link
Member

@woile woile left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice, thanks!

cli.main()

testargs = ["cz", "bump", "--changelog"]

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: remove this blank line

Comment on lines +108 to +111
if during_version_bump and rules.merge_prereleases:
current_tag = None
else:
current_tag = get_commit_tag(commits[0], tags) if commits else None
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if during_version_bump and rules.merge_prereleases:
current_tag = None
else:
current_tag = get_commit_tag(commits[0], tags) if commits else None
if during_version_bump and rules.merge_prereleases and not commits:
current_tag = None
else:
# Check if the latest commit is not tagged
current_tag = get_commit_tag(commits[0], tags)

"incremental": True,
"dry_run": dry_run,
"during_version_bump": self.arguments["prerelease"]
is None, # We let the changelog implementation know that we want to replace prereleases while staying incremental AND the new tag does not exist already
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment is a bit unclear to me.

latest_version_index = index
line = line.strip().lower()

parsed = self.parse_version_from_title(line)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you rename the variable parsed to something more clear? Such as parsed_version. As well as the parsed in another function get_metadata_from_file.

Thanks!

Comment on lines +92 to +95
if parsed:
if not self.tag_rules.extract_version(
GitTag(parsed.tag, "", "")
).is_prerelease:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Combine these if statements with and

) as changelog_file:
return self.get_latest_full_release_from_file(changelog_file)

def get_latest_full_release_from_file(self, file: IO[Any]) -> IncrementalMergeInfo:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why extract this function? I don't see any benefits.

You could put the whole function body under with open block and the logic is still clear.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants