Latest
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102#!/usr/bin/env deno --allow-write --allow-read --allow-run
import ArgParser from "args.ts";import { fileExists, readStringSync, writeStringSync } from "fileutils.ts";import { gitCheckCleanState, gitCommitFileChanges, gitCreateTag, gitPushWithTags} from "git.ts";import { BumpTarget, bumpVersion, canonical, isValid } from "semver.ts";
const VERSIONFILE = "VERSION";
const parser = new ArgParser({ boolean: ["f"], alias: { f: ["force"] }});
const command = parser.getArg(0, "current");runCommand(command, parser);
function runCommand(command: string, parser: ArgParser) { switch (command) { case "init": return init(parser); case "current": return current(parser); case "set": return setVersion(parser); case "bump": return bump(parser);
default: console.error(`Unknown command ${command}`); }}
function init(parser: ArgParser) { const version = parser.getArg(1); if (!parser.getOpt("force") && fileExists(VERSIONFILE)) { console.error("Version file already exists!"); return; } if (!isValid(version)) { console.error("Please provide a valid version number"); return; } const canon = canonical(version); writeStringSync(VERSIONFILE, canon); console.log(canon);}
function setVersion(parser: ArgParser) { const version = parser.getArg(1); if (!isValid(version)) { console.error("Please provide a valid version number"); return; } const canon = canonical(version); writeStringSync(VERSIONFILE, canon); console.log(canon);}
function current(parser: ArgParser) { if (!fileExists(VERSIONFILE)) { console.error("Cannot find version file"); return; } const version = readStringSync(VERSIONFILE); console.log(canonical(version));}
async function bump(parser: ArgParser) { const version = readStringSync(VERSIONFILE); if (!parser.getOpt("force") && !(await gitCheckCleanState())) { console.error("Repository is not in a clean state. Aborting."); return; }
const target = parser.getArg(1, "patch"); if (!BumpTarget[target]) { console.error( `Invalid target: ${target}. Must be one of major, minor, patch` ); }
const bumped = bumpVersion(version, BumpTarget[target]); const numeric = bumped.slice(1); console.log(bumped); writeStringSync(VERSIONFILE, bumped); await gitCommitFileChanges(VERSIONFILE, `Bump version to ${bumped}`); await gitCreateTag(bumped, `Version ${numeric}`);
if (parser.getOpt("push")) { console.log("pushing to remote via git push --follow-tags"); await gitPushWithTags(); }}