diff --git a/src/common.zig b/src/common.zig index bef3681eca94013c0d3f262de5b0c13453f89f9e..c1765c0676d6c6749cbca8291588c382a92c31f0 100644 --- a/src/common.zig +++ b/src/common.zig @@ -153,6 +153,9 @@ pub fn get_modpath(cachepath: string, d: zigmod.Dep, options: *CollectOptions) ! defer pvd.close(); try pvd.deleteTree(".git"); } + var pvd = try std.fs.cwd().openIterableDir(pv, .{}); + defer pvd.close(); + try setTreeReadOnly(pvd, options.alloc); return pv; } if (!try u.does_folder_exist(p)) { @@ -187,6 +190,9 @@ pub fn get_modpath(cachepath: string, d: zigmod.Dep, options: *CollectOptions) ! try d.type.pull(options.alloc, d.path, pv); if (try u.validate_hash(options.alloc, d.version, file_path)) { try std.fs.cwd().deleteFile(file_path); + var pvd = try std.fs.cwd().openIterableDir(pv, .{}); + defer pvd.close(); + try setTreeReadOnly(pvd, options.alloc); return pv; } 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 } return list.toOwnedSlice(); } + +fn setTreeReadOnly(idir: std.fs.IterableDir, alloc: std.mem.Allocator) !void { + var walker = try idir.walk(alloc); + defer walker.deinit(); + + while (try walker.next()) |entry| { + if (entry.kind != .file) continue; + var file = try idir.dir.openFile(entry.path, .{}); + defer file.close(); + var metadata = try file.metadata(); + var perms = metadata.permissions(); + perms.setReadOnly(true); + try file.setPermissions(perms); + } +}