Skip to content

Commit a798be9

Browse files
authored
Merge pull request #3 from barkibu/fix/ignore-release-merge
Fixup the broken feature of ignoring release merge
2 parents 21a0af5 + 19a6721 commit a798be9

File tree

2 files changed

+55
-10
lines changed

2 files changed

+55
-10
lines changed

changelog/__init__.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
# Merge commits use a double linebreak between the branch name and the title
2727
MERGE_PR_RE = re.compile(r"^Merge pull request #([0-9]+) from .*\n\n(.*)")
2828

29+
# Merge commits of a release branch
30+
MERGE_RELEASE_PR_RE = re.compile(
31+
r"^Merge pull request #([0-9]+) from .*/release/.*\n\n(.*)"
32+
)
33+
2934
# Squash-and-merge commits use the PR title with the number in parentheses
3035
SQUASH_PR_RE = re.compile(r"^(.*) \(#([0-9]+)\).*")
3136

@@ -232,6 +237,11 @@ def is_pr(message):
232237
return MERGE_PR_RE.search(message) or SQUASH_PR_RE.search(message)
233238

234239

240+
def is_release_merge(message):
241+
"""Determine whether or not a commit message is a release merge"""
242+
return MERGE_RELEASE_PR_RE.search(message)
243+
244+
235245
def extract_pr(message):
236246
"""Given a PR merge commit message, extract the PR number and title"""
237247
merge_match = MERGE_PR_RE.match(message)
@@ -254,6 +264,7 @@ def fetch_changes(
254264
previous_tag=None,
255265
current_tag=None,
256266
branch=DEFAULT_BRANCH,
267+
ignore_release_merge=False,
257268
):
258269
if previous_tag is None:
259270
previous_tag = get_last_tag(github_config, owner, repo)
@@ -282,6 +293,9 @@ def fetch_changes(
282293

283294
# First try to extract PR from commit message (merge/squash patterns)
284295
if is_pr(commit.message):
296+
# Skip release merges if ignore_release_merge is True
297+
if ignore_release_merge and is_release_merge(commit.message):
298+
continue
285299
pr = extract_pr(commit.message)
286300
else:
287301
# For rebase merges, try to find PR via GitHub API
@@ -356,13 +370,20 @@ def generate_changelog(
356370
github_base_url=None,
357371
github_api_url=None,
358372
github_token=None,
373+
ignore_release_merge=False,
359374
):
360375
github_config = get_github_config(
361376
github_base_url, github_api_url, github_token
362377
)
363378

364379
prs = fetch_changes(
365-
github_config, owner, repo, previous_tag, current_tag, branch
380+
github_config,
381+
owner,
382+
repo,
383+
previous_tag,
384+
current_tag,
385+
branch,
386+
ignore_release_merge,
366387
)
367388
lines = format_changes(github_config, owner, repo, prs, markdown=markdown)
368389

@@ -435,6 +456,12 @@ def main():
435456
help="GitHub oauth token to auth your Github requests with",
436457
)
437458

459+
parser.add_argument(
460+
"--ignore-release-merge",
461+
action="store_true",
462+
help="Override if you don't want to add release merges on the changelog",
463+
)
464+
438465
args = parser.parse_args()
439466

440467
changelog = generate_changelog(**vars(args))

changelog/tests/test_changelog.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ def test_get_commit_for_tag_exists(self, mock_requests_get):
6767
"object": {"type": "commit", "sha": "0123456789abcdef"}
6868
}
6969
mock_requests_get.return_value = response
70-
result = get_commit_for_tag(fake_github_config, "someone", "one-repo", "mytag")
70+
result = get_commit_for_tag(
71+
fake_github_config, "someone", "one-repo", "mytag"
72+
)
7173
self.assertEqual(result, "0123456789abcdef")
7274

7375
@mock.patch("requests.get")
@@ -78,7 +80,9 @@ def test_get_commit_for_tag_not_found(self, mock_requests_get):
7880
response.json.return_value = {"message": "nope"}
7981
mock_requests_get.return_value = response
8082
with self.assertRaises(GitHubError):
81-
get_commit_for_tag(fake_github_config, "someone", "one-repo", "mytag")
83+
get_commit_for_tag(
84+
fake_github_config, "someone", "one-repo", "mytag"
85+
)
8286

8387
@mock.patch("requests.get")
8488
def test_get_commit_for_tag_tag_object(self, mock_requests_get):
@@ -96,7 +100,9 @@ def test_get_commit_for_tag_tag_object(self, mock_requests_get):
96100
{"object": {"type": "commit", "sha": "0123456789abcdef"}},
97101
]
98102
mock_requests_get.return_value = response
99-
result = get_commit_for_tag(fake_github_config, "someone", "one-repo", "mytag")
103+
result = get_commit_for_tag(
104+
fake_github_config, "someone", "one-repo", "mytag"
105+
)
100106
self.assertEqual(result, "0123456789abcdef")
101107

102108
@mock.patch("requests.get")
@@ -158,7 +164,9 @@ def test_get_commits_between_no_commits(self, mock_requests_get):
158164
response.json.return_value = {}
159165
mock_requests_get.return_value = response
160166
with self.assertRaises(GitHubError):
161-
get_commits_between(fake_github_config, "someone", "one-repo", "one", "two")
167+
get_commits_between(
168+
fake_github_config, "someone", "one-repo", "one", "two"
169+
)
162170

163171
@mock.patch("requests.get")
164172
def test_get_commits_between_not_found(self, mock_requests_get):
@@ -168,7 +176,9 @@ def test_get_commits_between_not_found(self, mock_requests_get):
168176
response.json.return_value = {"message": "nope"}
169177
mock_requests_get.return_value = response
170178
with self.assertRaises(GitHubError):
171-
get_commits_between(fake_github_config, "someone", "one-repo", "one", "two")
179+
get_commits_between(
180+
fake_github_config, "someone", "one-repo", "one", "two"
181+
)
172182

173183
@mock.patch("requests.get")
174184
def test_get_pr_details(self, mock_requests_get):
@@ -271,7 +281,9 @@ def test_format_changes_uses_correct_base_url(self):
271281
PullRequest(2, "second"), PullRequestDetails(None, None)
272282
),
273283
]
274-
actual = format_changes(github_config, "owner", "a-repo", prs, markdown=True)
284+
actual = format_changes(
285+
github_config, "owner", "a-repo", prs, markdown=True
286+
)
275287
expected = [
276288
"MINOR RELEASE",
277289
"- first [#1](https://github.company.com/owner/a-repo/pull/1)",
@@ -395,13 +407,17 @@ def test_generate_changelog(self, mock_requests_get):
395407
# For commit sha "8": "I made some changes!" - no PR associated
396408
get_pr_for_commit_response_8 = mock.MagicMock()
397409
get_pr_for_commit_response_8.status_code = 200
398-
get_pr_for_commit_response_8.json.return_value = [] # Empty list means no PRs
410+
get_pr_for_commit_response_8.json.return_value = (
411+
[]
412+
) # Empty list means no PRs
399413
responses.append(get_pr_for_commit_response_8)
400414

401415
# For commit sha "7": malformed merge message - no PR associated
402416
get_pr_for_commit_response_7 = mock.MagicMock()
403417
get_pr_for_commit_response_7.status_code = 200
404-
get_pr_for_commit_response_7.json.return_value = [] # Empty list means no PRs
418+
get_pr_for_commit_response_7.json.return_value = (
419+
[]
420+
) # Empty list means no PRs
405421
responses.append(get_pr_for_commit_response_7)
406422

407423
get_pr_details_response = mock.MagicMock()
@@ -475,7 +491,9 @@ def test_get_pr_for_commit(self, mock_requests_get):
475491
self.assertEqual(result.title, "Add new feature")
476492

477493
# Verify the correct API endpoint was called
478-
expected_url = "https://api.github.com/repos/owner/repo/commits/abc123/pulls"
494+
expected_url = (
495+
"https://api.github.com/repos/owner/repo/commits/abc123/pulls"
496+
)
479497
mock_requests_get.assert_called_with(expected_url, headers={})
480498

481499
@mock.patch("requests.get")

0 commit comments

Comments
 (0)