CI: parse labeler without deps
This commit is contained in:
@@ -1,9 +1,6 @@
|
|||||||
import { execFileSync } from "node:child_process";
|
import { execFileSync } from "node:child_process";
|
||||||
import { readFileSync } from "node:fs";
|
import { readFileSync } from "node:fs";
|
||||||
import { resolve } from "node:path";
|
import { resolve } from "node:path";
|
||||||
import yaml from "yaml";
|
|
||||||
|
|
||||||
type LabelConfig = Record<string, unknown>;
|
|
||||||
|
|
||||||
type RepoLabel = {
|
type RepoLabel = {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -20,13 +17,12 @@ const COLOR_BY_PREFIX = new Map<string, string>([
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
const configPath = resolve(".github/labeler.yml");
|
const configPath = resolve(".github/labeler.yml");
|
||||||
const config = yaml.parse(readFileSync(configPath, "utf8")) as LabelConfig;
|
const labelNames = extractLabelNames(readFileSync(configPath, "utf8"));
|
||||||
|
|
||||||
if (!config || typeof config !== "object") {
|
if (!labelNames.length) {
|
||||||
throw new Error("labeler.yml must be a mapping of label names to globs.");
|
throw new Error("labeler.yml must declare at least one label.");
|
||||||
}
|
}
|
||||||
|
|
||||||
const labelNames = Object.keys(config).filter(Boolean);
|
|
||||||
const repo = resolveRepo();
|
const repo = resolveRepo();
|
||||||
const existing = fetchExistingLabels(repo);
|
const existing = fetchExistingLabels(repo);
|
||||||
|
|
||||||
@@ -55,6 +51,26 @@ for (const label of missing) {
|
|||||||
console.log(`Created label: ${label}`);
|
console.log(`Created label: ${label}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractLabelNames(contents: string): string[] {
|
||||||
|
const labels: string[] = [];
|
||||||
|
for (const line of contents.split("\n")) {
|
||||||
|
if (!line.trim() || line.trimStart().startsWith("#")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/^\s/.test(line)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const match = line.match(/^(["'])(.+)\1\s*:/) ?? line.match(/^([^:]+):/);
|
||||||
|
if (match) {
|
||||||
|
const name = (match[2] ?? match[1] ?? "").trim();
|
||||||
|
if (name) {
|
||||||
|
labels.push(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return labels;
|
||||||
|
}
|
||||||
|
|
||||||
function pickColor(label: string): string {
|
function pickColor(label: string): string {
|
||||||
const prefix = label.includes(":") ? label.split(":", 1)[0].trim() : label.trim();
|
const prefix = label.includes(":") ? label.split(":", 1)[0].trim() : label.trim();
|
||||||
return COLOR_BY_PREFIX.get(prefix) ?? "ededed";
|
return COLOR_BY_PREFIX.get(prefix) ?? "ededed";
|
||||||
|
|||||||
Reference in New Issue
Block a user