Skip to content

Commit

Permalink
[hx rc] install/select Haxe version specified by .haxerc
Browse files Browse the repository at this point in the history
  • Loading branch information
kLabz committed Apr 24, 2024
1 parent cd7be22 commit 48e5461
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 9 deletions.
20 changes: 11 additions & 9 deletions src/HaxeDownload.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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() {
Expand Down
4 changes: 4 additions & 0 deletions src/HaxeManager.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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',
'',
Expand Down
39 changes: 39 additions & 0 deletions src/HaxeRc.hx
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
8 changes: 8 additions & 0 deletions src/tools/Utils.hx
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,14 @@ class Utils {
link(dir);
}

public static function resolveRelease(ref:String):Null<String> {
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';
Expand Down

0 comments on commit 48e5461

Please sign in to comment.