12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- const fs = require("fs");
- const util = require("util");
- const exec = util.promisify(require("child_process").exec);
- const excalidrawDir = `${__dirname}/../src/packages/excalidraw`;
- const excalidrawPackage = `${excalidrawDir}/package.json`;
- const pkg = require(excalidrawPackage);
- const lastVersion = pkg.version;
- const existingChangeLog = fs.readFileSync(
- `${excalidrawDir}/CHANGELOG.md`,
- "utf8",
- );
- const supportedTypes = ["feat", "fix", "style", "refactor", "perf", "build"];
- const headerForType = {
- feat: "Features",
- fix: "Fixes",
- style: "Styles",
- refactor: " Refactor",
- perf: "Performance",
- build: "Build",
- };
- const getCommitHashForLastVersion = async () => {
- try {
- const commitMessage = `"release @excalidraw/excalidraw@${lastVersion}"`;
- const { stdout } = await exec(
- `git log --format=format:"%H" --grep=${commitMessage}`,
- );
- return stdout;
- } catch (error) {
- console.error(error);
- }
- };
- const getLibraryCommitsSinceLastRelease = async () => {
- const commitHash = await getCommitHashForLastVersion();
- const { stdout } = await exec(
- `git log --pretty=format:%s ${commitHash}...master`,
- );
- const commitsSinceLastRelease = stdout.split("\n");
- const commitList = {};
- supportedTypes.forEach((type) => {
- commitList[type] = [];
- });
- commitsSinceLastRelease.forEach((commit) => {
- const indexOfColon = commit.indexOf(":");
- const type = commit.slice(0, indexOfColon);
- if (!supportedTypes.includes(type)) {
- return;
- }
- const messageWithoutType = commit.slice(indexOfColon + 1).trim();
- const messageWithCapitalizeFirst =
- messageWithoutType.charAt(0).toUpperCase() + messageWithoutType.slice(1);
- const prNumber = commit.match(/\(#([0-9]*)\)/)[1];
- // return if the changelog already contains the pr number which would happen for package updates
- if (existingChangeLog.includes(prNumber)) {
- return;
- }
- const prMarkdown = `[#${prNumber}](https://github.com/excalidraw/excalidraw/pull/${prNumber})`;
- const messageWithPRLink = messageWithCapitalizeFirst.replace(
- /\(#[0-9]*\)/,
- prMarkdown,
- );
- commitList[type].push(messageWithPRLink);
- });
- return commitList;
- };
- const updateChangelog = async (nextVersion) => {
- const commitList = await getLibraryCommitsSinceLastRelease();
- let changelogForLibrary =
- "## Excalidraw Library\n\n**_This section lists the updates made to the excalidraw library and will not affect the integration._**\n\n";
- supportedTypes.forEach((type) => {
- if (commitList[type].length) {
- changelogForLibrary += `### ${headerForType[type]}\n\n`;
- const commits = commitList[type];
- commits.forEach((commit) => {
- changelogForLibrary += `- ${commit}\n\n`;
- });
- }
- });
- changelogForLibrary += "---\n";
- const lastVersionIndex = existingChangeLog.indexOf(`## ${lastVersion}`);
- let updatedContent =
- existingChangeLog.slice(0, lastVersionIndex) +
- changelogForLibrary +
- existingChangeLog.slice(lastVersionIndex);
- const currentDate = new Date().toISOString().slice(0, 10);
- const newVersion = `## ${nextVersion} (${currentDate})`;
- updatedContent = updatedContent.replace(`## Unreleased`, newVersion);
- fs.writeFileSync(`${excalidrawDir}/CHANGELOG.md`, updatedContent, "utf8");
- };
- module.exports = updateChangelog;
|