diff --git a/bin.ts b/bin.ts index 48e1e6570..29076605c 100755 --- a/bin.ts +++ b/bin.ts @@ -16,6 +16,7 @@ const argv = parseArgs(Deno.args, { https: true, quiet: false, head: null, + combine: false, "bullet-style": "-", sortReleases: true, }, @@ -27,6 +28,7 @@ const argv = parseArgs(Deno.args, { "quiet", "sortReleases", "help", + "combine" ], alias: { h: "help", @@ -98,9 +100,35 @@ try { } } + if (argv.combine) { + const combinedReleases = changelog.releases.reduce((acc, release) => { + if (release.version) { + if (acc[release.version]) { + acc[release.version].combineChanges(release.changes); + } else { + acc[release.version] = release; + } + } + return acc; + }, {} as Record); + + changelog.releases = Object.values(combinedReleases); + + console.info(combinedReleases); + } + if (argv.create) { const version = typeof argv.create === "string" ? argv.create : undefined; - changelog.addRelease(new Release(version)); + + const release = changelog.releases.find((release) => { + return release.version === version + }); + + if (release) { + console.warn("Release already exists."); + } else { + changelog.addRelease(new Release(version)); + } } save(file, changelog); @@ -204,6 +232,7 @@ Options: --latest-release Print the latest release version --release Set the date of the specified release + --combine Combine changes from releases with the same version --create Create a new release --sortReleases Sort releases (default: true) diff --git a/src/Release.ts b/src/Release.ts index 0d147fd80..dbda19b15 100644 --- a/src/Release.ts +++ b/src/Release.ts @@ -59,6 +59,18 @@ export default class Release { return 0; } + combineChanges(changes: Map) { + changes.forEach((changes, type) => { + if (!this.changes.has(type)) { + this.changes.set(type, []); + } + + this.changes.get(type)!.push(...changes); + }); + + return this; + } + isEmpty() { if (this.description.trim()) { return false; diff --git a/test/test.ts b/test/test.ts index b6e239be1..7fd69aca1 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,4 +1,4 @@ -import { Changelog, parser, Release } from "../mod.ts"; +import { Change, Changelog, parser, Release } from "../mod.ts"; import customRelease from "./fixture/CustomRelease.ts"; import { assertEquals } from "./deps.ts"; @@ -144,6 +144,34 @@ Deno.test("should update the date of a dated release", function () { assertEquals(release.date?.getUTCDate(), 2); }); +Deno.test("should combine changes with other release", function () { + const releaseA = new Release(); + releaseA.addChange("added", "foo"); + const releaseB = new Release(); + releaseB.addChange("added", "bar"); + + const expectedResult = new Map(); + expectedResult.set("added", [ + new Change("foo"), + new Change("bar") + ] + ); + expectedResult.set("changed", []); + expectedResult.set("deprecated", []); + expectedResult.set("removed", []); + expectedResult.set("fixed", []); + expectedResult.set("security", []); + + releaseA.combineChanges(releaseB.changes); + + assertEquals(releaseA.changes.get("added"), expectedResult.get("added")); + assertEquals(releaseA.changes.get("changed"), expectedResult.get("changed")); + assertEquals(releaseA.changes.get("deprecated"), expectedResult.get("deprecated")); + assertEquals(releaseA.changes.get("removed"), expectedResult.get("removed")); + assertEquals(releaseA.changes.get("fixed"), expectedResult.get("fixed")); + assertEquals(releaseA.changes.get("security"), expectedResult.get("security")); +}); + Deno.test("adds a change with a new method maintenance()", function () { assertEquals( customRelease().maintenance("maintenance").isEmpty(),