Skip to content

Commit e867efb

Browse files
committed
fix: hash mismatch after downloading Zig tarball
1 parent 727abda commit e867efb

2 files changed

Lines changed: 21 additions & 31 deletions

File tree

src/install.zig

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ fn get_correct_tarball(alloc: Allocator, io: Io, client: *Client, tarball_dw_fil
8989

9090
if (!hash_matched) {
9191
if (tries < 3) {
92-
std.log.warn("Hashes do match for downloaded tarball. Retrying again...", .{});
92+
std.log.warn("Hashes do not match for downloaded tarball. Retrying again...", .{});
9393
tarball = try get_correct_tarball(alloc, io, client, tarball_dw_filename, tarball_url, total_size, shasum, cp, tries + 1);
9494
} else {
95-
std.log.err("Hashes do match for downloaded tarball. Exitting", .{});
95+
std.log.err("Hashes do not match for downloaded tarball. Exiting", .{});
9696
return error.BadChecksum;
9797
}
9898
}
@@ -126,27 +126,22 @@ pub fn downloadTarball(alloc: Allocator, io: Io, client: *Client, tb_url: []cons
126126

127127
var buff: [1024]u8 = undefined;
128128

129-
// Convert everything into f64 for less typing in calculating % download and download speed
130-
var dlnow = std.atomic.Value(f32).init(0);
131-
const total_size_d: f64 = @floatFromInt(total_size);
132-
const tarball_size_d: f64 = @floatFromInt(tarball_size);
129+
var dlnow = std.atomic.Value(usize).init(0);
130+
const tarball_size_u: usize = @intCast(tarball_size);
133131

134-
const progress_thread = try std.Thread.spawn(.{}, download_progress_bar, .{ io, &dlnow, tarball_size_d, total_size_d });
132+
const progress_thread = try std.Thread.spawn(.{}, download_progress_bar, .{ io, &dlnow, tarball_size_u, total_size });
135133
const tbw_intf = &tb_writer.interface;
136-
while (tarball_size_d + dlnow.load(AtomicOrder.monotonic) <= total_size_d) {
134+
while (tarball_size_u + dlnow.load(AtomicOrder.monotonic) < total_size) {
137135
const len = try reader.readSliceShort(&buff);
138-
_ = try tbw_intf.write(buff[0..len]);
139-
_ = dlnow.fetchAdd(@floatFromInt(len), AtomicOrder.monotonic);
140-
141-
if (len < buff.len) {
142-
break;
143-
}
136+
if (len == 0) break;
137+
try tbw_intf.writeAll(buff[0..len]);
138+
_ = dlnow.fetchAdd(len, AtomicOrder.monotonic);
144139
}
145140
progress_thread.join();
146141
try tb_writer.end();
147142
}
148143

149-
pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(f32), tarball_size: f64, total_size: f64) !void {
144+
pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(usize), tarball_size: usize, total_size: usize) !void {
150145
const stderr = File.stderr();
151146
var stderrw = stderr.writer(io, &.{});
152147
const stderr_writer = &stderrw.interface;
@@ -158,14 +153,14 @@ pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(f32), tarball_size
158153
var downloaded = dlnow.load(AtomicOrder.monotonic);
159154

160155
while (true) {
161-
const pcnt_complete: u8 = @intFromFloat((downloaded + tarball_size) * 100 / total_size);
156+
const pcnt_complete: u8 = @intCast((downloaded + tarball_size) * 100 / total_size);
162157
const newbars: u8 = pcnt_complete / 2;
163158
for (bars..newbars) |i| {
164159
std.mem.copyForwards(u8, progress_bar[i * 3 .. i * 3 + 3], "█");
165160
}
166161
bars = newbars;
167162
const time_passed: f64 = @floatFromInt(start.untilNow(io, clock).toSeconds());
168-
const speed = downloaded / 1024 / time_passed;
163+
const speed = @as(f64, @floatFromInt(downloaded)) / 1024.0 / time_passed;
169164
try stderr_writer.print("\x1b[G\x1b[0K\t\x1b[33m{s}\x1b[0m{s} {d}% {d:.1}KB/s", .{ progress_bar[0 .. newbars * 3], progress_bar[newbars * 3 ..], pcnt_complete, speed });
170165

171166
if (downloaded + tarball_size >= total_size) break;

src/zigverm-setup/main.zig

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -167,21 +167,16 @@ fn download_tarball(
167167

168168
var buff: [1024]u8 = undefined;
169169

170-
// Convert everything into f64 for less typing in calculating % download and download speed
171-
var dlnow = std.atomic.Value(f32).init(0);
172-
const total_size_d: f64 = @floatFromInt(total_size);
173-
const tarball_size_d: f64 = @floatFromInt(tarball_size);
170+
var dlnow = std.atomic.Value(usize).init(0);
171+
const tarball_size_u: usize = @intCast(tarball_size);
174172

175-
const progress_thread = try std.Thread.spawn(.{}, download_progress_bar, .{ io, &dlnow, tarball_size_d, total_size_d });
173+
const progress_thread = try std.Thread.spawn(.{}, download_progress_bar, .{ io, &dlnow, tarball_size_u, total_size });
176174
const tbw_intf = &tb_writer.interface;
177-
while (tarball_size_d + dlnow.load(AtomicOrder.monotonic) <= total_size_d) {
175+
while (tarball_size_u + dlnow.load(AtomicOrder.monotonic) < total_size) {
178176
const len = try reader.readSliceShort(&buff);
177+
if (len == 0) break;
179178
try tbw_intf.writeAll(buff[0..len]);
180-
_ = dlnow.fetchAdd(@floatFromInt(len), AtomicOrder.monotonic);
181-
182-
if (len < buff.len) {
183-
break;
184-
}
179+
_ = dlnow.fetchAdd(len, AtomicOrder.monotonic);
185180
}
186181
progress_thread.join();
187182
try tb_writer.end();
@@ -223,7 +218,7 @@ fn read_github_releases_data(alloc: std.mem.Allocator, io: Io, client: *Client)
223218
return try json.parseFromTokenSource(json.Value, alloc, &json_reader, .{});
224219
}
225220

226-
pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(f32), tarball_size: f64, total_size: f64) !void {
221+
pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(usize), tarball_size: usize, total_size: usize) !void {
227222
const stderr = std.Io.File.stderr();
228223
var stderrw = std.Io.File.Writer.init(stderr, io, &.{});
229224
const stderr_writer = &stderrw.interface;
@@ -236,14 +231,14 @@ pub fn download_progress_bar(io: Io, dlnow: *std.atomic.Value(f32), tarball_size
236231
var downloaded = dlnow.load(AtomicOrder.monotonic);
237232

238233
while (true) {
239-
const pcnt_complete: u8 = @intFromFloat((downloaded + tarball_size) * 100 / total_size);
234+
const pcnt_complete: u8 = @intCast((downloaded + tarball_size) * 100 / total_size);
240235
const newbars: u8 = pcnt_complete / 2;
241236
for (bars..newbars) |i| {
242237
std.mem.copyForwards(u8, progress_bar[i * 3 .. i * 3 + 3], "█");
243238
}
244239
bars = newbars;
245240
const time_passed: f64 = @floatFromInt(start.untilNow(io, clock).toSeconds());
246-
const speed = downloaded / 1024 / time_passed;
241+
const speed = @as(f64, @floatFromInt(downloaded)) / 1024.0 / time_passed;
247242
try stderr_writer.print("\x1b[G\x1b[0K\t\x1b[33m{s}\x1b[0m{s} {d}% {d:.1}KB/s", .{ progress_bar[0 .. newbars * 3], progress_bar[newbars * 3 ..], pcnt_complete, speed });
248243

249244
if (downloaded + tarball_size >= total_size) break;

0 commit comments

Comments
 (0)