Skip to content

Commit 29a4859

Browse files
committed
fix: use the new Io interface introduced in ziglang/zig/pull/25592
1 parent 6623ee2 commit 29a4859

File tree

5 files changed

+60
-50
lines changed

5 files changed

+60
-50
lines changed

src/common/overrides.zig

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const StringArrayHashMap = std.StringArrayHashMap;
44
const json = std.json;
55
const CommonPaths = @import("paths.zig").CommonPaths;
66
const File = std.fs.File;
7+
const Io = std.Io;
78

89
pub const OverrideMap = struct {
910
backing_map: json.ObjectMap,
@@ -51,9 +52,9 @@ pub const OverrideMap = struct {
5152
}
5253
};
5354

54-
pub fn read_overrides(alloc: Allocator, cp: CommonPaths) !OverrideMap {
55+
pub fn read_overrides(alloc: Allocator, io: Io, cp: CommonPaths) !OverrideMap {
5556
var buf: [4096]u8 = undefined;
56-
var file_bufreader = File.Reader.init(cp.overrides, &buf);
57+
var file_bufreader = cp.overrides.reader(io, &buf);
5758
const file_reader = &file_bufreader.interface;
5859

5960
var overrides = OverrideMap{ .backing_map = json.ObjectMap.init(alloc), .allocator = alloc };

src/install.zig

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const release_name = common.release_name;
1515
const AtomicOrder = std.builtin.AtomicOrder;
1616
const time = std.time;
1717
const File = std.fs.File;
18+
const Io = std.Io;
1819

1920
const default_os = builtin.target.os.tag;
2021
const default_arch = builtin.target.cpu.arch;
@@ -30,7 +31,7 @@ const InstallError = error{
3031
TargetNotAvailable,
3132
};
3233

33-
pub fn install_release(alloc: Allocator, client: *Client, releases: json.Value, rel: *Release, cp: CommonPaths) !void {
34+
pub fn install_release(alloc: Allocator, io: Io, client: *Client, releases: json.Value, rel: *Release, cp: CommonPaths) !void {
3435
try rel.resolve(releases);
3536

3637
const release: json.Value = releases.object.get(try rel.actualVersion(alloc)).?;
@@ -41,11 +42,11 @@ pub fn install_release(alloc: Allocator, client: *Client, releases: json.Value,
4142

4243
const tarball_dw_filename = try dw_tarball_name(alloc, rel.*);
4344

44-
var tarball = try get_correct_tarball(alloc, client, tarball_dw_filename, tarball_url, total_size, shasum, cp, 0);
45+
var tarball = try get_correct_tarball(alloc, io, client, tarball_dw_filename, tarball_url, total_size, shasum, cp, 0);
4546
defer tarball.close();
4647

4748
var buf: [4096]u8 = undefined;
48-
var tarball_reader = tarball.reader(&buf);
49+
var tarball_reader = tarball.reader(io, &buf);
4950
const tbl_intf = &tarball_reader.interface;
5051

5152
std.log.info("Extracting {s}", .{tarball_dw_filename});
@@ -55,7 +56,7 @@ pub fn install_release(alloc: Allocator, client: *Client, releases: json.Value,
5556
try cp.download_dir.deleteFile(tarball_dw_filename);
5657
}
5758

58-
fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: []const u8, tarball_url: []const u8, total_size: usize, shasum: *const [64]u8, cp: CommonPaths, tries: u8) !std.fs.File {
59+
fn get_correct_tarball(alloc: Allocator, io: Io, client: *Client, tarball_dw_filename: []const u8, tarball_url: []const u8, total_size: usize, shasum: *const [64]u8, cp: CommonPaths, tries: u8) !std.fs.File {
5960
const force_redownload = tries > 0;
6061
// IMPORTANT: To continue downloading if the file isn't completely downloaded AKA partial downloading, we
6162
// open the file with .truncate = false and then later move the file cursor to the end of the file using seekFromEnd().
@@ -70,6 +71,7 @@ fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: [
7071
var tarball_writer = tarball.writer(&buf);
7172
try download_tarball(
7273
alloc,
74+
io,
7375
client,
7476
tarball_url,
7577
&tarball_writer,
@@ -81,14 +83,14 @@ fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: [
8183
std.log.info("Found already existing tarball, using that", .{});
8284
}
8385

84-
var tarball_reader = tarball.reader(&buf);
86+
var tarball_reader = tarball.reader(io, &buf);
8587
const tbl_intf = &tarball_reader.interface;
8688
const hash_matched = try check_hash(shasum, tbl_intf);
8789

8890
if (!hash_matched) {
8991
if (tries < 3) {
9092
std.log.warn("Hashes do match for downloaded tarball. Retrying again...", .{});
91-
tarball = try get_correct_tarball(alloc, client, tarball_dw_filename, tarball_url, total_size, shasum, cp, tries + 1);
93+
tarball = try get_correct_tarball(alloc, io, client, tarball_dw_filename, tarball_url, total_size, shasum, cp, tries + 1);
9294
} else {
9395
std.log.err("Hashes do match for downloaded tarball. Exitting", .{});
9496
return error.BadChecksum;
@@ -98,11 +100,11 @@ fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: [
98100
return tarball;
99101
}
100102

101-
pub fn download_tarball(alloc: Allocator, client: *Client, tb_url: []const u8, tb_writer: *std.fs.File.Writer, tarball_size: u64, total_size: usize) !void {
103+
pub fn download_tarball(alloc: Allocator, io: Io, client: *Client, tb_url: []const u8, tb_writer: *std.fs.File.Writer, tarball_size: u64, total_size: usize) !void {
102104
std.log.info("Downloading {s}", .{tb_url});
103105
const tarball_uri = try std.Uri.parse(tb_url);
104106

105-
var req = make_request(client, tarball_uri);
107+
var req = make_request(client, io, tarball_uri);
106108
defer req.?.deinit();
107109
if (req == null) {
108110
std.log.err("Failed fetching the install tarball. Exitting (1)...", .{});
@@ -129,7 +131,7 @@ pub fn download_tarball(alloc: Allocator, client: *Client, tb_url: []const u8, t
129131
const total_size_d: f64 = @floatFromInt(total_size);
130132
const tarball_size_d: f64 = @floatFromInt(tarball_size);
131133

132-
const progress_thread = try std.Thread.spawn(.{}, download_progress_bar, .{ &dlnow, tarball_size_d, total_size_d });
134+
const progress_thread = try std.Thread.spawn(.{}, download_progress_bar, .{ io, &dlnow, tarball_size_d, total_size_d });
133135
const tbw_intf = &tb_writer.interface;
134136
while (tarball_size_d + dlnow.load(AtomicOrder.monotonic) <= total_size_d) {
135137
const len = try reader.readSliceShort(&buff);
@@ -144,7 +146,7 @@ pub fn download_tarball(alloc: Allocator, client: *Client, tb_url: []const u8, t
144146
try tb_writer.end();
145147
}
146148

147-
pub fn download_progress_bar(dlnow: *std.atomic.Value(f32), tarball_size: f64, total_size: f64) !void {
149+
pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(f32), tarball_size: f64, total_size: f64) !void {
148150
const stderr = std.fs.File.stderr();
149151
var stderrw = std.fs.File.Writer.init(stderr, &.{});
150152
const stderr_writer = &stderrw.interface;
@@ -165,17 +167,17 @@ pub fn download_progress_bar(dlnow: *std.atomic.Value(f32), tarball_size: f64, t
165167

166168
if (downloaded + tarball_size >= total_size) break;
167169

168-
std.Thread.sleep(500 * time.ns_per_ms);
170+
io.sleep(.fromMilliseconds(500), .awake) catch {};
169171
downloaded = dlnow.load(AtomicOrder.monotonic);
170172
}
171173
try stderr_writer.print("\n", .{});
172174
}
173175

174-
pub fn get_json_dslist(client: *Client) anyerror!JsonResponse {
176+
pub fn get_json_dslist(io: Io, client: *Client) anyerror!JsonResponse {
175177
std.log.info("Fetching the latest index", .{});
176178
const uri = try std.Uri.parse("https://ziglang.org/download/index.json");
177179

178-
var req = make_request(client, uri);
180+
var req = make_request(client, io, uri);
179181
defer req.?.deinit();
180182
if (req == null) {
181183
std.log.err("Failed fetching the index. Exitting (1)...", .{});
@@ -196,7 +198,7 @@ pub fn get_json_dslist(client: *Client) anyerror!JsonResponse {
196198
return JsonResponse{ .body = json_buf, .length = bytes_read };
197199
}
198200

199-
pub fn make_request(client: *Client, uri: std.Uri) ?Client.Request {
201+
pub fn make_request(client: *Client, io: Io, uri: std.Uri) ?Client.Request {
200202
// TODO: REMOVE THIS IF UNUSED
201203
var http_header_buff: [8192]u8 = undefined;
202204
_ = &http_header_buff;
@@ -206,7 +208,7 @@ pub fn make_request(client: *Client, uri: std.Uri) ?Client.Request {
206208
return r;
207209
} else |err| {
208210
std.log.warn("{}. Retrying again [{}/5]", .{ err, i + 1 });
209-
std.Thread.sleep(std.time.ns_per_ms * 500);
211+
io.sleep(.fromMilliseconds(500), .awake) catch {};
210212
}
211213
}
212214
return null;

src/main.zig

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ const streql = common.streql;
1515
const CommonPaths = paths.CommonPaths;
1616
const Release = common.Release;
1717
const install = @import("install.zig");
18+
const Io = std.Io;
1819

1920
pub const Version = "0.7.1";
2021

2122
pub fn main() !void {
2223
var aa = std.heap.ArenaAllocator.init(std.heap.page_allocator);
2324
const alloc = aa.allocator();
25+
var threaded = std.Io.Threaded.init(alloc);
26+
const io = threaded.io();
2427

2528
const command = try Cli.read_args(alloc);
2629

@@ -35,36 +38,36 @@ pub fn main() !void {
3538
std.process.exit(0);
3639
} else |_| {}
3740

38-
var client = Client{ .allocator = alloc };
41+
var client = Client{ .allocator = alloc, .io = io };
3942
defer client.deinit();
4043

41-
const resp = try install.get_json_dslist(&client);
44+
const resp = try install.get_json_dslist(io, &client);
4245
const releases = try json.parseFromSliceLeaky(json.Value, alloc, resp.body[0..resp.length], .{});
4346

44-
try install.install_release(alloc, &client, releases, &rel, cp);
47+
try install.install_release(alloc, io, &client, releases, &rel, cp);
4548
},
4649
Cli.remove => |version| {
4750
const rel = try Release.releaseFromVersion(version);
4851
try remove_release(alloc, rel, cp);
4952
},
50-
Cli.show => try show_info(alloc, cp),
51-
Cli.std => |ver| try open_std(alloc, cp, ver),
52-
Cli.reference => |ver| try open_reference(alloc, cp, ver),
53+
Cli.show => try show_info(alloc, io, cp),
54+
Cli.std => |ver| try open_std(alloc, io, cp, ver),
55+
Cli.reference => |ver| try open_reference(alloc, io, cp, ver),
5356
Cli.override => |oa| {
5457
var override_args = oa;
5558
const rel = try Release.releaseFromVersion(override_args.version);
5659
if (override_args.directory != null and !streql(override_args.directory.?, "default")) {
5760
override_args.directory = try std.fs.realpathAlloc(alloc, override_args.directory.?);
5861
}
5962
const directory = override_args.directory orelse try std.process.getCwdAlloc(alloc);
60-
try override(alloc, cp, rel, directory);
63+
try override(alloc, io, cp, rel, directory);
6164
},
6265
Cli.override_rm => |dir| {
6366
const directory = dir orelse try std.process.getCwdAlloc(alloc);
64-
try override_rm(alloc, cp, directory);
67+
try override_rm(alloc, io, cp, directory);
6568
},
66-
Cli.update_self => try update_self.update_self(alloc, cp),
67-
Cli.update => |version_possible| try update_zig_installation(alloc, cp, version_possible),
69+
Cli.update_self => try update_self.update_self(alloc, io, cp),
70+
Cli.update => |version_possible| try update_zig_installation(alloc, io, cp, version_possible),
6871
}
6972
}
7073

@@ -79,13 +82,13 @@ fn remove_release(alloc: Allocator, rel: Release, cp: CommonPaths) !void {
7982
}
8083
}
8184

82-
fn open_std(alloc: Allocator, cp: CommonPaths, ver: ?[]const u8) !void {
85+
fn open_std(alloc: Allocator, io: Io, cp: CommonPaths, ver: ?[]const u8) !void {
8386
var best_match: []const u8 = undefined;
8487
if (ver) |v| {
8588
best_match = v;
8689
} else {
8790
const dir_to_check = try std.process.getCwdAlloc(alloc);
88-
var overrides = try common.overrides.read_overrides(alloc, cp);
91+
var overrides = try common.overrides.read_overrides(alloc, io, cp);
8992
defer overrides.deinit();
9093

9194
best_match = try alloc.dupe(u8, (try overrides.active_version(dir_to_check)).ver);
@@ -106,13 +109,13 @@ fn open_std(alloc: Allocator, cp: CommonPaths, ver: ?[]const u8) !void {
106109
std.process.exit(term.Exited);
107110
}
108111

109-
fn open_reference(alloc: Allocator, cp: CommonPaths, ver: ?[]const u8) !void {
112+
fn open_reference(alloc: Allocator, io: Io, cp: CommonPaths, ver: ?[]const u8) !void {
110113
var best_match: []const u8 = undefined;
111114
if (ver) |v| {
112115
best_match = v;
113116
} else {
114117
const dir_to_check = try std.process.getCwdAlloc(alloc);
115-
var overrides = try common.overrides.read_overrides(alloc, cp);
118+
var overrides = try common.overrides.read_overrides(alloc, io, cp);
116119
defer overrides.deinit();
117120

118121
best_match = try alloc.dupe(u8, (try overrides.active_version(dir_to_check)).ver);
@@ -139,12 +142,12 @@ fn open_reference(alloc: Allocator, cp: CommonPaths, ver: ?[]const u8) !void {
139142
try child.spawn();
140143
}
141144

142-
fn show_info(alloc: Allocator, cp: CommonPaths) !void {
145+
fn show_info(alloc: Allocator, io: Io, cp: CommonPaths) !void {
143146
std.debug.print("zigverm root:\t{s}\n\n", .{CommonPaths.get_zigverm_root()});
144147
var iter = cp.install_dir.iterate();
145148

146149
const dir_to_check = try std.process.getCwdAlloc(alloc);
147-
var overrides = try common.overrides.read_overrides(alloc, cp);
150+
var overrides = try common.overrides.read_overrides(alloc, io, cp);
148151
defer overrides.deinit();
149152

150153
const active_version = (try overrides.active_version(dir_to_check));
@@ -162,8 +165,8 @@ fn show_info(alloc: Allocator, cp: CommonPaths) !void {
162165
}
163166
}
164167

165-
fn override(alloc: Allocator, cp: CommonPaths, rel: Release, directory: []const u8) !void {
166-
var overrides = try common.overrides.read_overrides(alloc, cp);
168+
fn override(alloc: Allocator, io: Io, cp: CommonPaths, rel: Release, directory: []const u8) !void {
169+
var overrides = try common.overrides.read_overrides(alloc, io, cp);
167170
defer overrides.deinit();
168171
var actual_dir: []const u8 = undefined;
169172

@@ -178,12 +181,12 @@ fn override(alloc: Allocator, cp: CommonPaths, rel: Release, directory: []const
178181
try common.overrides.write_overrides(overrides, cp);
179182
}
180183

181-
fn override_rm(alloc: Allocator, cp: CommonPaths, directory: []const u8) !void {
184+
fn override_rm(alloc: Allocator, io: Io, cp: CommonPaths, directory: []const u8) !void {
182185
if (streql(directory, "default")) {
183186
std.log.err("cannot remove the default override", .{});
184187
std.process.exit(1);
185188
}
186-
var overrides = try common.overrides.read_overrides(alloc, cp);
189+
var overrides = try common.overrides.read_overrides(alloc, io, cp);
187190
defer overrides.deinit();
188191
var actual_dir: []const u8 = undefined;
189192
if (streql(directory, "default"))
@@ -232,17 +235,17 @@ fn get_version_from_exe(alloc: Allocator, release_name: []const u8) !std.ArrayLi
232235
return version;
233236
}
234237

235-
fn update_zig_installation(alloc: Allocator, cp: CommonPaths, version_possible: ?[]const u8) !void {
238+
fn update_zig_installation(alloc: Allocator, io: Io, cp: CommonPaths, version_possible: ?[]const u8) !void {
236239
var versions: [][]const u8 = undefined;
237240
if (version_possible) |v| {
238241
versions = @constCast(&[1][]const u8{v});
239242
} else versions = try installed_versions(alloc, cp);
240243

241244
var updated_now: std.ArrayList([]const u8) = .empty;
242245
var already_update: std.ArrayList([]const u8) = .empty;
243-
var client = Client{ .allocator = alloc };
246+
var client = Client{ .allocator = alloc, .io = io };
244247
defer client.deinit();
245-
const resp = try install.get_json_dslist(&client);
248+
const resp = try install.get_json_dslist(io, &client);
246249
const releases = try json.parseFromSliceLeaky(json.Value, alloc, resp.body[0..resp.length], .{});
247250

248251
for (versions) |v| {
@@ -282,12 +285,12 @@ fn update_zig_installation(alloc: Allocator, cp: CommonPaths, version_possible:
282285
}
283286
if (to_update) {
284287
try updated_now.append(alloc, v);
285-
try install.install_release(alloc, &client, releases, &rel, cp);
288+
try install.install_release(alloc, io, &client, releases, &rel, cp);
286289
} else {
287290
try already_update.append(alloc, v);
288291
}
289292
} else |_| {
290-
try install.install_release(alloc, &client, releases, &rel, cp);
293+
try install.install_release(alloc, io, &client, releases, &rel, cp);
291294
}
292295
}
293296
std.debug.print("\n", .{});

src/update-self.zig

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const CommonPaths = common.paths.CommonPaths;
1111
const Client = std.http.Client;
1212
const File = std.fs.File;
1313
const Allocator = std.mem.Allocator;
14+
const Io = std.Io;
1415

1516
const DownloadTarball = struct {
1617
filename: []const u8,
@@ -38,12 +39,12 @@ const DownloadTarball = struct {
3839
}
3940
};
4041

41-
pub fn update_self(alloc: Allocator, cp: CommonPaths) !void {
42-
var client = Client{ .allocator = alloc };
42+
pub fn update_self(alloc: Allocator, io: Io, cp: CommonPaths) !void {
43+
var client = Client{ .allocator = alloc, .io = io };
4344
defer client.deinit();
4445

4546
std.log.info("getting latest index from github releases", .{});
46-
const parsed = try read_github_releases_data(alloc, &client);
47+
const parsed = try read_github_releases_data(alloc, io, &client);
4748

4849
defer parsed.deinit();
4950

@@ -70,11 +71,11 @@ pub fn update_self(alloc: Allocator, cp: CommonPaths) !void {
7071
try download_tarball.createDownloadFile(cp);
7172
defer download_tarball.deinit() catch {};
7273
if (download_tarball.file_size < download_tarball.actual_size)
73-
try install.download_tarball(alloc, &client, download_tarball.url, &download_tarball.writer.?, download_tarball.file_size, download_tarball.actual_size);
74+
try install.download_tarball(alloc, io, &client, download_tarball.url, &download_tarball.writer.?, download_tarball.file_size, download_tarball.actual_size);
7475
try download_tarball.file_handle.?.seekTo(0);
7576

7677
var buf: [4096]u8 = undefined;
77-
var src = File.Reader.init(download_tarball.file_handle.?, &buf);
78+
var src = download_tarball.file_handle.?.reader(io, &buf);
7879

7980
var zipfile = try ZipArchive.openFromFileReader(alloc, &src);
8081
defer zipfile.close();
@@ -109,9 +110,9 @@ fn writeZipMember(zipfile: ZipArchive, path: []const u8, cp: CommonPaths) !void
109110
}
110111
}
111112

112-
fn read_github_releases_data(alloc: Allocator, client: *Client) !json.Parsed(json.Value) {
113+
fn read_github_releases_data(alloc: Allocator, io: Io, client: *Client) !json.Parsed(json.Value) {
113114
const uri = try std.Uri.parse("https://api.github.com/repos/AMythicDev/zigverm/releases/latest");
114-
var req = install.make_request(client, uri);
115+
var req = install.make_request(client, io, uri);
115116
defer req.?.deinit();
116117

117118
if (req == null) {

0 commit comments

Comments
 (0)