-
-
Notifications
You must be signed in to change notification settings - Fork 300
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
94 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,15 +6,15 @@ | |
no-console | ||
*/ | ||
|
||
const {execSync} = require("node:child_process"); | ||
const fs = require("node:fs"); | ||
import {execSync} from "node:child_process"; | ||
import fs from "node:fs"; | ||
|
||
// Docs | ||
// [script] <fromTag> <toTag> | ||
// | ||
// Exmaple | ||
// Example | ||
// ``` | ||
// node scripts/changelog_simple.js v0.32.0 v0.33.0 | ||
// node scripts/generate_changelog.mjs v0.32.0 v0.33.0 | ||
// ``` | ||
|
||
/** | ||
|
@@ -23,8 +23,8 @@ const fs = require("node:fs"); | |
*/ | ||
const knownAuthors = { | ||
"[email protected]": "wemeetagain", | ||
"[email protected]": "g11tech", | ||
"[email protected]": "tuyennhv", | ||
"[email protected]": "g11tech", | ||
"[email protected]": "tuyennhv", | ||
"[email protected]": "dapplion", | ||
"41898282+github-actions[bot]@users.noreply.github.com": "github-actions[bot]", | ||
"49699333+dependabot[bot]@users.noreply.github.com": "dependabot[bot]", | ||
|
@@ -39,6 +39,9 @@ const knownAuthors = { | |
"[email protected]": "ammarlakho", | ||
"[email protected]": "dadepo", | ||
"[email protected]": "Evalir", | ||
"[email protected]": "nflaig", | ||
"[email protected]": "nazarhussain", | ||
"[email protected]": "matthewkeil", | ||
}; | ||
|
||
const fromTag = process.argv[2]; | ||
|
@@ -49,36 +52,96 @@ if (!fromTag) throw Error("No process.argv[2]"); | |
if (!toTag) throw Error("No process.argv[3]"); | ||
if (!outpath) throw Error("No process.argv[4]"); | ||
|
||
/** | ||
* @type {Record<string, {heading: string; commitsByScope: Record<string, string[]>}>} | ||
*/ | ||
const sections = { | ||
feat: {heading: "Features", commitsByScope: {"": []}}, | ||
fix: {heading: "Bug Fixes", commitsByScope: {"": []}}, | ||
perf: {heading: "Performance", commitsByScope: {"": []}}, | ||
refactor: {heading: "Refactoring", commitsByScope: {"": []}}, | ||
revert: {heading: "Reverts", commitsByScope: {"": []}}, | ||
deps: {heading: "Dependencies", commitsByScope: {"": []}}, | ||
build: {heading: "Build System", commitsByScope: {"": []}}, | ||
ci: {heading: "Continuous Integration", commitsByScope: {"": []}}, | ||
test: {heading: "Tests", commitsByScope: {"": []}}, | ||
style: {heading: "Styles", commitsByScope: {"": []}}, | ||
chore: {heading: "Maintenance", commitsByScope: {"": []}}, | ||
docs: {heading: "Documentation", commitsByScope: {"": []}}, | ||
_: {heading: "Miscellaneous", commitsByScope: {"": []}}, | ||
}; | ||
|
||
const isPrCommitRg = /\(#\d+\)/; | ||
const conventionalCommitRg = /^([a-z]+)(?:\((.*)\))?(?:(!))?: (.*)$/; | ||
|
||
const commitHashes = shell(`git log --pretty=format:"%H" ${fromTag}...${toTag}`); | ||
|
||
let commitListStr = ""; | ||
|
||
for (const commitHash of commitHashes.trim().split("\n")) { | ||
const subject = shell(`git log --format='%s' ${commitHash}^!`); | ||
if (!isPrCommitRg.test(subject)) { | ||
const rawCommit = shell(`git log --format='%s' ${commitHash}^!`); | ||
|
||
if (!isPrCommitRg.test(rawCommit)) { | ||
console.log(`Ignored commit "${rawCommit}" (missing PR reference)`); | ||
continue; | ||
} | ||
|
||
const conventionalCommit = rawCommit.match(conventionalCommitRg); | ||
if (!conventionalCommit) { | ||
console.log(`Ignored commit "${rawCommit}" (not conventional commit)`); | ||
continue; | ||
} | ||
|
||
const [, type, scope, _breaking, subject] = conventionalCommit; | ||
|
||
const authorEmail = shell(`git log --format='%ae' ${commitHash}^!`); | ||
const authorName = shell(`git log --format='%an' ${commitHash}^!`); | ||
const login = getCommitAuthorLogin(commitHash, authorEmail, authorName); | ||
|
||
commitListStr += `- ${subject} (@${login})\n`; | ||
const formattedCommit = `- ${scope ? `**${scope}:** ` : ""}${subject} (@${login})\n`; | ||
|
||
// Sort commits by type and scope | ||
// - assign each commit to section based on type | ||
// - group commits by scope within each section | ||
if (sections[type] != null) { | ||
if (scope) { | ||
if (sections[type].commitsByScope[scope] == null) { | ||
sections[type].commitsByScope[scope] = []; | ||
} | ||
sections[type].commitsByScope[scope].push(formattedCommit); | ||
} else { | ||
sections[type].commitsByScope[""].push(formattedCommit); | ||
} | ||
} else { | ||
// Commits with a type that is not defined in sections | ||
sections._.commitsByScope[""].push(formattedCommit); | ||
} | ||
} | ||
|
||
// Print knownAuthors to update if necessary | ||
console.log("knownAuthors", knownAuthors); | ||
|
||
const changelog = `# Changelog | ||
let changelog = `# Changelog | ||
[Full Changelog](https://github.com/ChainSafe/lodestar/compare/${fromTag}...${toTag}) | ||
`; | ||
|
||
**Merged pull requests:** | ||
// Write sections to changelog | ||
for (const type in sections) { | ||
const section = sections[type]; | ||
let hasCommits = false; | ||
let sectionChangelog = `\n### ${section.heading}\n\n`; | ||
|
||
${commitListStr} | ||
`; | ||
for (const commits of Object.values(section.commitsByScope)) { | ||
if (commits.length > 0) { | ||
hasCommits = true; | ||
sectionChangelog += commits.join(""); | ||
} | ||
} | ||
|
||
if (hasCommits) { | ||
// Only add section if it has at least one commit | ||
changelog += sectionChangelog; | ||
} | ||
} | ||
|
||
// Print to console | ||
console.log(changelog); | ||
|