From 48e5461b2d15dfd5a91f9b4e986705a446f65835 Mon Sep 17 00:00:00 2001 From: k Date: Wed, 24 Apr 2024 08:58:11 +0200 Subject: [PATCH] [hx rc] install/select Haxe version specified by .haxerc --- src/HaxeDownload.hx | 20 +++++++++++--------- src/HaxeManager.hx | 4 ++++ src/HaxeRc.hx | 39 +++++++++++++++++++++++++++++++++++++++ src/tools/Utils.hx | 8 ++++++++ 4 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 src/HaxeRc.hx diff --git a/src/HaxeDownload.hx b/src/HaxeDownload.hx index b7dcbf5..801cba8 100644 --- a/src/HaxeDownload.hx +++ b/src/HaxeDownload.hx @@ -53,34 +53,35 @@ class HaxeDownload { installFile(dest, filename, alias); } - static function downloadLatest(?alias:String = "dev"):Void { + static function downloadLatest(?alias:String = "dev", ?cb:String->Void):Void { final url = Utils.getBuildUrl("latest"); - install(url[0], url[1], alias); + install(url[0], url[1], alias, cb); } - static function downloadNightly(v:String, ?alias:String):Void { + public static function downloadNightly(v:String, ?alias:String, ?cb:String->Void):Void { v = HaxeNightlies.resolve(v); final url = Utils.getBuildUrl(v); - install(url[0], url[1], alias); + install(url[0], url[1], alias, cb); } - static function downloadRelease(v:String, ?alias:String):Void { + public static function downloadRelease(v:String, ?alias:String, ?cb:String->Void):Void { final url = Utils.getReleaseUrl(v); - install(url[0], url[1], alias); + install(url[0], url[1], alias, cb); } - static function install(url:String, filename:String, ?alias:String):Void { + static function install(url:String, filename:String, ?alias:String, ?cb:String->Void):Void { url = url + filename; filename = Path.withoutDirectory(filename); final path = Path.join([Utils.releasesDir, filename]); DownloadHelper.download(url, path, () -> { Sys.println('Downloaded $filename'); - installFile(path, filename, alias); + alias = installFile(path, filename, alias); + if (cb != null) cb(alias); }); } - static function installFile(path:String, filename:String, ?alias:String):Void { + static function installFile(path:String, filename:String, ?alias:String):String { final out = DownloadHelper.extract(path); FileSystem.deleteFile(path); @@ -91,6 +92,7 @@ class HaxeDownload { try FileSystem.deleteFile(versionPath) catch(_) {} FileSync.symlink(releasePath, versionPath); Sys.println('Installed $filename as $alias'); + return alias; } public static function displayUsage() { diff --git a/src/HaxeManager.hx b/src/HaxeManager.hx index 08aa3a3..aea4133 100644 --- a/src/HaxeManager.hx +++ b/src/HaxeManager.hx @@ -13,6 +13,7 @@ class HaxeManager { case [null, _]: HaxeSelect.fzf(); case ["download", args]: HaxeDownload.run(args); case ["select", args]: HaxeSelect.run(args); + case ["rc", _]: HaxeRc.resolve(); case ["install", [file]]: HaxeDownload.installLocal(file); case ["install", [file, alias]]: HaxeDownload.installLocal(file, alias); @@ -91,6 +92,9 @@ class HaxeManager { } lines = lines.concat([ + ' or: ${ORANGE}hx rc${RESET}', + ' Install and select Haxe version specified by .haxerc file', + '', ' or: ${ORANGE}hx list${RESET}', ' Display all installed Haxe versions', '', diff --git a/src/HaxeRc.hx b/src/HaxeRc.hx new file mode 100644 index 0000000..044c63b --- /dev/null +++ b/src/HaxeRc.hx @@ -0,0 +1,39 @@ +import haxelib.SemVer; +import sys.io.File; +import haxe.Json; +import sys.FileSystem; +import haxe.io.Path; + +import tools.Utils; + +class HaxeRc { + public static function resolve() { + final cwd = Utils.getCallSite(); + + // TODO (?): check parent directories too + final rc = Path.join([cwd, ".haxerc"]); + + if (FileSystem.exists(rc)) { + try { + final version = Json.parse(File.getContent(rc)).version; + + if (SemVer.isValid(version)) { + HaxeDownload.downloadRelease(version, r -> HaxeSelect.select(r)); + } else if (HaxeNightlies.isValid(version)) { + switch (Utils.resolveRelease(version)) { + case null: + HaxeDownload.downloadNightly(version, r -> HaxeSelect.select(r)); + case r: + HaxeSelect.select(r); + } + } + } catch (e) { + Utils.displayError('Could not get Haxe version from .haxerc: $e'); + Sys.exit(1); + } + } else { + Utils.displayError('Did not find any .haxerc to apply'); + Sys.exit(1); + } + } +} diff --git a/src/tools/Utils.hx b/src/tools/Utils.hx index ef1b42f..e9f7aeb 100644 --- a/src/tools/Utils.hx +++ b/src/tools/Utils.hx @@ -127,6 +127,14 @@ class Utils { link(dir); } + public static function resolveRelease(ref:String):Null { + for (r in FileSystem.readDirectory(releasesDir)) { + if (StringTools.endsWith(r, '_$ref')) return r; + } + + return null; + } + public static function selectRelease(r:String):Void { final dir = Path.join([releasesDir, r]); if (!FileSystem.exists(dir)) throw 'Version $r is not installed';