Skip to content

Commit

Permalink
Support for "master" and update to latest version
Browse files Browse the repository at this point in the history
  • Loading branch information
trnxdev committed Oct 27, 2023
1 parent 9ce84bf commit 00fb456
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 8 deletions.
7 changes: 6 additions & 1 deletion src/main.zig
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ pub fn main() !void {

var needtofree_ = true;

const zig_version = std.fs.cwd().readFileAlloc(allocator, "zigd.ver", 1 << 21) catch blk: {
var zig_version = std.fs.cwd().readFileAlloc(allocator, "zigd.ver", 1 << 21) catch blk: {
needtofree_ = false;

var absolutecwd = try std.fs.cwd().realpathAlloc(allocator, ".");
Expand All @@ -71,6 +71,11 @@ pub fn main() !void {
@panic("No default/workspace version set in config file, and no zigd.ver file found in current directory.");
};

if (std.mem.eql(u8, zig_version, "master")) {
if (needtofree_) allocator.free(zig_version);
zig_version = try zigd.masterFromIndex(allocator);
}

defer _ = if (needtofree_) allocator.free(zig_version);

const zig_binary = try try_get_bin: {
Expand Down
60 changes: 54 additions & 6 deletions src/zigd.zig
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,59 @@ const os = switch (builtin.os.tag) {
const url_platform = os ++ "-" ++ arch;
const archive_ext = if (builtin.os.tag == .windows) "zip" else "tar.xz"; // Maybe Windows support in future?

// Fetches from "https://ziglang.org/download/index.json"
const index_url = "https://ziglang.org/download/index.json";

pub fn masterFromIndex(allocator: std.mem.Allocator) ![]const u8 {
var client = std.http.Client{ .allocator = allocator };
defer client.deinit();

var headers = std.http.Headers.init(allocator);
defer headers.deinit();

try headers.append("Content-Type", "application/json");

var req = try client.fetch(allocator, .{
.method = .GET,
.headers = headers,
.location = .{
.url = index_url,
},
});
defer req.deinit();

if (req.status.class() != .success or req.body == null) {
return error.ResponseWasNotOk;
}

const json = try std.json.parseFromSlice(std.json.Value, allocator, req.body.?, .{});
defer json.deinit();

const master = json.value.object.get("master") orelse return error.MasterNotFound;
const version = master.object.get("version") orelse return error.VersionNotFound;

if (version != .string) {
return error.VersionNotString;
}

return try allocator.dupe(u8, version.string);
}

/// Do not forget to free the returned value!
pub fn install(allocator: std.mem.Allocator, version: []const u8, home: []const u8) ![]const u8 {
pub fn install(allocator: std.mem.Allocator, given_version: []const u8, home: []const u8) ![]const u8 {
var free_s: bool = false;

var version = vl: {
if (std.mem.eql(u8, given_version, "master")) {
free_s = true;
break :vl try masterFromIndex(allocator);
} else {
break :vl given_version;
}
};

defer if (free_s) allocator.free(version) else void{};

const url = try std.fmt.allocPrint(allocator, "https://ziglang.org/builds/zig-{s}-{s}.{s}", .{ url_platform, version, archive_ext });
defer allocator.free(url);

Expand All @@ -34,19 +85,16 @@ pub fn install(allocator: std.mem.Allocator, version: []const u8, home: []const
var headers = std.http.Headers.init(allocator);
defer headers.deinit();

var req = try client.request(.GET, uri, headers, .{});
var req = try client.open(.GET, uri, headers, .{});
defer req.deinit();

try req.start(.{});
try req.send(.{});
try req.finish();
try req.wait();

if (req.response.status != .ok)
@panic("Response was not ok!");

var zigdir = try fromHome(home, "zig");
_ = zigdir;

const data = try req.reader().readAllAlloc(allocator, 2 << 50);
defer allocator.free(data);

Expand Down
2 changes: 1 addition & 1 deletion zigd.ver
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.12.0-dev.935+a1e0b9979
0.12.0-dev.1298+da06269d7

0 comments on commit 00fb456

Please sign in to comment.