Vfs: Enable propagating attributes on download

This commit is contained in:
Christian Kamm 2019-01-25 11:11:28 +01:00 committed by Kevin Ottens
parent 01f7bc7b49
commit 597cc60f52
No known key found for this signature in database
GPG key ID: 074BBBCB8DECC9E2
4 changed files with 15 additions and 7 deletions

View file

@ -146,8 +146,15 @@ public:
*
* Implementations must make sure that calling this function on a file that already
* is a placeholder is acceptable.
*
* replacesFile can optionally contain a filesystem path to a placeholder that this
* new placeholder shall supersede, for rename-replace actions with new downloads,
* for example.
*/
virtual void convertToPlaceholder(const QString &filename, const SyncFileItem &item) = 0;
virtual void convertToPlaceholder(
const QString &filename,
const SyncFileItem &item,
const QString &replacesFile = QString()) = 0;
/// Determine whether the file at the given absolute path is a dehydrated placeholder.
virtual bool isDehydratedPlaceholder(const QString &filePath) = 0;
@ -234,7 +241,7 @@ public:
bool updateMetadata(const QString &, time_t, quint64, const QByteArray &, QString *) override { return true; }
void createPlaceholder(const QString &, const SyncFileItem &) override {}
void convertToPlaceholder(const QString &, const SyncFileItem &) override {}
void convertToPlaceholder(const QString &, const SyncFileItem &, const QString &) override {}
bool isDehydratedPlaceholder(const QString &) override { return false; }
bool statTypeVirtualFile(csync_file_stat_t *, void *) override { return false; }

View file

@ -421,6 +421,7 @@ void PropagateDownloadFile::startAfterIsEncryptedIsChecked()
if (_item->_type == ItemTypeVirtualFileDehydration) {
_item->_type = ItemTypeVirtualFile;
// TODO: Could dehydrate without wiping the file entirely
// TODO: That would be useful as it could preserve file attributes (pins)
auto fn = propagator()->getFilePath(_item->_file);
qCDebug(lcPropagateDownload) << "dehydration: wiping base file" << fn;
propagator()->_journal->deleteFileRecord(_item->_file);
@ -987,6 +988,9 @@ void PropagateDownloadFile::downloadFinished()
// Apply the remote permissions
FileSystem::setFileReadOnlyWeak(_tmpFile.fileName(), !_item->_remotePerm.isNull() && !_item->_remotePerm.hasPermission(RemotePermissions::CanWrite));
// Make the file a hydrated placeholder if possible
propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn);
QString error;
emit propagator()->touchedFile(fn);
// The fileChanged() check is done above to generate better error messages.
@ -1004,9 +1008,6 @@ void PropagateDownloadFile::downloadFinished()
return;
}
// Make the file a hydrated placeholder if possible
propagator()->syncOptions()._vfs->convertToPlaceholder(fn, *_item);
FileSystem::setFileHidden(fn, false);
// Maybe we downloaded a newer version of the file than we thought we would...

View file

@ -70,7 +70,7 @@ void VfsSuffix::createPlaceholder(const QString &syncFolder, const SyncFileItem
FileSystem::setModTime(fn, item._modtime);
}
void VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &)
void VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
{
// Nothing necessary
}

View file

@ -40,7 +40,7 @@ public:
bool updateMetadata(const QString &filePath, time_t modtime, quint64 size, const QByteArray &fileId, QString *error) override;
void createPlaceholder(const QString &syncFolder, const SyncFileItem &item) override;
void convertToPlaceholder(const QString &filename, const SyncFileItem &item) override;
void convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &) override;
bool isDehydratedPlaceholder(const QString &filePath) override;
bool statTypeVirtualFile(csync_file_stat_t *stat, void *stat_data) override;