Skip to content

Commit

Permalink
Merge pull request #77 from ConfusedVorlon/find_hidden_modifier
Browse files Browse the repository at this point in the history
Find hidden modifier
  • Loading branch information
mxcl authored Jul 30, 2021
2 parents 13d62c3 + dad3d84 commit 9c6f807
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 4 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,15 +227,15 @@ We provide `find()` for recursive listing:

```swift
for path in Path.home.find() {
// descends all directories, and includes hidden files
// descends all directories, and includes hidden files by default
// so it behaves the same as the terminal command `find`
}
```

It is configurable:

```swift
for path in Path.home.find().depth(max: 1).extension("swift").type(.file) {
for path in Path.home.find().depth(max: 1).extension("swift").type(.file).hidden(false) {
//
}
```
Expand Down
18 changes: 17 additions & 1 deletion Sources/Path+ls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public extension Path {

/// The file extensions find operations will return. Files *and* directories unless you filter for `kinds`.
private(set) public var extensions: Set<String>?

/// Whether to return hidden files
public var hidden:Bool = true
}
}

Expand All @@ -50,8 +53,12 @@ extension Path.Finder: Sequence, IteratorProtocol {
if enumerator.level < depth.lowerBound {
continue
}

if !hidden, path.basename().hasPrefix(".") {
enumerator.skipDescendants()
continue
}
#endif

if let type = path.type, !types.contains(type) { continue }
if let exts = extensions, !exts.contains(path.extension) { continue }
return path
Expand Down Expand Up @@ -114,6 +121,15 @@ public extension Path.Finder {
extensions!.insert(ext)
return self
}

/// Whether to skip hidden files and folders.
func hidden(_ hidden: Bool) -> Path.Finder {
#if os(Linux) && !swift(>=5.0)
fputs("warning: hidden not implemented for Swift < 5\n", stderr)
#endif
self.hidden = hidden
return self
}

/// The return type for `Path.Finder`
enum ControlFlow {
Expand Down
22 changes: 22 additions & 0 deletions Tests/PathTests/PathTests+ls().swift
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,28 @@ extension PathTests {
}
}

func testFindHidden() throws {
try Path.mktemp { tmpdir in
let dotFoo = try tmpdir.join(".foo.txt").touch()
let tmpDotA = try tmpdir.join(".a").mkdir()
let tmpDotAFoo = try tmpdir.join(".a").join("foo.txt").touch()
let tmpB = try tmpdir.b.mkdir()
let tmpBFoo = try tmpdir.b.join("foo.txt").touch()

XCTAssertEqual(
Set(tmpdir.find().hidden(true)),
Set([dotFoo,tmpDotA,tmpDotAFoo,tmpB,tmpBFoo]),
relativeTo: tmpdir)

#if !os(Linux) || swift(>=5)
XCTAssertEqual(
Set(tmpdir.find().hidden(false)),
Set([tmpB,tmpBFoo]),
relativeTo: tmpdir)
#endif
}
}

func testFindExtension() throws {
try Path.mktemp { tmpdir in
try tmpdir.join("foo.json").touch()
Expand Down
1 change: 1 addition & 0 deletions Tests/PathTests/XCTestManifests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ extension PathTests {
("testFindDepthRange", testFindDepthRange),
("testFindExecute", testFindExecute),
("testFindExtension", testFindExtension),
("testFindHidden", testFindHidden),
("testFindMaxDepth1", testFindMaxDepth1),
("testFindMaxDepth2", testFindMaxDepth2),
("testFindMinDepth", testFindMinDepth),
Expand Down
2 changes: 1 addition & 1 deletion Tests/PathTests/etc.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ private func logic<P: Pathish>(_ set1: Set<Path>, _ set2: Set<Path>, relativeTo:
if set1 != set2 {
let cvt: (Path) -> String = { $0.relative(to: relativeTo) }
let out1 = set1.map(cvt).sorted()
let out2 = set1.map(cvt).sorted()
let out2 = set2.map(cvt).sorted()
fail("Set(\(out1)) is not equal to Set(\(out2))")
}
}
Expand Down

0 comments on commit 9c6f807

Please sign in to comment.