From 0df3b83bd24e49fa104fc4e30b5165f9a325dc8f Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Tue, 23 Jul 2019 14:26:46 +0200 Subject: [PATCH] Vfs: Add hook to allow update-metadata for unchanged files 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 | 8 ++++++++ src/libsync/discovery.cpp | 6 ++++-- src/libsync/syncengine.cpp | 7 ++++++- src/libsync/vfs/suffix/vfs_suffix.h | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/common/vfs.h b/src/common/vfs.h index e587efd36..b1845aee7 100644 --- a/src/common/vfs.h +++ b/src/common/vfs.h @@ -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; } diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index e891c666f..e0f8cadf6 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -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 diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index a552cf223..b5eef406f 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -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; diff --git a/src/libsync/vfs/suffix/vfs_suffix.h b/src/libsync/vfs/suffix/vfs_suffix.h index 89b13d526..bcf517841 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.h +++ b/src/libsync/vfs/suffix/vfs_suffix.h @@ -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; -- 2.30.2