Skip to content

Commit f6a1119

Browse files
Fix false backport detection for non-default branch workflows (#568)
* Fix false backport detection for non-default branch workflows In Gitflow-style repos (e.g. MLJBase.jl) where the default branch is `develop` and releases happen on `master`, TagBot incorrectly marked every release as a backport because `branches_of_commit` returned `master` (a non-default branch). The backport flag now relies solely on `_is_backport()`, which checks whether a higher-version tag already exists—the actual semantic definition of a backport. Fixes #566 Co-authored-by: Claude <noreply@anthropic.com> * fix flake8 --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 91e6323 commit f6a1119

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

tagbot/action/changelog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ def _collect_data(self, version_tag: str, sha: str) -> Dict[str, object]:
422422
return {
423423
"compare_url": compare,
424424
"custom": self._custom_release_notes(version_tag),
425-
"backport": self._is_backport(version_tag) or bool(release_branches),
425+
"backport": self._is_backport(version_tag),
426426
"issues": [self._format_issue(i) for i in issues],
427427
"package": self._repo._project("name"),
428428
"previous_release": prev_tag,

test/action/test_changelog.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,36 @@ def test_collect_data_backport():
415415
)
416416

417417

418+
def test_collect_data_non_default_branch_not_backport():
419+
"""Commit on non-default branch (Gitflow) with no higher tag."""
420+
c = _changelog()
421+
c._repo._repo = Mock(full_name="A/B.jl", html_url="https://github.com/A/B.jl")
422+
c._repo._project = Mock(return_value="B")
423+
c._repo.is_version_yanked = Mock(return_value=False)
424+
c._repo.branches_of_commit = Mock(return_value=["master"])
425+
semver_prev = Mock(
426+
tag_name="v0.18.6", created_at=datetime(2023, 1, 1, tzinfo=timezone.utc)
427+
)
428+
chrono_prev = Mock(
429+
tag_name="v0.18.6", created_at=datetime(2023, 1, 1, tzinfo=timezone.utc)
430+
)
431+
c._previous_release = Mock(return_value=semver_prev)
432+
c._previous_release_chronological = Mock(return_value=chrono_prev)
433+
c._is_backport = Mock(return_value=False)
434+
commit_date = datetime(2023, 4, 1, tzinfo=timezone.utc)
435+
commit = Mock(commit=Mock(author=Mock(date=commit_date)))
436+
c._repo._repo.get_commit = Mock(return_value=commit)
437+
c._issues = Mock(return_value=[])
438+
c._pulls_on_branches = Mock(return_value=[])
439+
c._custom_release_notes = Mock(return_value=None)
440+
441+
data = c._collect_data("v0.18.7", "abcdef")
442+
443+
assert data["backport"] is False
444+
assert data["previous_release"] == "v0.18.6"
445+
assert data["compare_url"] == "https://github.com/A/B.jl/compare/v0.18.6...v0.18.7"
446+
447+
418448
def test_pulls_on_branches():
419449
c = _changelog()
420450
pr_main = Mock(spec=PullRequest)

0 commit comments

Comments
 (0)