From 4bb41fdcee156ecc69fdac3b21a59ac6b1ac6ce9 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Wed, 7 Jul 2021 12:54:18 -0700 Subject: [PATCH] cmd/fetch- deduplicate dependency list when downloading --- src/cmd/ci.zig | 5 +++-- src/cmd/fetch.zig | 5 +++-- src/cmd/license.zig | 5 +++-- src/cmd/sum.zig | 5 +++-- src/common.zig | 27 +++++++++++++++++++++------ src/util/module.zig | 2 +- 6 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/cmd/ci.zig b/src/cmd/ci.zig index 6e3323ddb77db5886f3c54603c24a05fcad97e8e..06f344bc1b6d1f461ab7d7d7b8949acedbbe1d8b 100644 --- a/src/cmd/ci.zig +++ b/src/cmd/ci.zig @@ -12,11 +12,12 @@ pub fn execute(args: [][]u8) !void { const dir = try std.fs.path.join(gpa, &.{ ".zigmod", "deps" }); - const top_module = try common.collect_deps_deep(dir, "zig.mod", .{ + var options = common.CollectOptions{ .log = true, .update = false, .lock = try common.parse_lockfile("zigmod.lock"), - }); + }; + const top_module = try common.collect_deps_deep(dir, "zig.mod", &options); const list = &std.ArrayList(u.Module).init(gpa); try common.collect_pkgs(top_module, list); diff --git a/src/cmd/fetch.zig b/src/cmd/fetch.zig index 4bc501af0e38b73e4c71b6f30bd9cc74baa07aeb..bcb44b38e17c59d7e500ad1ca406a32bc007f9c2 100644 --- a/src/cmd/fetch.zig +++ b/src/cmd/fetch.zig @@ -14,10 +14,11 @@ pub fn execute(args: [][]u8) !void { const dir = try std.fs.path.join(gpa, &.{ ".zigmod", "deps" }); const should_update = !(args.len >= 1 and std.mem.eql(u8, args[0], "--no-update")); - const top_module = try common.collect_deps_deep(dir, "zig.mod", .{ + var options = common.CollectOptions{ .log = should_update, .update = should_update, - }); + }; + const top_module = try common.collect_deps_deep(dir, "zig.mod", &options); const list = &std.ArrayList(u.Module).init(gpa); try common.collect_pkgs(top_module, list); diff --git a/src/cmd/license.zig b/src/cmd/license.zig index 7416649f07997e3562e426adc0ecd51f173f2e43..42744769c1b531fea02066d0d7d0bbb1f4a888de 100644 --- a/src/cmd/license.zig +++ b/src/cmd/license.zig @@ -19,10 +19,11 @@ pub fn execute(args: [][]u8) !void { const dir = try std.fs.path.join(gpa, &.{ ".zigmod", "deps" }); - const top_module = try common.collect_deps_deep(dir, "zig.mod", .{ + var options = common.CollectOptions{ .log = false, .update = false, - }); + }; + const top_module = try common.collect_deps_deep(dir, "zig.mod", &options); const master_list = &List.init(gpa); try common.collect_pkgs(top_module, master_list); diff --git a/src/cmd/sum.zig b/src/cmd/sum.zig index c4d8ea73f80b29d853038dcc6f41cba053d44b4d..1d9421589dbf0b233bc58f873a23f5f5aae73c53 100644 --- a/src/cmd/sum.zig +++ b/src/cmd/sum.zig @@ -14,10 +14,11 @@ pub fn execute(args: [][]u8) !void { const dir = try std.fs.path.join(gpa, &.{ ".zigmod", "deps" }); - const top_module = try common.collect_deps_deep(dir, "zig.mod", .{ + var options = common.CollectOptions{ .log = false, .update = false, - }); + }; + const top_module = try common.collect_deps_deep(dir, "zig.mod", &options); // const f = try std.fs.cwd().createFile("zigmod.sum", .{}); diff --git a/src/common.zig b/src/common.zig index fdd56cdee0ea1a678817474c46866e23800625ed..3a1d57688e1815ef57a865f8180eb294316574d9 100644 --- a/src/common.zig +++ b/src/common.zig @@ -3,6 +3,7 @@ const gpa = std.heap.c_allocator; const u = @import("./util/index.zig"); const yaml = @import("./util/yaml.zig"); +const string = []const u8; // // @@ -11,10 +12,18 @@ pub const CollectOptions = struct { log: bool, update: bool, lock: ?[]const [4][]const u8 = null, + alloc: *std.mem.Allocator = gpa, + already_fetched: *std.ArrayList(string) = undefined, + + pub fn init(self: *CollectOptions) !void { + self.already_fetched = try self.alloc.create(std.ArrayList(string)); + self.already_fetched.* = std.ArrayList(string).init(self.alloc); + } }; -pub fn collect_deps_deep(dir: []const u8, mpath: []const u8, options: CollectOptions) !u.Module { +pub fn collect_deps_deep(dir: []const u8, mpath: []const u8, options: *CollectOptions) !u.Module { const m = try u.ModFile.init(gpa, mpath); + try options.init(); const moduledeps = &std.ArrayList(u.Module).init(gpa); defer moduledeps.deinit(); try std.fs.cwd().makePath(".zigmod/deps/files"); @@ -39,7 +48,7 @@ pub fn collect_deps_deep(dir: []const u8, mpath: []const u8, options: CollectOpt }; } -pub fn collect_deps(dir: []const u8, mpath: []const u8, options: CollectOptions) anyerror!u.Module { +pub fn collect_deps(dir: []const u8, mpath: []const u8, options: *CollectOptions) anyerror!u.Module { const m = try u.ModFile.init(gpa, mpath); const moduledeps = &std.ArrayList(u.Module).init(gpa); defer moduledeps.deinit(); @@ -76,9 +85,13 @@ pub fn collect_pkgs(mod: u.Module, list: *std.ArrayList(u.Module)) anyerror!void } } -fn get_moddir(basedir: []const u8, d: u.Dep, parent_name: []const u8, options: CollectOptions) ![]const u8 { +fn get_moddir(basedir: []const u8, d: u.Dep, parent_name: []const u8, options: *CollectOptions) ![]const u8 { const p = try std.fs.path.join(gpa, &.{ basedir, try d.clean_path() }); const pv = try std.fs.path.join(gpa, &.{ basedir, try d.clean_path_v() }); + + if (u.list_contains(options.already_fetched.items, p)) return p; + if (u.list_contains(options.already_fetched.items, pv)) return pv; + const tempdir = try std.fs.path.join(gpa, &.{ basedir, "temp" }); if (options.log and d.type != .local) { u.print("fetch: {s}: {s}: {s}", .{ parent_name, @tagName(d.type), d.path }); @@ -174,7 +187,7 @@ fn get_moddir(basedir: []const u8, d: u.Dep, parent_name: []const u8, options: C } } -pub fn get_module_from_dep(d: *u.Dep, dir: []const u8, parent_name: []const u8, options: CollectOptions) anyerror!?u.Module { +pub fn get_module_from_dep(d: *u.Dep, dir: []const u8, parent_name: []const u8, options: *CollectOptions) anyerror!?u.Module { if (options.lock) |lock| { for (lock) |item| { if (std.mem.eql(u8, item[0], try d.clean_path())) { @@ -186,6 +199,7 @@ pub fn get_module_from_dep(d: *u.Dep, dir: []const u8, parent_name: []const u8, } } const moddir = try get_moddir(dir, d.*, parent_name, options); + try options.already_fetched.append(moddir); switch (d.type) { .system_lib => { return u.Module{ @@ -286,10 +300,11 @@ fn add_files_package(pkg_name: []const u8, dirs: []const []const u8, parent_name .yaml = null, .deps = &.{}, }; - return (try get_module_from_dep(&d, destination, parent_name, .{ + var options = CollectOptions{ .log = false, .update = false, - })).?; + }; + return (try get_module_from_dep(&d, destination, parent_name, &options)).?; } pub fn parse_lockfile(path: []const u8) ![]const [4][]const u8 { diff --git a/src/util/module.zig b/src/util/module.zig index a36d562335bb9dd5f6033fbddb67e189838ace37..1336868add47e12af9c37bf7eda02c02d99c699f 100644 --- a/src/util/module.zig +++ b/src/util/module.zig @@ -24,7 +24,7 @@ pub const Module = struct { clean_path: []const u8, dep: ?u.Dep, - pub fn from(dep: u.Dep, dir: []const u8, options: common.CollectOptions) !Module { + pub fn from(dep: u.Dep, dir: []const u8, options: *common.CollectOptions) !Module { const moddeps = &std.ArrayList(Module).init(gpa); defer moddeps.deinit(); for (dep.deps) |*d| { -- 2.54.0