Merge pull request #5853 from m7913d/ignoredFilesExcludedPinState

Set VFS PinState to Excluded for ignored files.
This commit is contained in:
Matthieu Gallien 2023-07-20 15:01:53 +02:00 committed by GitHub
commit 759c2a246c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 71 additions and 18 deletions

View file

@ -75,6 +75,13 @@ enum class PinState {
* dehydrated (which is an arbitrary decision).
*/
Unspecified = 3,
/** The file will never be synced to the cloud.
*
* Usefull for ignored files to indicate to the OS the file will never be
* synced
*/
Excluded = 4,
};
Q_ENUM_NS(PinState)

View file

@ -561,6 +561,23 @@ void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason)
auto relativePath = path.midRef(this->path().size());
if (pathIsIgnored(path)) {
const auto pinState = _vfs->pinState(relativePath.toString());
if (!pinState || *pinState != PinState::Excluded) {
if (!_vfs->setPinState(relativePath.toString(), PinState::Excluded)) {
qCWarning(lcFolder) << "Could not set pin state of" << relativePath << "to excluded";
}
}
return;
} else {
const auto pinState = _vfs->pinState(relativePath.toString());
if (pinState && *pinState == PinState::Excluded) {
if (!_vfs->setPinState(relativePath.toString(), PinState::Inherited)) {
qCWarning(lcFolder) << "Could not switch pin state of" << relativePath << "from" << *pinState << "to inherited";
}
}
}
// Add to list of locally modified paths
//
// We do this before checking for our own sync-related changes to make
@ -806,6 +823,21 @@ void Folder::removeFromSettings() const
settings->remove(FolderMan::escapeAlias(_definition.alias));
}
bool Folder::pathIsIgnored(const QString &path) const
{
if (path.isEmpty()) {
return true;
}
#ifndef OWNCLOUD_TEST
if (isFileExcludedAbsolute(path) && !Utility::isConflictFile(path)) {
qCDebug(lcFolder) << "* Ignoring file" << path;
return true;
}
#endif
return false;
}
bool Folder::isFileExcludedAbsolute(const QString &fullPath) const
{
return _engine->excludedFiles().isExcluded(fullPath, path(), _definition.ignoreHiddenFiles);

View file

@ -233,6 +233,9 @@ public:
/// Removes the folder from the account's settings.
void removeFromSettings() const;
/* Check if the path is ignored. */
[[nodiscard]] bool pathIsIgnored(const QString &path) const;
/**
* Returns whether a file inside this folder should be excluded.
*/

View file

@ -66,20 +66,9 @@ void FolderWatcher::init(const QString &root)
_timer.start();
}
bool FolderWatcher::pathIsIgnored(const QString &path)
bool FolderWatcher::pathIsIgnored(const QString &path) const
{
if (path.isEmpty())
return true;
if (!_folder)
return false;
#ifndef OWNCLOUD_TEST
if (_folder->isFileExcludedAbsolute(path) && !Utility::isConflictFile(path)) {
qCDebug(lcFolderWatcher) << "* Ignoring file" << path;
return true;
}
#endif
return false;
return path.isEmpty();
}
bool FolderWatcher::isReliable() const

View file

@ -60,9 +60,6 @@ public:
*/
void init(const QString &root);
/* Check if the path is ignored. */
bool pathIsIgnored(const QString &path);
/**
* Returns false if the folder watcher can't be trusted to capture all
* notifications.
@ -135,6 +132,9 @@ private:
QString possiblyAddUnlockedFilePath(const QString &path);
QString findMatchingUnlockedFileInDir(const QString &dirPath, const QString &lockFileName);
/* Check if the path should be igored by the FolderWatcher. */
[[nodiscard]] bool pathIsIgnored(const QString &path) const;
/** Path of the expected test notification */
QString _testNotificationPath;

View file

@ -292,6 +292,8 @@ OCC::PinState cfPinStateToPinState(CF_PIN_STATE state)
return OCC::PinState::OnlineOnly;
case CF_PIN_STATE_INHERIT:
return OCC::PinState::Inherited;
case CF_PIN_STATE_EXCLUDED:
return OCC::PinState::Excluded;
default:
Q_UNREACHABLE();
return OCC::PinState::Inherited;
@ -309,6 +311,8 @@ CF_PIN_STATE pinStateToCfPinState(OCC::PinState state)
return CF_PIN_STATE_UNPINNED;
case OCC::PinState::Unspecified:
return CF_PIN_STATE_UNSPECIFIED;
case OCC::PinState::Excluded:
return CF_PIN_STATE_EXCLUDED;
default:
Q_UNREACHABLE();
return CF_PIN_STATE_UNSPECIFIED;

View file

@ -224,12 +224,17 @@ Result<void, QString> VfsCfApi::dehydratePlaceholder(const SyncFileItem &item)
Result<Vfs::ConvertToPlaceholderResult, QString> VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
{
const auto localPath = QDir::toNativeSeparators(filename);
if (item._type != ItemTypeDirectory && OCC::FileSystem::isLnkFile(filename)) {
qCInfo(lcCfApi) << "File \"" << filename << "\" is a Windows shortcut. Not converting it to a placeholder.";
const auto pinState = pinStateLocal(localPath);
if (!pinState || *pinState != PinState::Excluded) {
setPinStateLocal(localPath, PinState::Excluded);
}
return Vfs::ConvertToPlaceholderResult::Ok;
}
const auto localPath = QDir::toNativeSeparators(filename);
const auto replacesPath = QDir::toNativeSeparators(replacesFile);
if (cfapi::findPlaceholderInfo(localPath)) {
@ -293,6 +298,11 @@ bool VfsCfApi::setPinState(const QString &folderPath, PinState state)
const auto localPath = QDir::toNativeSeparators(params().filesystemPath + folderPath);
return setPinStateLocal(localPath, state);
}
bool VfsCfApi::setPinStateLocal(const QString &localPath, PinState state)
{
if (cfapi::setPinState(localPath, state, cfapi::Recurse)) {
return true;
} else {
@ -304,9 +314,14 @@ Optional<PinState> VfsCfApi::pinState(const QString &folderPath)
{
const auto localPath = QDir::toNativeSeparators(params().filesystemPath + folderPath);
return pinStateLocal(localPath);
}
Optional<PinState> VfsCfApi::pinStateLocal(const QString &localPath) const
{
const auto info = cfapi::findPlaceholderInfo(localPath);
if (!info) {
qCWarning(lcCfApi) << "Couldn't find pin state for regular non-placeholder file" << localPath;
qCDebug(lcCfApi) << "Couldn't find pin state for regular non-placeholder file" << localPath;
return {};
}

View file

@ -76,6 +76,9 @@ private:
void onHydrationJobFinished(HydrationJob *job);
HydrationJob *findHydrationJob(const QString &requestId) const;
bool setPinStateLocal(const QString &localPath, PinState state);
[[nodiscard]] Optional<PinState> pinStateLocal(const QString &localPath) const;
struct HasHydratedDehydrated {
bool hasHydrated = false;
bool hasDehydrated = false;