feat: git-gather also filters on descs

This commit is contained in:
Yanick Champoux 2023-05-18 13:03:01 -04:00
parent d826b4191d
commit bef10869ce
5 changed files with 71 additions and 35 deletions

View File

@ -13,6 +13,8 @@ releases:
- type: feat - type: feat
desc: cutting a release also add a new NEXT release desc: cutting a release also add a new NEXT release
commit: 167f631d1fe4eadba3ed5fdadbe378b8255d4ad2 commit: 167f631d1fe4eadba3ed5fdadbe378b8255d4ad2
- type: feat
desc: git-gather also filters on descs
- version: 0.1.0 - version: 0.1.0
changes: changes:
- port the core of the Perl changelord to JavaScript. - port the core of the Perl changelord to JavaScript.

View File

@ -102,7 +102,7 @@ Git messages are compared to the regular expression
configured at `project.commit_regex`. If none is found, it configured at `project.commit_regex`. If none is found, it
defaults to defaults to
^(?<type>[^: ]+):(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$ ^(?<type>[^: ]+):\s*(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$
The regular expression must capture a `desc` field, and may The regular expression must capture a `desc` field, and may
capture a `type` and `ticket` as well. capture a `type` and `ticket` as well.

View File

@ -8,6 +8,7 @@ import fs from "fs-extra";
import consola from "consola"; import consola from "consola";
import u from "@yanick/updeep-remeda"; import u from "@yanick/updeep-remeda";
import { once } from "remeda"; import { once } from "remeda";
import simpleGit from "simple-git";
import print from "./command/print.js"; import print from "./command/print.js";
import init from "./command/init.js"; import init from "./command/init.js";
@ -22,6 +23,7 @@ consola.raw = (...args) => console.log(...args);
yargs(hideBin(process.argv)) yargs(hideBin(process.argv))
.middleware((config) => { .middleware((config) => {
config.git = once(simpleGit);
config.consola = consola; config.consola = consola;
config.changelog = once(() => config.changelog = once(() =>
fs.readFile(config.source, "utf-8").then(yaml.parse) fs.readFile(config.source, "utf-8").then(yaml.parse)

View File

@ -4,8 +4,11 @@ import { prop, compact, pickBy } from "remeda";
const handler = async (config) => { const handler = async (config) => {
const next = await config.next_release(); const next = await config.next_release();
const seen_sha1s = compact(next?.changes.map(prop("commit"))); const seen_sha1s = compact(next?.changes.map(prop("commit")));
const seen_descs = next?.changes.map((change) =>
typeof change === "string" ? change : change.desc
);
const git = simpleGit(); const git = config.git();
const { version } = await config.latest_version(); const { version } = await config.latest_version();
@ -19,12 +22,13 @@ const handler = async (config) => {
const regex = new RegExp( const regex = new RegExp(
(await config.changelog().project?.commit_regex) ?? (await config.changelog().project?.commit_regex) ??
/^(?<type>[^: ]+):(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$/ /^(?<type>[^: ]+):\s*(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$/
); );
const changes = commits const changes = commits
.map((commit) => [commit, commit.message.match(regex)]) .map((commit) => [commit, commit.message.match(regex)])
.filter((x) => x[1]) .filter((x) => x[1])
.filter((x) => !seen_descs.includes(x[1].groups.desc))
.map(([commit, res]) => .map(([commit, res]) =>
pickBy({ ...res.groups, commit: commit.hash }, (x) => x) pickBy({ ...res.groups, commit: commit.hash }, (x) => x)
); );

View File

@ -0,0 +1,28 @@
import { test, expect, vi } from "vitest";
import gather from "./git-gather.js";
test("no changes detected", async () => {
const changelog = {
releases: [{ version: "NEXT", changes: [] }, { version: "1.0.0" }],
};
const noop = () => {};
const config = {
consola: {
start: noop,
success: vi.fn(),
},
changelog: () => changelog,
next_release: () => ({
changes: [],
}),
latest_version: () => ({ version: "1.2.3" }),
git: () => ({
log: () => ({ all: [] }),
}),
};
await gather.handler(config);
expect(config.consola.success).toHaveBeenCalledWith("no changes detected");
});