From 4ca5a1da9ec8b2fdb1dcdb04d2b3ac3dd50dfe15 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sun, 2 May 2021 23:11:02 -0700 Subject: [PATCH] add `aq update` and `aq modfile` commands --- src/cmd/aq.zig | 2 ++ src/cmd/aquila/modfile.zig | 23 +++++++++++++ src/cmd/aquila/update.zig | 66 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/cmd/aquila/modfile.zig create mode 100644 src/cmd/aquila/update.zig diff --git a/src/cmd/aq.zig b/src/cmd/aq.zig index 5483e58383d8c53a97d75640a47303b51f4dcc00..8e3ffb809e82906b0d70fcf2e5a415aa7a72e52e 100644 --- a/src/cmd/aq.zig +++ b/src/cmd/aq.zig @@ -11,6 +11,8 @@ const u = @import("./../util/index.zig"); pub const commands = struct { pub const add = @import("./aquila/add.zig"); + pub const update = @import("./aquila/update.zig"); + pub const modfile = @import("./aquila/modfile.zig"); }; pub const server_root = "https://aquila.red"; diff --git a/src/cmd/aquila/modfile.zig b/src/cmd/aquila/modfile.zig new file mode 100644 index 0000000000000000000000000000000000000000..fc0fb7aeccb2d20d339f4d5cdcf828608920edaa --- /dev/null +++ b/src/cmd/aquila/modfile.zig @@ -0,0 +1,23 @@ +const std = @import("std"); +const gpa = std.heap.c_allocator; + +const u = @import("./../../util/index.zig"); +const aq = @import("./../aq.zig"); + +// +// + +pub fn execute(args: [][]u8) !void { + const pkg_id_v = args[0]; + + const url = try std.mem.join(gpa, "/", &.{ aq.server_root, pkg_id_v }); + const val = try aq.server_fetch(url); + + const v = val.get("vers").?; + const maj = v.get("real_major").?.Number; + const min = v.get("real_minor").?.Number; + const hash = v.get("tar_hash").?.String; + + std.debug.print(" - src: http {s}/{s}.tar.gz _ {d} {d}\n", .{ aq.server_root, pkg_id_v, maj, min }); + std.debug.print(" version: {s}\n", .{hash}); +} diff --git a/src/cmd/aquila/update.zig b/src/cmd/aquila/update.zig new file mode 100644 index 0000000000000000000000000000000000000000..8fe062fcd46f3936d08c1deabb6e47bd533fc63e --- /dev/null +++ b/src/cmd/aquila/update.zig @@ -0,0 +1,66 @@ +const std = @import("std"); +const gpa = std.heap.c_allocator; + +const u = @import("./../../util/index.zig"); +const aq = @import("./../aq.zig"); + +// +// + +pub fn execute(args: [][]u8) !void { + // + const mod = try u.ModFile.init(gpa, "zig.mod"); + + for (mod.deps) |d| { + try check_dep(d); + } + for (mod.devdeps) |d| { + try check_dep(d); + } +} + +fn check_dep(dep: u.Dep) !void { + if (dep.type != .http) { + return; + } + if (!std.mem.startsWith(u8, dep.path, aq.server_root)) { + return; + } + var pkg_id_v = std.mem.split(url_to_pkgid(dep.path), "/"); + const host = pkg_id_v.next().?; + const user = pkg_id_v.next().?; + const pkg = pkg_id_v.next().?; + const vers = try vers_get_pieces(pkg_id_v.next().?); + + const url = try std.mem.join(gpa, "/", &.{ aq.server_root, host, user, pkg }); + const val = try aq.server_fetch(url); + + const versions = val.get("versions").?.Array; + const latest = versions[versions.len - 1]; + + const rmaj = latest.get("real_major").?.Number; + const rmin = latest.get("real_minor").?.Number; + + if (rmaj == vers[0] and rmin == vers[1]) { + return; + } + + std.log.info("found new version: {s}/{s}/{s}/v{d}.{d}", .{ host, user, pkg, rmaj, rmin }); +} + +fn url_to_pkgid(url: []const u8) []const u8 { + var res = url; + res = std.mem.trimLeft(u8, res, aq.server_root); + res = std.mem.trimRight(u8, res, ".tar.gz"); + return res; +} + +fn vers_get_pieces(v: []const u8) ![2]f64 { + var it = std.mem.split(v[1..], "."); + const maj = it.next().?; + const min = it.next().?; + return [_]f64{ + try std.fmt.parseFloat(f64, maj), + try std.fmt.parseFloat(f64, min), + }; +} -- 2.54.0