]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Support reparenting file provider items correctly
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 6 Mar 2023 18:11:34 +0000 (19:11 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:20 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift

index 81f1ef3720cb56a938de1e03c4321fe4e2b533f1..d3d1d9cf314798836ea7a8dab13aefb386f18d03 100644 (file)
@@ -312,7 +312,8 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm
     }
     
     func modifyItem(_ item: NSFileProviderItem, baseVersion version: NSFileProviderItemVersion, changedFields: NSFileProviderItemFields, contents newContents: URL?, options: NSFileProviderModifyItemOptions = [], request: NSFileProviderRequest, completionHandler: @escaping (NSFileProviderItem?, NSFileProviderItemFields, Bool, Error?) -> Void) -> Progress {
-        // TODO: an item was modified on disk, process the item's modification
+        // An item was modified on disk, process the item's modification
+        // TODO: Handle finder things like tags, other possible item changed fields
 
         NSLog("Received modify item request for item with identifier: %@ and filename: %@", item.itemIdentifier.rawValue, item.filename)
 
@@ -359,8 +360,7 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm
 
         var modifiedItem = item
 
-        // TODO: Also handle reparenting here
-        if changedFields.contains(.filename) {
+        if changedFields.contains(.filename) || changedFields.contains(.parentItemIdentifier) {
             let ocId = item.itemIdentifier.rawValue
 
             guard let metadata = dbManager.itemMetadataFromOcId(ocId) else {
@@ -388,10 +388,12 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm
                     return
                 }
 
+                // Remember that a folder metadata's serverUrl is its direct server URL, while for
+                // an item metadata the server URL is the parent folder's URL
                 if itemTemplateIsFolder {
                     dbManager.renameDirectoryAndPropagateToChildren(ocId: ocId, newServerUrl: newServerUrlFileName, newFileName: item.filename)
                 } else {
-                    dbManager.renameItemMetadata(ocId: ocId, newFileName: item.filename)
+                    dbManager.renameItemMetadata(ocId: ocId, newServerUrl: parentItemMetadata.serverUrl, newFileName: item.filename)
                 }
 
                 guard let newMetadata = dbManager.itemMetadataFromOcId(ocId) else {
index 4a8d79afc675237cb701d580bf0e7f0c5f4be06d..54e842e9cbf1861dc909f7dca32101c2bba6e29f 100644 (file)
@@ -239,7 +239,7 @@ class NextcloudFilesDatabaseManager : NSObject {
         }
     }
 
-    func renameItemMetadata(ocId: String, newFileName: String) {
+    func renameItemMetadata(ocId: String, newServerUrl: String, newFileName: String) {
         let database = ncDatabase()
 
         do {
@@ -250,10 +250,15 @@ class NextcloudFilesDatabaseManager : NSObject {
                 }
 
                 let oldFileName = itemMetadata.fileName
+                let oldServerUrl = itemMetadata.serverUrl
+
                 itemMetadata.fileName = newFileName
                 itemMetadata.fileNameView = newFileName
+                itemMetadata.serverUrl = newServerUrl
+
                 database.add(itemMetadata, update: .all)
-                NSLog("Renamed item %@ to %@", oldFileName, newFileName)
+
+                NSLog("Renamed item %@ to %@, moved from serverUrl: %@ to serverUrl: %@", oldFileName, newFileName, oldServerUrl, newServerUrl)
             }
         } catch let error {
             NSLog("Could not rename filename of item metadata with ocID: %@ to proposed name %@, received error: %@", ocId, newFileName, error.localizedDescription)