authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-11-23 23:11:51 -08:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-11-23 23:11:51 -08:00
logb8cd095ebd012788b83ac2d8e1592ce531fecde9
tree2961aecc761bdc9d40e7ea832370c3bf33334f8c
parent255cb974db260e67d6782f785f26604292c39131

mark versioned dep folders as readonly, closes #53


1 files changed, 21 insertions(+), 0 deletions(-)

src/common.zig+21
......@@ -153,6 +153,9 @@ pub fn get_modpath(cachepath: string, d: zigmod.Dep, options: *CollectOptions) !
153153 defer pvd.close();
154154 try pvd.deleteTree(".git");
155155 }
156 var pvd = try std.fs.cwd().openIterableDir(pv, .{});
157 defer pvd.close();
158 try setTreeReadOnly(pvd, options.alloc);
156159 return pv;
157160 }
158161 if (!try u.does_folder_exist(p)) {
......@@ -187,6 +190,9 @@ pub fn get_modpath(cachepath: string, d: zigmod.Dep, options: *CollectOptions) !
187190 try d.type.pull(options.alloc, d.path, pv);
188191 if (try u.validate_hash(options.alloc, d.version, file_path)) {
189192 try std.fs.cwd().deleteFile(file_path);
193 var pvd = try std.fs.cwd().openIterableDir(pv, .{});
194 defer pvd.close();
195 try setTreeReadOnly(pvd, options.alloc);
190196 return pv;
191197 }
192198 try std.fs.cwd().deleteTree(pv);
......@@ -370,3 +376,18 @@ pub fn parse_lockfile(alloc: std.mem.Allocator, dir: std.fs.Dir) ![]const [4]str
370376 }
371377 return list.toOwnedSlice();
372378}
379
380fn setTreeReadOnly(idir: std.fs.IterableDir, alloc: std.mem.Allocator) !void {
381 var walker = try idir.walk(alloc);
382 defer walker.deinit();
383
384 while (try walker.next()) |entry| {
385 if (entry.kind != .file) continue;
386 var file = try idir.dir.openFile(entry.path, .{});
387 defer file.close();
388 var metadata = try file.metadata();
389 var perms = metadata.permissions();
390 perms.setReadOnly(true);
391 try file.setPermissions(perms);
392 }
393}