@@ -14,6 +14,7 @@ const Sha256 = std.crypto.hash.sha2.Sha256;
1414const release_name = common .release_name ;
1515const AtomicOrder = std .builtin .AtomicOrder ;
1616const time = std .time ;
17+ const File = std .fs .File ;
1718
1819const default_os = builtin .target .os .tag ;
1920const default_arch = builtin .target .cpu .arch ;
@@ -43,11 +44,13 @@ pub fn install_release(alloc: Allocator, client: *Client, releases: json.Value,
4344 var tarball = try get_correct_tarball (alloc , client , tarball_dw_filename , tarball_url , total_size , shasum , cp , 0 );
4445 defer tarball .close ();
4546
46- var tarball_reader = std .io .bufferedReader (tarball .reader ());
47+ var buf : [4096 ]u8 = undefined ;
48+ var tarball_reader = tarball .reader (& buf );
49+ const tbl_intf = & tarball_reader .interface ;
4750
4851 std .log .info ("Extracting {s}" , .{tarball_dw_filename });
4952 try cp .install_dir .deleteTree (try release_name (alloc , rel .* ));
50- try extract_xz (alloc , cp , rel .* , tarball_reader . reader () );
53+ try extract_xz (alloc , cp , rel .* , tbl_intf );
5154
5255 try cp .download_dir .deleteFile (tarball_dw_filename );
5356}
@@ -58,11 +61,13 @@ fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: [
5861 // open the file with .truncate = false and then later move the file cursor to the end of the file using seekFromEnd().
5962 // This is basically Zig's equivalent to *open in append mode*.
6063 var tarball = try cp .download_dir .createFile (tarball_dw_filename , .{ .read = true , .truncate = force_redownload });
61- const tarball_size = if (force_redownload ) 0 else (try tarball .metadata ()).size ();
64+ const tarball_size = if (force_redownload ) 0 else try tarball .getEndPos ();
65+
66+ var buf : [4096 ]u8 = undefined ;
6267
6368 if (tarball_size < total_size or force_redownload ) {
6469 try tarball .seekTo (tarball_size );
65- var tarball_writer = std . io . bufferedWriter ( tarball .writer () );
70+ var tarball_writer = tarball .writer (& buf );
6671 try download_tarball (
6772 alloc ,
6873 client ,
@@ -76,8 +81,9 @@ fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: [
7681 std .log .info ("Found already existing tarball, using that" , .{});
7782 }
7883
79- var tarball_reader = std .io .bufferedReader (tarball .reader ());
80- const hash_matched = try check_hash (shasum , tarball_reader .reader ());
84+ var tarball_reader = tarball .reader (& buf );
85+ const tbl_intf = & tarball_reader .interface ;
86+ const hash_matched = try check_hash (shasum , tbl_intf );
8187
8288 if (! hash_matched ) {
8389 if (tries < 3 ) {
@@ -92,7 +98,7 @@ fn get_correct_tarball(alloc: Allocator, client: *Client, tarball_dw_filename: [
9298 return tarball ;
9399}
94100
95- pub fn download_tarball (alloc : Allocator , client : * Client , tb_url : []const u8 , tb_writer : anytype , tarball_size : u64 , total_size : usize ) ! void {
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 {
96102 std .log .info ("Downloading {s}" , .{tb_url });
97103 const tarball_uri = try std .Uri .parse (tb_url );
98104
@@ -105,17 +111,15 @@ pub fn download_tarball(alloc: Allocator, client: *Client, tb_url: []const u8, t
105111
106112 // Attach the Range header for partial downloads
107113 if (tarball_size > 0 ) {
108- var size = std .ArrayList (u8 ).init (alloc );
109- try size .appendSlice ("bytes=" );
110- var size_writer = size .writer ();
111- try std .fmt .formatInt (tarball_size , 10 , .lower , .{}, & size_writer );
112- try size .append ('-' );
114+ var size : std .ArrayListUnmanaged (u8 ) = .empty ;
115+ try size .print (alloc , "bytes={}-" , .{tarball_size });
113116 req .? .extra_headers = &.{http.Header { .name = "Range" , .value = size .items }};
114117 }
115118
116- try req .? .send ();
117- try req .? .wait ();
118- var reader = req .? .reader ();
119+ try req .? .sendBodiless ();
120+ var response = try req .? .receiveHead (&.{});
121+
122+ var reader = response .reader (&.{});
119123
120124 var buff : [1024 ]u8 = undefined ;
121125
@@ -125,21 +129,24 @@ pub fn download_tarball(alloc: Allocator, client: *Client, tb_url: []const u8, t
125129 const tarball_size_d : f64 = @floatFromInt (tarball_size );
126130
127131 const progress_thread = try std .Thread .spawn (.{}, download_progress_bar , .{ & dlnow , tarball_size_d , total_size_d });
132+ const tbw_intf = & tb_writer .interface ;
128133 while (tarball_size_d + dlnow .load (AtomicOrder .monotonic ) <= total_size_d ) {
129- const len = try reader .read (& buff );
134+ const len = try reader .readSliceShort (& buff );
130135 if (len == 0 ) {
131136 break ;
132137 }
133- _ = try tb_writer .write (buff [0.. len ]);
138+ _ = try tbw_intf .write (buff [0.. len ]);
134139
135140 _ = dlnow .fetchAdd (@floatFromInt (len ), AtomicOrder .monotonic );
136141 }
137142 progress_thread .join ();
138- try tb_writer .flush ();
143+ try tb_writer .end ();
139144}
140145
141146pub fn download_progress_bar (dlnow : * std .atomic .Value (f32 ), tarball_size : f64 , total_size : f64 ) ! void {
142- var stderr_writer = std .io .getStdErr ().writer ();
147+ const stderr = std .fs .File .stderr ();
148+ var stderrw = std .fs .File .Writer .init (stderr , &.{});
149+ const stderr_writer = & stderrw .interface ;
143150 var progress_bar : [150 ]u8 = ("░" ** 50 ).* ;
144151 var bars : u8 = 0 ;
145152 var timer = try time .Timer .start ();
@@ -157,7 +164,7 @@ pub fn download_progress_bar(dlnow: *std.atomic.Value(f32), tarball_size: f64, t
157164
158165 if (downloaded + tarball_size >= total_size ) break ;
159166
160- std .time .sleep (500 * time .ns_per_ms );
167+ std .Thread .sleep (500 * time .ns_per_ms );
161168 downloaded = dlnow .load (AtomicOrder .monotonic );
162169 }
163170 try stderr_writer .print ("\n " , .{});
@@ -174,40 +181,39 @@ pub fn get_json_dslist(client: *Client) anyerror!JsonResponse {
174181 std .process .exit (1 );
175182 }
176183
177- try req .? .send ();
178- try req .? .wait ( );
184+ try req .? .sendBodiless ();
185+ var response = try req .? .receiveHead (&.{} );
179186
180187 var json_buff : [1024 * 100 ]u8 = undefined ;
181- const bytes_read = try req .? .reader ().readAll (& json_buff );
188+ const res_r = response .reader (&.{});
189+ const bytes_read = try res_r .readSliceShort (& json_buff );
182190
183191 return JsonResponse { .body = json_buff , .length = bytes_read };
184192}
185193
186194pub fn make_request (client : * Client , uri : std.Uri ) ? Client.Request {
195+ // TODO: REMOVE THIS IF UNUSED
187196 var http_header_buff : [8192 ]u8 = undefined ;
197+ _ = & http_header_buff ;
188198 for (0.. 5) | i | {
189- const tryreq = client .open (
190- http .Method .GET ,
191- uri ,
192- Client.RequestOptions { .server_header_buffer = & http_header_buff },
193- );
199+ const tryreq = client .request (http .Method .GET , uri , .{});
194200 if (tryreq ) | r | {
195201 return r ;
196202 } else | err | {
197203 std .log .warn ("{}. Retrying again [{}/5]" , .{ err , i + 1 });
198- std .time .sleep (std .time .ns_per_ms * 500 );
204+ std .Thread .sleep (std .time .ns_per_ms * 500 );
199205 }
200206 }
201207 return null ;
202208}
203209
204- pub fn check_hash (hashstr : * const [64 ]u8 , reader : anytype ) ! bool {
210+ pub fn check_hash (hashstr : * const [64 ]u8 , reader : * std.Io.Reader ) ! bool {
205211 var buff : [1024 ]u8 = undefined ;
206212
207213 var hasher = Sha256 .init (.{});
208214
209215 while (true ) {
210- const len = try reader .read (& buff );
216+ const len = try reader .readSliceShort (& buff );
211217 if (len == 0 ) {
212218 break ;
213219 }
@@ -218,10 +224,14 @@ pub fn check_hash(hashstr: *const [64]u8, reader: anytype) !bool {
218224 return std .mem .eql (u8 , & hasher .finalResult (), & hash );
219225}
220226
221- inline fn extract_xz (alloc : Allocator , dirs : CommonPaths , rel : Release , reader : anytype ) ! void {
222- var xz = try std .compress .xz .decompress (alloc , reader );
227+ inline fn extract_xz (alloc : Allocator , dirs : CommonPaths , rel : Release , reader : * std.Io.Reader ) ! void {
228+ // HACK: Use the older interface until Zig upgrades this
229+ const r = reader .adaptToOldInterface ();
230+ var xz = try std .compress .xz .decompress (alloc , r );
223231 const release_dir = try dirs .install_dir .makeOpenPath (try release_name (alloc , rel ), .{});
224- try std .tar .pipeToFileSystem (release_dir , xz .reader (), .{ .strip_components = 1 });
232+ var adpt = xz .reader ().adaptToNewApi (&.{});
233+ const intf = & adpt .new_interface ;
234+ try std .tar .pipeToFileSystem (release_dir , intf , .{ .strip_components = 1 });
225235}
226236
227237pub fn target_name () []const u8 {
0 commit comments