Skip to content

Commit

Permalink
Remove using FileWrapper for FileNode
Browse files Browse the repository at this point in the history
  • Loading branch information
1024jp committed Aug 25, 2024
1 parent 00224ff commit e816593
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 39 deletions.
17 changes: 8 additions & 9 deletions CotEditor/Sources/DirectoryDocument.swift
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,7 @@ final class DirectoryDocument: NSDocument {

override nonisolated func read(from url: URL, ofType typeName: String) throws {

let fileWrapper = try FileWrapper(url: url)
let node = FileNode(fileWrapper: fileWrapper, fileURL: url)
let node = try FileNode(at: url)

DispatchQueue.syncOnMain {
self.fileNode = node
Expand Down Expand Up @@ -201,18 +200,18 @@ final class DirectoryDocument: NSDocument {
try await Task.sleep(for: .seconds(0.2), tolerance: .seconds(0.1))

self.performAsynchronousFileAccess { [unowned self] fileAccessCompletionHandler in
guard
let fileURL,
let fileWrapper = try? FileWrapper(url: fileURL)
else { return fileAccessCompletionHandler() }
guard let fileURL else { return fileAccessCompletionHandler() }

fileAccessCompletionHandler()

guard FileNode(fileWrapper: fileWrapper, fileURL: fileURL) != self.fileNode else { return }
guard
let fileNode = try? FileNode(at: fileURL),
fileNode != self.fileNode
else { return }

// remake node tree if needed
Task { @MainActor in
self.revert()
Task { @MainActor [weak self] in
self?.revert()
}
}
}
Expand Down
45 changes: 15 additions & 30 deletions CotEditor/Sources/FileNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

import Foundation
import UniformTypeIdentifiers
import FilePermissions

struct FileNode: Equatable {

Expand All @@ -42,36 +41,35 @@ struct FileNode: Equatable {


var name: String
var isDirectory: Bool
var paths: [String]
var children: [FileNode]?
var isDirectory: Bool
var kind: Kind
var permissions: FilePermissions
var isWritable: Bool
var fileURL: URL

var isHidden: Bool { self.name.starts(with: ".") }
var isWritable: Bool { self.permissions.user.contains(.write) }

var directoryURL: URL { self.isDirectory ? self.fileURL : self.fileURL.deletingLastPathComponent() }


init?(fileWrapper: FileWrapper, paths: [String] = [], fileURL: URL) {
init(at fileURL: URL, paths: [String] = []) throws {

guard let filename = fileWrapper.filename else { return nil }
let resourceValues = try fileURL.resourceValues(forKeys: [.isDirectoryKey, .isWritableKey])

self.name = filename
self.name = fileURL.lastPathComponent
self.paths = paths
self.isDirectory = fileWrapper.isDirectory
self.isDirectory = resourceValues.isDirectory ?? false
self.kind = Kind(filename: self.name, isDirectory: self.isDirectory)
self.isWritable = resourceValues.isWritable ?? true
self.fileURL = fileURL
self.permissions = FilePermissions(mask: fileWrapper.fileAttributes[FileAttributeKey.posixPermissions] as? Int16 ?? 0)
self.kind = Kind(filename: filename, isDirectory: fileWrapper.isDirectory)

if fileWrapper.isDirectory, self.kind != .gitDirectory {
self.children = fileWrapper.fileWrappers?
.compactMap { FileNode(fileWrapper: $0.value, paths: paths + [filename], fileURL: fileURL.appending(component: $0.key)) }
.sorted(using: SortDescriptor(\.name, comparator: .localizedStandard))
.sorted(using: SortDescriptor(\.isDirectory))
}
guard self.isDirectory, self.kind != .gitDirectory else { return }

self.children = try FileManager.default
.contentsOfDirectory(at: fileURL, includingPropertiesForKeys: [.isDirectoryKey, .isWritableKey])
.map { try FileNode(at: $0, paths: paths + [self.name]) }
.sorted(using: SortDescriptor(\.name, comparator: .localizedStandard))
.sorted(using: SortDescriptor(\.isDirectory))
}
}

Expand Down Expand Up @@ -123,19 +121,6 @@ extension FileNode {
}


extension [FileNode] {

func recursivelyFilter(_ isIncluded: (FileNode) -> Bool) -> [FileNode] {

self.filter(isIncluded).map {
var tree = $0
tree.children = tree.children?.recursivelyFilter(isIncluded)
return tree
}
}
}


// MARK: FileNode.Kind

extension FileNode.Kind {
Expand Down

0 comments on commit e816593

Please sign in to comment.