diff --git a/lib/std/fs/Dir.zig b/lib/std/fs/Dir.zig index 99d62b9d9d..f5df4a969f 100644 --- a/lib/std/fs/Dir.zig +++ b/lib/std/fs/Dir.zig @@ -732,16 +732,14 @@ pub const SelectiveWalker = struct { }); } - pub fn depth(self: *SelectiveWalker) usize { - return self.stack.items.len; - } - pub fn deinit(self: *SelectiveWalker) void { self.name_buffer.deinit(self.allocator); self.stack.deinit(self.allocator); } /// Leaves the current directory, continuing walking one level up. + /// If the current entry is a directory entry, then the "current directory" + /// will pertain to that entry if `enter` is called before `leave`. pub fn leave(self: *SelectiveWalker) void { var item = self.stack.pop().?; if (self.stack.items.len != 0) { @@ -789,6 +787,13 @@ pub const Walker = struct { basename: [:0]const u8, path: [:0]const u8, kind: Dir.Entry.Kind, + + /// Returns the depth of the entry relative to the initial directory. + /// Returns 1 for a direct child of the initial directory, 2 for an entry + /// within a direct child of the initial directory, etc. + pub fn depth(self: Walker.Entry) usize { + return mem.countScalar(u8, self.path, fs.path.sep) + 1; + } }; const StackItem = struct { diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index 77b16c1164..b88456ef7c 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -1765,14 +1765,14 @@ test "walker" { // iteration order of walker is undefined, so need lookup maps to check against - const expected_paths = std.StaticStringMap(void).initComptime(.{ - .{"dir1"}, - .{"dir2"}, - .{"dir3"}, - .{"dir4"}, - .{"dir3" ++ fs.path.sep_str ++ "sub1"}, - .{"dir3" ++ fs.path.sep_str ++ "sub2"}, - .{"dir3" ++ fs.path.sep_str ++ "sub2" ++ fs.path.sep_str ++ "subsub1"}, + const expected_paths = std.StaticStringMap(usize).initComptime(.{ + .{ "dir1", 1 }, + .{ "dir2", 1 }, + .{ "dir3", 1 }, + .{ "dir4", 1 }, + .{ "dir3" ++ fs.path.sep_str ++ "sub1", 2 }, + .{ "dir3" ++ fs.path.sep_str ++ "sub2", 2 }, + .{ "dir3" ++ fs.path.sep_str ++ "sub2" ++ fs.path.sep_str ++ "subsub1", 3 }, }); const expected_basenames = std.StaticStringMap(void).initComptime(.{ @@ -1802,6 +1802,10 @@ test "walker" { std.debug.print("found unexpected path: {f}\n", .{std.ascii.hexEscape(entry.path, .lower)}); return err; }; + testing.expectEqual(expected_paths.get(entry.path).?, entry.depth()) catch |err| { + std.debug.print("path reported unexpected depth: {f}\n", .{std.ascii.hexEscape(entry.path, .lower)}); + return err; + }; // make sure that the entry.dir is the containing dir var entry_dir = try entry.dir.openDir(entry.basename, .{}); defer entry_dir.close(); @@ -1851,6 +1855,10 @@ test "selective walker, skip entries that start with ." { var num_walked: usize = 0; while (try walker.next()) |entry| { if (entry.basename[0] == '.') continue; + if (entry.kind == .directory) { + try walker.enter(entry); + } + testing.expect(expected_basenames.has(entry.basename)) catch |err| { std.debug.print("found unexpected basename: {f}\n", .{std.ascii.hexEscape(entry.basename, .lower)}); return err; @@ -1859,16 +1867,11 @@ test "selective walker, skip entries that start with ." { std.debug.print("found unexpected path: {f}\n", .{std.ascii.hexEscape(entry.path, .lower)}); return err; }; - - testing.expectEqual(expected_paths.get(entry.path).?, walker.depth()) catch |err| { - std.debug.print("path reported unexpected depth: {f}, {d}, expected {d}\n", .{ std.ascii.hexEscape(entry.path, .lower), walker.depth(), expected_paths.get(entry.path).? }); + testing.expectEqual(expected_paths.get(entry.path).?, entry.depth()) catch |err| { + std.debug.print("path reported unexpected depth: {f}\n", .{std.ascii.hexEscape(entry.path, .lower)}); return err; }; - if (entry.kind == .directory) { - try walker.enter(entry); - } - // make sure that the entry.dir is the containing dir var entry_dir = try entry.dir.openDir(entry.basename, .{}); defer entry_dir.close(); diff --git a/tools/update_mingw.zig b/tools/update_mingw.zig index 8e5b403be6..6288807cf1 100644 --- a/tools/update_mingw.zig +++ b/tools/update_mingw.zig @@ -117,7 +117,7 @@ pub fn main() !void { while (try walker.next()) |entry| { switch (entry.kind) { .directory => { - switch (walker.depth()) { + switch (entry.depth()) { 1 => if (def_dirs.has(entry.basename)) { try walker.enter(entry); continue;