178 lines
4.4 KiB
TypeScript
Raw Normal View History

import fs from "fs";
import gulp from "gulp";
import upath from "upath";
import buildConfig from "../../buildConfig";
import { modpackManifest, overridesFolder, sharedDestDirectory, tempDirectory } from "../../globals";
import del from "del";
import { FileDef } from "../../types/fileDef";
import Bluebird from "bluebird";
import {
compareAndExpandManifestDependencies,
downloadOrRetrieveFileDef,
getChangeLog,
getFileAtRevision,
getLastGitTag,
relative,
} from "../../util/util";
async function sharedCleanUp() {
await del(upath.join(sharedDestDirectory, "*"), { force: true });
await del(upath.join(tempDirectory, "*"), { force: true });
}
/**
* Checks and creates all necessary directories so we can build everything safely.
*/
async function createSharedDirs() {
if (!fs.existsSync(sharedDestDirectory)) {
await fs.promises.mkdir(sharedDestDirectory, { recursive: true });
}
if (!fs.existsSync(tempDirectory)) {
await fs.promises.mkdir(tempDirectory, { recursive: true });
}
}
/**
* Copies modpack overrides.
*/
async function copyOverrides() {
return new Promise((resolve) => {
gulp
.src(upath.join(buildConfig.buildSourceDirectory, overridesFolder, "**/*"))
.pipe(gulp.dest(upath.join(sharedDestDirectory, overridesFolder)))
.on("end", resolve);
});
}
/**
* Fetch external dependencies and remove the field from the manifest file.
*/
async function fetchExternalDependencies() {
const dependencies = modpackManifest.externalDependencies;
if (dependencies) {
const destDirectory = upath.join(sharedDestDirectory, overridesFolder, "mods");
if (!fs.existsSync(destDirectory)) {
await fs.promises.mkdir(destDirectory, { recursive: true });
}
// Map dependencies to FileDefs.
const depDefs: FileDef[] = dependencies.map((dep) => {
return {
url: dep.url,
hashes: [
{
hashes: [dep.sha],
id: "sha1",
},
],
};
});
delete modpackManifest.externalDependencies;
return Bluebird.map(
depDefs,
async (depDef) => {
const dest = upath.join(destDirectory, upath.basename(depDef.url));
const cachePath = (await downloadOrRetrieveFileDef(depDef)).cachePath;
const rel = relative(dest, cachePath);
await fs.promises.symlink(rel, dest);
},
{ concurrency: buildConfig.downloaderConcurrency },
);
}
}
/**
* Generates a changelog based on environmental variables.
*/
async function makeChangelog() {
let since = getLastGitTag(),
to: string;
// If this is a tagged build, fetch the tag before last.
if (process.env.GITHUB_TAG) {
since = getLastGitTag(process.env.GITHUB_TAG);
to = process.env.GITHUB_TAG;
}
// Back-compat in case this crap is still around.
else if (since == "latest-dev-preview") {
since = getLastGitTag(since);
}
const old = JSON.parse(getFileAtRevision("manifest.json", since)) as ModpackManifest;
const current = modpackManifest;
const commitList = getChangeLog(since, to, [upath.join("..", modpackManifest.overrides), "manifest.json"]);
const builder: string[] = [];
// If the UPDATENOTES.md file is present, prepend it verbatim.
if (fs.existsSync("../UPDATENOTES.md")) {
builder.push((await fs.promises.readFile("../UPDATENOTES.md")).toString());
}
// Push the title.
builder.push(`# Changes since ${since}`);
const comparisonResult = await compareAndExpandManifestDependencies(old, current);
// Push mod update blocks.
[
{
name: "## New mods",
list: comparisonResult.added,
},
{
name: "## Updated mods",
list: comparisonResult.modified,
},
{
name: "## Removed mods",
list: comparisonResult.removed,
},
].forEach((block) => {
if (block.list.length == 0) {
return;
}
builder.push("");
builder.push(block.name);
builder.push(
...block.list
// Yeet invalid project names.
.filter((project) => !/project-\d*/.test(project))
.sort()
.map((name) => `* ${name}`),
);
});
// Push the changelog itself.
if (commitList) {
builder.push("");
builder.push("## Commits");
builder.push(commitList);
}
// Check if the builder only contains the title.
if (builder.length == 1) {
builder.push("");
builder.push("There haven't been any changes.");
}
return fs.promises.writeFile(upath.join(sharedDestDirectory, "CHANGELOG.md"), builder.join("\n"));
}
import transforms from "./transforms";
import { ModpackManifest } from "../../types/modpackManifest";
export default gulp.series(
sharedCleanUp,
createSharedDirs,
copyOverrides,
makeChangelog,
fetchExternalDependencies,
...transforms,
);