blob: 476cb23d9a4dbe6a770b4f9fe8a3080560aa9b95 [file] [log] [blame]
import {
abort,
desc,
env,
run,
sh,
shCapture,
task,
} from "https://deno.land/x/drake@v1.5.0/mod.ts";
const SHOULD_CARGO_PUBLISH = true;
const SHOULD_PUSH_DOCS_TO_GITHUB_PAGES = false;
desc("Release a new version of the crate");
task("release", [], async () => {
const version = env("version");
if (version == null) {
abort("The version to release was not specified");
}
if (!isValidSemVer(version)) {
abort("The given version is not a valid SemVer string");
}
await sh("cargo test --all-features");
await sh("cargo fmt -- --check");
await sh("git diff HEAD --exit-code --name-only");
if (SHOULD_CARGO_PUBLISH) {
await sh("cargo publish --dry-run");
}
const tagName = `v${version}`;
await sh(`git tag -a ${tagName} -m "Release ${tagName}"`);
await sh("git push origin master");
await sh(`git push origin ${tagName}`);
if (SHOULD_CARGO_PUBLISH) {
await sh("cargo publish");
}
if (SHOULD_PUSH_DOCS_TO_GITHUB_PAGES) {
await run("upload-docs");
}
});
desc("Upload docs to GitHub Pages");
task("upload-docs", [], async () => {
let origin_url;
{
const { code, output, error } = await shCapture(
"git remote get-url origin",
);
if (code == 0) {
origin_url = output.trim();
} else {
abort("Error getting origin's url from git");
}
}
await sh("cargo clean --doc");
await sh("cargo doc --no-deps");
{
const run = (command: string) => sh(command, { cwd: "target/doc" });
await run("git init");
await run("git add .");
await run('git commit -am "(doc upload)"');
await run(`git push -f ${origin_url} master:gh-pages`);
}
});
run();
function isValidSemVer(s: string): boolean {
return s.match(
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/,
) != null;
}