Skip to content

Commit aef90f0

Browse files
nilsdingi2h3
authored andcommitted
refactor(metadata): provide a single method for assembling the full remote path
There are many places that assemble the full remote path manually, but it might not always be correct. For instance in the case of the root directory, an item's `fileName` is set to `"__NC_ROOT__"` by NextcloudKit. Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
1 parent e7b0f52 commit aef90f0

6 files changed

Lines changed: 22 additions & 26 deletions

File tree

Sources/NextcloudFileProviderKit/Database/FilesDatabaseManager.swift

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -599,11 +599,7 @@ public final class FilesDatabaseManager: Sendable {
599599
var handledUpdateOcIds = Set(updated.map(\.ocId))
600600

601601
updated
602-
.map {
603-
var serverUrl = $0.serverUrl + "/" + $0.fileName
604-
if serverUrl.last == "/" { serverUrl.removeLast() }
605-
return serverUrl
606-
}
602+
.map { $0.remotePath() }
607603
.forEach { serverUrl in
608604
logger.debug("Checking updated item...", [.url: serverUrl])
609605

@@ -630,15 +626,7 @@ public final class FilesDatabaseManager: Sendable {
630626
let handledDeleteOcIds = Set(deleted.map(\.ocId))
631627

632628
deleted
633-
.map { // assemble remote location
634-
var serverUrl = $0.serverUrl + "/" + $0.fileName
635-
636-
if serverUrl.last == "/" {
637-
serverUrl.removeLast()
638-
}
639-
640-
return serverUrl
641-
}
629+
.map { $0.remotePath() }
642630
.forEach { serverUrl in
643631
logger.debug("Verifying deleted item...", [.url: serverUrl])
644632

Sources/NextcloudFileProviderKit/Enumeration/RemoteChangeObserver.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -456,10 +456,7 @@ public final class RemoteChangeObserver: NSObject, NextcloudKitDelegate, URLSess
456456
// This way we ensure we visit parent folders before their children.
457457
let materialisedItems = dbManager
458458
.materialisedItemMetadatas(account: accountId)
459-
.sorted {
460-
($0.serverUrl + "/" + $0.fileName).count <
461-
($1.serverUrl + "/" + $1.fileName).count
462-
}
459+
.sorted { $0.remotePath().count < $1.remotePath().count }
463460

464461
var allNewMetadatas = [SendableItemMetadata]()
465462
var allUpdatedMetadatas = [SendableItemMetadata]()
@@ -480,7 +477,7 @@ public final class RemoteChangeObserver: NSObject, NextcloudKitDelegate, URLSess
480477
continue
481478
}
482479

483-
let itemRemoteUrl = item.serverUrl + "/" + item.fileName
480+
let itemRemoteUrl = item.remotePath()
484481

485482
let (metadatas, newMetadatas, updatedMetadatas, deletedMetadatas, _, readError) = await Enumerator.readServerUrl(
486483
itemRemoteUrl,
@@ -550,7 +547,7 @@ public final class RemoteChangeObserver: NSObject, NextcloudKitDelegate, URLSess
550547

551548
// Also mark any materialized children of this directory as examined
552549
let grandChildren = materialisedItems.filter {
553-
$0.serverUrl.hasPrefix(localItem.serverUrl + "/" + localItem.fileName)
550+
$0.serverUrl.hasPrefix(localItem.remotePath())
554551
}
555552
examinedChildFilesAndDeletedItems.formUnion(grandChildren.map(\.ocId))
556553
}

Sources/NextcloudFileProviderKit/Item/Item+Create.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ public extension Item {
490490
)
491491
return (nil, NSFileProviderError(.cannotSynchronize))
492492
}
493-
parentItemRemotePath = parentItemMetadata.serverUrl + "/" + parentItemMetadata.fileName
493+
parentItemRemotePath = parentItemMetadata.remotePath()
494494
parentItemRelativePath = parentItemRemotePath.replacingOccurrences(
495495
of: account.davFilesUrl, with: ""
496496
)

Sources/NextcloudFileProviderKit/Item/Item+Delete.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public extension Item {
2424
}
2525

2626
let ocId = itemIdentifier.rawValue
27-
let relativePath = (metadata.serverUrl + "/" + metadata.fileName).replacingOccurrences(of: metadata.urlBase, with: "")
27+
let relativePath = (metadata.remotePath()).replacingOccurrences(of: metadata.urlBase, with: "")
2828

2929
guard metadata.isLockFileOfLocalOrigin == false else {
3030
return await deleteLockFile(domain: domain, dbManager: dbManager)
@@ -36,7 +36,7 @@ public extension Item {
3636
return nil
3737
}
3838

39-
let serverFileNameUrl = metadata.serverUrl + "/" + metadata.fileName
39+
let serverFileNameUrl = metadata.remotePath()
4040

4141
guard serverFileNameUrl != "" else {
4242
return NSError.fileProviderErrorForNonExistentItem(withIdentifier: itemIdentifier)

Sources/NextcloudFileProviderKit/Item/Item+Fetch.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public extension Item {
5050
progress.totalUnitCount += Int64(metadatas.count)
5151

5252
for var metadata in metadatas {
53-
let remotePath = metadata.serverUrl + "/" + metadata.fileName
53+
let remotePath = metadata.remotePath()
5454
let relativePath =
5555
remotePath.replacingOccurrences(of: directoryRemotePath, with: "")
5656
let childLocalPath = directoryLocalPath + relativePath
@@ -129,7 +129,7 @@ public extension Item {
129129
}
130130
}
131131

132-
let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
132+
let serverUrlFileName = metadata.remotePath()
133133

134134
logger.debug("Fetching item.", [.name: metadata.fileName, .url: serverUrlFileName])
135135

Sources/NextcloudFileProviderKit/Metadata/ItemMetadata.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
22
// SPDX-License-Identifier: GPL-2.0-or-later
33

4+
import FileProvider
45
import Foundation
56

67
///
@@ -73,7 +74,7 @@ public protocol ItemMetadata: Equatable {
7374
var quotaAvailableBytes: Int64 { get set }
7475
var resourceType: String { get set }
7576
var richWorkspace: String? { get set }
76-
var serverUrl: String { get set } // For parent folder! Build remote url by adding fileName
77+
var serverUrl: String { get set } // For parent folder! Retrieve the full remote url via .remotePath()
7778
var session: String? { get set }
7879
var sessionError: String? { get set }
7980
var sessionTaskIdentifier: Int? { get set }
@@ -170,4 +171,14 @@ public extension ItemMetadata {
170171
.init(name: "a", value: "true"),
171172
])
172173
}
174+
175+
func remotePath() -> String {
176+
if ocId == NSFileProviderItemIdentifier.rootContainer.rawValue {
177+
// For the root container the fileName is "__NC_ROOT__" (aka NextcloudKit.shared.nkCommonInstance.rootFileName)
178+
// --> appending the fileName to that is not correct, as it most likely won't ecist
179+
return serverUrl
180+
}
181+
182+
return "\(serverUrl)/\(fileName)"
183+
}
173184
}

0 commit comments

Comments
 (0)