Skip to content

Commit

Permalink
Add hasQuarantineAttribute to FileSystem (#411)
Browse files Browse the repository at this point in the history
This new function returns `true` if a given path has a quarantine attribute applied if when file system supports this attribute, and returns `false` if such attribute is not applied or it isn't supported.
  • Loading branch information
MaxDesiatov authored Apr 20, 2023
1 parent ae57c40 commit 22c4a91
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Sources/TSCBasic/FileSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ public protocol FileSystem: Sendable {
/// Check whether the given path is accessible and writable.
func isWritable(_ path: AbsolutePath) -> Bool

/// Returns `true` if a given path has a quarantine attribute applied if when file system supports this attribute.
/// Returns `false` if such attribute is not applied or it isn't supported.
func hasQuarantineAttribute(_ path: AbsolutePath) -> Bool

// FIXME: Actual file system interfaces will allow more efficient access to
// more data than just the name here.
//
Expand Down Expand Up @@ -293,6 +297,8 @@ public extension FileSystem {
func withLock<T>(on path: AbsolutePath, type: FileLock.LockType, _ body: () throws -> T) throws -> T {
throw FileSystemError(.unsupported, path)
}

func hasQuarantineAttribute(_ path: AbsolutePath) -> Bool { false }
}

/// Concrete FileSystem implementation which communicates with the local file system.
Expand Down Expand Up @@ -341,6 +347,16 @@ private struct LocalFileSystem: FileSystem {
return FileInfo(attrs)
}

func hasQuarantineAttribute(_ path: AbsolutePath) -> Bool {
#if canImport(Darwin)
let bufLength = getxattr(path.pathString, "com.apple.quarantine", nil, 0, 0, 0)

return bufLength > 0
#else
return false
#endif
}

var currentWorkingDirectory: AbsolutePath? {
let cwdStr = FileManager.default.currentDirectoryPath

Expand Down
13 changes: 13 additions & 0 deletions Tests/TSCBasicTests/FileSystemTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,19 @@ class FileSystemTests: XCTestCase {
try _testFileSystemFileLock(fileSystem: fs, fileA: fileA, fileB: fileB, lockFile: lockFile)
}

#if canImport(Darwin)
func testQuarantineAttribute() throws {
try withTemporaryDirectory(removeTreeOnDeinit: true) { tempDir in
let filePath = tempDir.appending(component: "quarantined")
try localFileSystem.writeFileContents(filePath, bytes: "")
try Process.checkNonZeroExit(args: "xattr", "-w", "com.apple.quarantine", "foo", filePath.pathString)
XCTAssertTrue(localFileSystem.hasQuarantineAttribute(filePath))
try Process.checkNonZeroExit(args: "xattr", "-d", "com.apple.quarantine", filePath.pathString)
XCTAssertFalse(localFileSystem.hasQuarantineAttribute(filePath))
}
}
#endif

private func _testFileSystemFileLock(fileSystem fs: FileSystem, fileA: AbsolutePath, fileB: AbsolutePath, lockFile: AbsolutePath) throws {
// write initial value, since reader may start before writers and files would not exist
try fs.writeFileContents(fileA, bytes: "0")
Expand Down

0 comments on commit 22c4a91

Please sign in to comment.