Vfs: Add hook to allow update-metadata for unchanged files
authorChristian Kamm <mail@ckamm.de>
Tue, 23 Jul 2019 12:26:46 +0000 (14:26 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:53 +0000 (10:58 +0100)
Allows winvfs to convert files to placeholders when vfs is enabled. This
is required to mark files as in-sync #7329.

src/common/vfs.h
src/libsync/discovery.cpp
src/libsync/syncengine.cpp
src/libsync/vfs/suffix/vfs_suffix.h

index e587efd36cd696874ae3cce2662a50e18051362d..b1845aee7e01e748c5221155b0de887f51e40513 100644 (file)
@@ -166,6 +166,13 @@ public:
      */
     virtual void dehydratePlaceholder(const SyncFileItem &item) = 0;
 
+    /** Discovery hook: even unchanged files may need UPDATE_METADATA.
+     *
+     * For instance cfapi vfs wants local hydrated non-placeholder files to
+     * become hydrated placeholder files.
+     */
+    virtual bool needsMetadataUpdate(const SyncFileItem &item) = 0;
+
     /** Convert a new file to a hydrated placeholder.
      *
      * Some VFS integrations expect that every file, including those that have all
@@ -287,6 +294,7 @@ public:
     void dehydratePlaceholder(const SyncFileItem &) override {}
     void convertToPlaceholder(const QString &, const SyncFileItem &, const QString &) override {}
 
+    bool needsMetadataUpdate(const SyncFileItem &item) override { return false; }
     bool isDehydratedPlaceholder(const QString &) override { return false; }
     bool statTypeVirtualFile(csync_file_stat_t *, void *) override { return false; }
 
index e891c666fb22475583e7bf2161cbd59f16a59ac9..e0f8cadf608ca20a10af00d7efe0b764810135f8 100644 (file)
@@ -736,9 +736,11 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
                 item->_direction = SyncFileItem::Down;
                 item->_instruction = CSYNC_INSTRUCTION_SYNC;
                 item->_type = ItemTypeVirtualFileDehydration;
-            } else if (!serverModified && dbEntry._inode != localEntry.inode) {
+            } else if (!serverModified
+                && (dbEntry._inode != localEntry.inode
+                    || _discoveryData->_syncOptions._vfs->needsMetadataUpdate(*item))) {
                 item->_instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
-                item->_direction = SyncFileItem::Down; // Does not matter
+                item->_direction = SyncFileItem::Down;
             }
         } else if (!typeChange && isVfsWithSuffix()
             && dbEntry.isVirtualFile() && !localEntry.isVirtualFile
index a552cf22310cda01e73dafc04adf17221fb88fc1..b5eef406f6180ebc89b83f292025e1caaab372a3 100644 (file)
@@ -348,8 +348,13 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
                 rec._checksumHeader = prev._checksumHeader;
             rec._serverHasIgnoredFiles |= prev._serverHasIgnoredFiles;
 
+            // Ensure it's a placeholder file on disk
+            if (item->_type == ItemTypeFile) {
+                _syncOptions._vfs->convertToPlaceholder(filePath, *item);
+            }
+
             // Update on-disk virtual file metadata
-            if (item->_type == ItemTypeVirtualFile && _syncOptions._vfs) {
+            if (item->_type == ItemTypeVirtualFile) {
                 QString error;
                 if (!_syncOptions._vfs->updateMetadata(filePath, item->_modtime, item->_size, item->_fileId, &error)) {
                     item->_instruction = CSYNC_INSTRUCTION_ERROR;
index 89b13d5269a118e10caa99bd20afa7ccf5dd6a40..bcf5178416fad8d5016e8c7369cfba8fb31346da 100644 (file)
@@ -44,6 +44,7 @@ public:
     void dehydratePlaceholder(const SyncFileItem &item) override;
     void convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &) override;
 
+    bool needsMetadataUpdate(const SyncFileItem &item) override { return false; }
     bool isDehydratedPlaceholder(const QString &filePath) override;
     bool statTypeVirtualFile(csync_file_stat_t *stat, void *stat_data) override;