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.
This commit is contained in:
Christian Kamm 2019-07-23 14:26:46 +02:00 committed by Kevin Ottens
parent b34df4413b
commit 0df3b83bd2
No known key found for this signature in database
GPG key ID: 074BBBCB8DECC9E2
4 changed files with 19 additions and 3 deletions

View 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; }

View 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

View 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;

View 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;