Skip to content

Commit 5123df0

Browse files
authored
Deduplicate leading verbs in auto-generated changelog entries (#35)
* Handle duplicated verbs in changelog titles * Refine changelog title verb deduplication --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
1 parent 83ef690 commit 5123df0

1 file changed

Lines changed: 34 additions & 1 deletion

File tree

.github/scripts/update-changelog.mjs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ const TYPE_TO_PREFIX = {
3434
refactor: "Refactored",
3535
};
3636

37+
/**
38+
* Maps changelog prefixes to verb forms that should be removed from title starts
39+
* to avoid duplicated wording like "Added added ...".
40+
*/
41+
const PREFIX_TO_LEADING_VERB_REGEX = {
42+
added: /^(add|adds|added|adding)\b[\s:-]*/i,
43+
changed: /^(change|changes|changed|changing)\b[\s:-]*/i,
44+
deprecated: /^(deprecate|deprecates|deprecated|deprecating)\b[\s:-]*/i,
45+
fixed: /^(fix|fixes|fixed|fixing)\b[\s:-]*/i,
46+
refactored: /^(refactor|refactors|refactored|refactoring)\b[\s:-]*/i,
47+
removed: /^(remove|removes|removed|removing)\b[\s:-]*/i,
48+
reverted: /^(revert|reverts|reverted|reverting)\b[\s:-]*/i,
49+
};
50+
3751
/**
3852
* Indentation used for PR description lines nested under a changelog list item 2 spaces.
3953
*/
@@ -296,7 +310,26 @@ function buildEntry(
296310
prBody,
297311
) {
298312
const prefix = TYPE_TO_PREFIX[type] ?? section;
299-
return `- ${prefix} ${cleanedTitle} ([#${prNumber}](${prUrl})) by @${prAuthor}${formatPRDescription(prBody)}\n<!-- end -->`;
313+
const dedupedTitle = removeLeadingDuplicateVerb(prefix, cleanedTitle);
314+
const titlePart = dedupedTitle ? ` ${dedupedTitle}` : ` ${cleanedTitle.trim()}`;
315+
return `- ${prefix}${titlePart} ([#${prNumber}](${prUrl})) by @${prAuthor}${formatPRDescription(prBody)}\n<!-- end -->`;
316+
}
317+
318+
/**
319+
* Removes duplicated leading verbs based on the resolved changelog prefix.
320+
* Example: prefix "Added" + title "added support for x" => "support for x"
321+
* @param {string} prefix - Resolved changelog entry prefix
322+
* @param {string} title - Cleaned PR title
323+
* @returns {string} - Title without duplicated leading verb
324+
*/
325+
function removeLeadingDuplicateVerb(prefix, title) {
326+
const trimmedTitle = title.trim();
327+
if (!trimmedTitle) return "";
328+
329+
const pattern = PREFIX_TO_LEADING_VERB_REGEX[prefix.toLowerCase()];
330+
if (!pattern) return trimmedTitle;
331+
332+
return trimmedTitle.replace(pattern, "").trimStart();
300333
}
301334

302335
/**

0 commit comments

Comments
 (0)