gradio

Форк
0
/
fix_changelogs.cjs 
149 строк · 4.3 Кб
1
const { join } = require("path");
2
const { readFileSync, existsSync, writeFileSync, unlinkSync } = require("fs");
3
const { getPackagesSync } = require("@manypkg/get-packages");
4

5
const RE_PKG_NAME = /^[\w-]+\b/;
6
const pkg_meta = getPackagesSync(process.cwd());
7

8
/**
9
 * @typedef {{dirs: string[], highlight: {summary: string}[], feat: {summary: string}[], fix: {summary: string}[], current_changelog: string}} ChangesetMeta
10
 */
11

12
/**
13
 * @typedef {{[key: string]: ChangesetMeta}} ChangesetMetaCollection
14
 */
15

16
function run() {
17
	if (!existsSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"))) {
18
		console.warn("No changesets to process");
19
		return;
20
	}
21

22
	/**
23
	 * @type { ChangesetMetaCollection & { _handled: string[] } }}
24
	 */
25
	const { _handled, ...packages } = JSON.parse(
26
		readFileSync(
27
			join(pkg_meta.rootDir, ".changeset", "_changelog.json"),
28
			"utf-8"
29
		)
30
	);
31

32
	/**
33
	 * @typedef { {packageJson: {name: string, version: string, python: boolean}, dir: string} } PackageMeta
34
	 */
35

36
	/**
37
	 * @type { {[key:string]: PackageMeta} }
38
	 */
39
	const all_packages = pkg_meta.packages.reduce((acc, pkg) => {
40
		acc[pkg.packageJson.name] = /**@type {PackageMeta} */ (
41
			/** @type {unknown} */ (pkg)
42
		);
43
		return acc;
44
	}, /** @type {{[key:string] : PackageMeta}} */ ({}));
45

46
	for (const pkg_name in packages) {
47
		const { dirs, highlight, feat, fix, current_changelog, dependencies } =
48
			/**@type {ChangesetMeta} */ (packages[pkg_name]);
49

50
		if (pkg_name === "@gradio/lite") {
51
			const target = all_packages.gradio.packageJson.version.split(".");
52

53
			const current_version = packages[pkg_name].previous_version.split(".");
54

55
			if (!packages.gradio) {
56
				const patch = parseInt(current_version[2]) + 1;
57
				const new_version = [target[0], target[1], patch];
58
				all_packages[pkg_name].packageJson.version = new_version.join(".");
59
			} else {
60
				if (parseInt(target[1]) > parseInt(current_version[1])) {
61
					all_packages[pkg_name].packageJson.version = target.join(".");
62
				} else if (parseInt(target[1]) === parseInt(current_version[1])) {
63
					const patch = parseInt(current_version[2]) + 1;
64
					const new_version = [target[0], target[1], patch];
65
					all_packages[pkg_name].packageJson.version = new_version.join(".");
66
				}
67
			}
68

69
			writeFileSync(
70
				join(all_packages[pkg_name].dir, "package.json"),
71
				JSON.stringify(all_packages[pkg_name].packageJson, null, "\t") + "\n"
72
			);
73
		}
74

75
		const { version, python } = all_packages[pkg_name].packageJson;
76

77
		const highlights = highlight?.map((h) => `${h.summary}`) || [];
78
		const features = feat?.map((f) => `- ${f.summary}`) || [];
79
		const fixes = fix?.map((f) => `- ${f.summary}`) || [];
80
		const deps = Array.from(new Set(dependencies?.map((d) => d.trim()))) || [];
81

82
		const release_notes = /** @type {[string[], string][]} */ ([
83
			[highlights, "### Highlights"],
84
			[features, "### Features"],
85
			[fixes, "### Fixes"],
86
			[deps, "### Dependency updates"]
87
		])
88
			.filter(([s], i) => s.length > 0)
89
			.map(([lines, title]) => {
90
				if (title === "### Highlights") {
91
					return `${title}\n\n${lines.join("\n\n")}`;
92
				}
93

94
				return `${title}\n\n${lines.join("\n")}`;
95
			})
96
			.join("\n\n");
97

98
		const new_changelog = `# ${pkg_name}
99

100
## ${version}
101

102
${release_notes}
103

104
${current_changelog.replace(`# ${pkg_name}`, "").trim()}
105
`.trim();
106

107
		dirs.forEach((dir) => {
108
			writeFileSync(join(dir, "CHANGELOG.md"), new_changelog);
109
		});
110

111
		if (python) {
112
			bump_local_dependents(pkg_name, version);
113
		}
114
	}
115

116
	unlinkSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"));
117

118
	/**
119
	 * @param {string} pkg_to_bump The name of the package to bump
120
	 * @param {string} version The version to bump to
121
	 * @returns {void}
122
	 * */
123
	function bump_local_dependents(pkg_to_bump, version) {
124
		for (const pkg_name in all_packages) {
125
			const {
126
				dir,
127
				packageJson: { python }
128
			} = all_packages[pkg_name];
129

130
			if (!python) continue;
131

132
			const requirements_path = join(dir, "..", "requirements.txt");
133
			const requirements = readFileSync(requirements_path, "utf-8").split("\n");
134

135
			const pkg_index = requirements.findIndex((line) => {
136
				const m = line.trim().match(RE_PKG_NAME);
137
				if (!m) return false;
138
				return m[0] === pkg_to_bump;
139
			});
140

141
			if (pkg_index !== -1) {
142
				requirements[pkg_index] = `${pkg_to_bump}==${version}`;
143
				writeFileSync(requirements_path, requirements.join("\n"));
144
			}
145
		}
146
	}
147
}
148

149
run();
150

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.