@@ -48,64 +48,8 @@ pub fn main() !void {
4848 try remove_release (alloc , rel , cp );
4949 },
5050 Cli .show = > try show_info (alloc , cp ),
51- Cli .std = > | ver | {
52- var best_match : []const u8 = undefined ;
53- if (ver ) | v | {
54- best_match = v ;
55- } else {
56- const dir_to_check = try std .process .getCwdAlloc (alloc );
57- var overrides = try common .overrides .read_overrides (alloc , cp );
58- defer overrides .deinit ();
59-
60- best_match = try alloc .dupe (u8 , (try overrides .active_version (dir_to_check )).ver );
61- }
62-
63- const zig_path = try std .fs .path .join (alloc , &.{
64- common .paths .CommonPaths .get_zigverm_root (),
65- "installs/" ,
66- try common .release_name (alloc , try common .Release .releasefromVersion (best_match )),
67- "zig" ,
68- });
69-
70- var executable = std .ArrayList ([]const u8 ).init (alloc );
71- try executable .append (zig_path );
72- try executable .append ("std" );
73- var child = std .process .Child .init (executable .items , alloc );
74- const term = try child .spawnAndWait ();
75- std .process .exit (term .Exited );
76- },
77- Cli .reference = > | ver | {
78- var best_match : []const u8 = undefined ;
79- if (ver ) | v | {
80- best_match = v ;
81- } else {
82- const dir_to_check = try std .process .getCwdAlloc (alloc );
83- var overrides = try common .overrides .read_overrides (alloc , cp );
84- defer overrides .deinit ();
85-
86- best_match = try alloc .dupe (u8 , (try overrides .active_version (dir_to_check )).ver );
87- }
88-
89- const langref_path = try std .fs .path .join (alloc , &.{
90- common .paths .CommonPaths .get_zigverm_root (),
91- "installs/" ,
92- try common .release_name (alloc , try common .Release .releasefromVersion (best_match )),
93- "doc" ,
94- "langref.html" ,
95- });
96-
97- const main_exe = switch (builtin .os .tag ) {
98- .windows = > "explorer" ,
99- .macos = > "open" ,
100- else = > "xdg-open" ,
101- };
102-
103- var executable = std .ArrayList ([]const u8 ).init (alloc );
104- try executable .append (main_exe );
105- try executable .append (langref_path );
106- var child = std .process .Child .init (executable .items , alloc );
107- try child .spawn ();
108- },
51+ Cli .std = > | ver | open_std (ver ),
52+ Cli .reference = > | ver | open_reference (alloc , ver ),
10953 Cli .override = > | oa | {
11054 var override_args = oa ;
11155 const rel = try Release .releasefromVersion (override_args .version );
@@ -120,68 +64,7 @@ pub fn main() !void {
12064 try override_rm (alloc , cp , directory );
12165 },
12266 Cli .update_self = > try update_self .update_self (alloc , cp ),
123- Cli .update = > | version_possible | {
124- var versions : [][]const u8 = undefined ;
125- if (version_possible ) | v | {
126- versions = @constCast (&[1 ][]const u8 {v });
127- } else versions = try installed_versions (alloc , cp );
128-
129- var already_update = std .ArrayList ([]const u8 ).init (alloc );
130- var client = Client { .allocator = alloc };
131- defer client .deinit ();
132- const resp = try install .get_json_dslist (& client );
133- const releases = try json .parseFromSliceLeaky (json .Value , alloc , resp .body [0.. resp .length ], .{});
134-
135- for (versions ) | v | {
136- var rel = try Release .releasefromVersion (v );
137- const release_name = try common .release_name (alloc , rel );
138- if (cp .install_dir .openDir (release_name , .{})) | _ | {
139- var to_update = false ;
140- if (rel .spec == common .ReleaseSpec .FullVersionSpec ) {
141- to_update = false ;
142- } else if (rel .spec == common .ReleaseSpec .Master ) {
143- const zig_version = try std .SemanticVersion .parse ((try get_version_from_exe (alloc , release_name )).items );
144- var next_master_release = try Release .releasefromVersion ("master" );
145- try next_master_release .resolve (releases );
146- if (zig_version .order (next_master_release .actual_version .? ) != std .math .Order .eq ) {
147- to_update = false ;
148- }
149- } else if (rel .spec == common .ReleaseSpec .Stable ) {
150- const zig_version = try std .SemanticVersion .parse ((try get_version_from_exe (alloc , release_name )).items );
151- var next_stable_release = try Release .releasefromVersion ("stable" );
152- try next_stable_release .resolve (releases );
153-
154- if (next_stable_release .actual_version .? .order (zig_version ) == std .math .Order .gt ) {
155- to_update = true ;
156- }
157- } else {
158- var zig_version = try std .SemanticVersion .parse ((try get_version_from_exe (alloc , release_name )).items );
159- var format_buf : [32 ]u8 = undefined ;
160- var format_buf_stream = std .io .fixedBufferStream (& format_buf );
161- zig_version .patch += 1 ;
162- try zig_version .format ("" , .{}, format_buf_stream .writer ());
163- to_update = releases .object .contains (format_buf_stream .getWritten ());
164- while (releases .object .contains (format_buf_stream .getWritten ())) {
165- zig_version .patch += 1 ;
166- try format_buf_stream .seekTo (0 );
167- try zig_version .format ("" , .{}, format_buf_stream .writer ());
168- }
169- }
170- if (to_update ) {
171- try install .install_release (alloc , & client , releases , & rel , cp );
172- } else {
173- try already_update .append (v );
174- }
175- } else | _ | {
176- try install .install_release (alloc , & client , releases , & rel , cp );
177- }
178- }
179- if (already_update .items .len > 0 ) std .debug .print ("\n " , .{});
180-
181- for (already_update .items ) | v | {
182- std .debug .print ("\t {s} : Up to date\n " , .{v });
183- }
184- },
67+ Cli .update = > | version_possible | update_zig_installation (alloc , cp , version_possible ),
18568 }
18669}
18770
@@ -195,6 +78,66 @@ fn remove_release(alloc: Allocator, rel: Release, cp: CommonPaths) !void {
19578 std .log .info ("Removed {s}" , .{release_dir });
19679}
19780
81+ fn open_std (alloc : Allocator , ver : []const u8 ) void {
82+ var best_match : []const u8 = undefined ;
83+ if (ver ) | v | {
84+ best_match = v ;
85+ } else {
86+ const dir_to_check = try std .process .getCwdAlloc (alloc );
87+ var overrides = try common .overrides .read_overrides (alloc , cp );
88+ defer overrides .deinit ();
89+
90+ best_match = try alloc .dupe (u8 , (try overrides .active_version (dir_to_check )).ver );
91+ }
92+
93+ const zig_path = try std .fs .path .join (alloc , &.{
94+ common .paths .CommonPaths .get_zigverm_root (),
95+ "installs/" ,
96+ try common .release_name (alloc , try common .Release .releasefromVersion (best_match )),
97+ "zig" ,
98+ });
99+
100+ var executable = std .ArrayList ([]const u8 ).init (alloc );
101+ try executable .append (zig_path );
102+ try executable .append ("std" );
103+ var child = std .process .Child .init (executable .items , alloc );
104+ const term = try child .spawnAndWait ();
105+ std .process .exit (term .Exited );
106+ }
107+
108+ fn open_reference (alloc : Allocator , ver : []const u8 ) {
109+ var best_match : []const u8 = undefined ;
110+ if (ver ) | v | {
111+ best_match = v ;
112+ } else {
113+ const dir_to_check = try std .process .getCwdAlloc (alloc );
114+ var overrides = try common .overrides .read_overrides (alloc , cp );
115+ defer overrides .deinit ();
116+
117+ best_match = try alloc .dupe (u8 , (try overrides .active_version (dir_to_check )).ver );
118+ }
119+
120+ const langref_path = try std .fs .path .join (alloc , &.{
121+ common .paths .CommonPaths .get_zigverm_root (),
122+ "installs/" ,
123+ try common .release_name (alloc , try common .Release .releasefromVersion (best_match )),
124+ "doc" ,
125+ "langref.html" ,
126+ });
127+
128+ const main_exe = switch (builtin .os .tag ) {
129+ .windows = > "explorer" ,
130+ .macos = > "open" ,
131+ else = > "xdg-open" ,
132+ };
133+
134+ var executable = std .ArrayList ([]const u8 ).init (alloc );
135+ try executable .append (main_exe );
136+ try executable .append (langref_path );
137+ var child = std .process .Child .init (executable .items , alloc );
138+ try child .spawn ();
139+ }
140+
198141fn show_info (alloc : Allocator , cp : CommonPaths ) ! void {
199142 std .debug .print ("zigverm root:\t {s}\n\n " , .{CommonPaths .get_zigverm_root ()});
200143 var iter = cp .install_dir .iterate ();
@@ -270,3 +213,66 @@ fn get_version_from_exe(alloc: Allocator, release_name: []const u8) !std.ArrayLi
270213
271214 return version ;
272215}
216+
217+ fn update_zig_installation (alloc : Allocator , cp : CommonPaths , version_possible : [][]const u8 ) ! void {
218+ var versions : [][]const u8 = undefined ;
219+ if (version_possible ) | v | {
220+ versions = @constCast (&[1 ][]const u8 {v });
221+ } else versions = try installed_versions (alloc , cp );
222+
223+ var already_update = std .ArrayList ([]const u8 ).init (alloc );
224+ var client = Client { .allocator = alloc };
225+ defer client .deinit ();
226+ const resp = try install .get_json_dslist (& client );
227+ const releases = try json .parseFromSliceLeaky (json .Value , alloc , resp .body [0.. resp .length ], .{});
228+
229+ for (versions ) | v | {
230+ var rel = try Release .releasefromVersion (v );
231+ const release_name = try common .release_name (alloc , rel );
232+ if (cp .install_dir .openDir (release_name , .{})) | _ | {
233+ var to_update = false ;
234+ if (rel .spec == common .ReleaseSpec .FullVersionSpec ) {
235+ to_update = false ;
236+ } else if (rel .spec == common .ReleaseSpec .Master ) {
237+ const zig_version = try std .SemanticVersion .parse ((try get_version_from_exe (alloc , release_name )).items );
238+ var next_master_release = try Release .releasefromVersion ("master" );
239+ try next_master_release .resolve (releases );
240+ if (zig_version .order (next_master_release .actual_version .? ) != std .math .Order .eq ) {
241+ to_update = false ;
242+ }
243+ } else if (rel .spec == common .ReleaseSpec .Stable ) {
244+ const zig_version = try std .SemanticVersion .parse ((try get_version_from_exe (alloc , release_name )).items );
245+ var next_stable_release = try Release .releasefromVersion ("stable" );
246+ try next_stable_release .resolve (releases );
247+
248+ if (next_stable_release .actual_version .? .order (zig_version ) == std .math .Order .gt ) {
249+ to_update = true ;
250+ }
251+ } else {
252+ var zig_version = try std .SemanticVersion .parse ((try get_version_from_exe (alloc , release_name )).items );
253+ var format_buf : [32 ]u8 = undefined ;
254+ var format_buf_stream = std .io .fixedBufferStream (& format_buf );
255+ zig_version .patch += 1 ;
256+ try zig_version .format ("" , .{}, format_buf_stream .writer ());
257+ to_update = releases .object .contains (format_buf_stream .getWritten ());
258+ while (releases .object .contains (format_buf_stream .getWritten ())) {
259+ zig_version .patch += 1 ;
260+ try format_buf_stream .seekTo (0 );
261+ try zig_version .format ("" , .{}, format_buf_stream .writer ());
262+ }
263+ }
264+ if (to_update ) {
265+ try install .install_release (alloc , & client , releases , & rel , cp );
266+ } else {
267+ try already_update .append (v );
268+ }
269+ } else | _ | {
270+ try install .install_release (alloc , & client , releases , & rel , cp );
271+ }
272+ }
273+ if (already_update .items .len > 0 ) std .debug .print ("\n " , .{});
274+
275+ for (already_update .items ) | v | {
276+ std .debug .print ("\t {s} : Up to date\n " , .{v });
277+ }
278+ }
0 commit comments