authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2021-05-02 23:11:02 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2021-05-02 23:11:02 -07:00
log4ca5a1da9ec8b2fdb1dcdb04d2b3ac3dd50dfe15
treeabff0a92208bba81e90922bc98965a8771d5d27b
parentbcdb68005ebf31399be9acf6b6897180d4efcaaf

add `aq update` and `aq modfile` commands


3 files changed, 91 insertions(+), 0 deletions(-)

src/cmd/aq.zig+2
......@@ -11,6 +11,8 @@ const u = @import("./../util/index.zig");
1111
1212pub const commands = struct {
1313 pub const add = @import("./aquila/add.zig");
14 pub const update = @import("./aquila/update.zig");
15 pub const modfile = @import("./aquila/modfile.zig");
1416};
1517
1618pub const server_root = "https://aquila.red";
src/cmd/aquila/modfile.zig created+23
......@@ -0,0 +1,23 @@
1const std = @import("std");
2const gpa = std.heap.c_allocator;
3
4const u = @import("./../../util/index.zig");
5const aq = @import("./../aq.zig");
6
7//
8//
9
10pub fn execute(args: [][]u8) !void {
11 const pkg_id_v = args[0];
12
13 const url = try std.mem.join(gpa, "/", &.{ aq.server_root, pkg_id_v });
14 const val = try aq.server_fetch(url);
15
16 const v = val.get("vers").?;
17 const maj = v.get("real_major").?.Number;
18 const min = v.get("real_minor").?.Number;
19 const hash = v.get("tar_hash").?.String;
20
21 std.debug.print(" - src: http {s}/{s}.tar.gz _ {d} {d}\n", .{ aq.server_root, pkg_id_v, maj, min });
22 std.debug.print(" version: {s}\n", .{hash});
23}
src/cmd/aquila/update.zig created+66
......@@ -0,0 +1,66 @@
1const std = @import("std");
2const gpa = std.heap.c_allocator;
3
4const u = @import("./../../util/index.zig");
5const aq = @import("./../aq.zig");
6
7//
8//
9
10pub fn execute(args: [][]u8) !void {
11 //
12 const mod = try u.ModFile.init(gpa, "zig.mod");
13
14 for (mod.deps) |d| {
15 try check_dep(d);
16 }
17 for (mod.devdeps) |d| {
18 try check_dep(d);
19 }
20}
21
22fn check_dep(dep: u.Dep) !void {
23 if (dep.type != .http) {
24 return;
25 }
26 if (!std.mem.startsWith(u8, dep.path, aq.server_root)) {
27 return;
28 }
29 var pkg_id_v = std.mem.split(url_to_pkgid(dep.path), "/");
30 const host = pkg_id_v.next().?;
31 const user = pkg_id_v.next().?;
32 const pkg = pkg_id_v.next().?;
33 const vers = try vers_get_pieces(pkg_id_v.next().?);
34
35 const url = try std.mem.join(gpa, "/", &.{ aq.server_root, host, user, pkg });
36 const val = try aq.server_fetch(url);
37
38 const versions = val.get("versions").?.Array;
39 const latest = versions[versions.len - 1];
40
41 const rmaj = latest.get("real_major").?.Number;
42 const rmin = latest.get("real_minor").?.Number;
43
44 if (rmaj == vers[0] and rmin == vers[1]) {
45 return;
46 }
47
48 std.log.info("found new version: {s}/{s}/{s}/v{d}.{d}", .{ host, user, pkg, rmaj, rmin });
49}
50
51fn url_to_pkgid(url: []const u8) []const u8 {
52 var res = url;
53 res = std.mem.trimLeft(u8, res, aq.server_root);
54 res = std.mem.trimRight(u8, res, ".tar.gz");
55 return res;
56}
57
58fn vers_get_pieces(v: []const u8) ![2]f64 {
59 var it = std.mem.split(v[1..], ".");
60 const maj = it.next().?;
61 const min = it.next().?;
62 return [_]f64{
63 try std.fmt.parseFloat(f64, maj),
64 try std.fmt.parseFloat(f64, min),
65 };
66}