mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-24 21:35:47 +03:00
Merge pull request #4970 from nextcloud/bugfix/file-name-clash
Improve handling of file name clashes
This commit is contained in:
commit
6a117be9dd
7 changed files with 33 additions and 7 deletions
|
@ -232,7 +232,8 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
|
|||
|| a._status == SyncFileItem::Conflict
|
||||
|| a._status == SyncFileItem::Restoration
|
||||
|| a._status == SyncFileItem::FileLocked
|
||||
|| a._status == SyncFileItem::FileNameInvalid) {
|
||||
|| a._status == SyncFileItem::FileNameInvalid
|
||||
|| a._status == SyncFileItem::FileNameClash) {
|
||||
colorIconPath.append("state-warning.svg");
|
||||
return colorIconPath;
|
||||
} else if (a._status == SyncFileItem::FileIgnored) {
|
||||
|
@ -810,6 +811,22 @@ void ActivityListModel::slotTriggerDefaultAction(const int activityIndex)
|
|||
_currentInvalidFilenameDialog->open();
|
||||
ownCloudGui::raiseDialog(_currentInvalidFilenameDialog);
|
||||
return;
|
||||
} else if (activity._status == SyncFileItem::FileNameClash) {
|
||||
const auto folder = FolderMan::instance()->folder(activity._folder);
|
||||
const auto relPath = activity._fileAction == QStringLiteral("file_renamed") ? activity._renamedFile : activity._file;
|
||||
SyncJournalFileRecord record;
|
||||
|
||||
if (!folder || !folder->journalDb()->getFileRecord(relPath, &record)) {
|
||||
return;
|
||||
}
|
||||
|
||||
fetchPrivateLinkUrl(folder->accountState()->account(),
|
||||
relPath,
|
||||
record.numericFileId(),
|
||||
this,
|
||||
[](const QString &link) { Utility::openBrowser(link); }
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!path.isEmpty()) {
|
||||
|
|
|
@ -711,6 +711,7 @@ void BulkPropagatorJob::handleJobDoneErrors(SyncFileItemPtr item,
|
|||
case SyncFileItem::FileIgnored:
|
||||
case SyncFileItem::FileLocked:
|
||||
case SyncFileItem::FileNameInvalid:
|
||||
case SyncFileItem::FileNameClash:
|
||||
case SyncFileItem::NoStatus:
|
||||
case SyncFileItem::NormalError:
|
||||
case SyncFileItem::Restoration:
|
||||
|
|
|
@ -273,6 +273,7 @@ void PropagateItemJob::done(SyncFileItem::Status statusArg, const QString &error
|
|||
case SyncFileItem::BlacklistedError:
|
||||
case SyncFileItem::FileLocked:
|
||||
case SyncFileItem::FileNameInvalid:
|
||||
case SyncFileItem::FileNameClash:
|
||||
// nothing
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -97,7 +97,8 @@ bool Progress::isWarningKind(SyncFileItem::Status kind)
|
|||
|| kind == SyncFileItem::FatalError || kind == SyncFileItem::FileIgnored
|
||||
|| kind == SyncFileItem::Conflict || kind == SyncFileItem::Restoration
|
||||
|| kind == SyncFileItem::DetailError || kind == SyncFileItem::BlacklistedError
|
||||
|| kind == SyncFileItem::FileLocked;
|
||||
|| kind == SyncFileItem::FileLocked || kind == SyncFileItem::FileNameInvalid
|
||||
|| kind == SyncFileItem::FileNameClash;
|
||||
}
|
||||
|
||||
bool Progress::isIgnoredKind(SyncFileItem::Status kind)
|
||||
|
|
|
@ -528,14 +528,14 @@ void PropagateDownloadFile::startAfterIsEncryptedIsChecked()
|
|||
}
|
||||
if (_item->_type == ItemTypeVirtualFile) {
|
||||
if (propagator()->localFileNameClash(_item->_file)) {
|
||||
done(SyncFileItem::NormalError, tr("File %1 cannot be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
done(SyncFileItem::FileNameClash, tr("File %1 cannot be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(lcPropagateDownload) << "creating virtual file" << _item->_file;
|
||||
// do a klaas' case clash check.
|
||||
if (propagator()->localFileNameClash(_item->_file)) {
|
||||
done(SyncFileItem::NormalError, tr("File %1 can not be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
done(SyncFileItem::FileNameClash, tr("File %1 can not be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
return;
|
||||
}
|
||||
auto r = vfs->createPlaceholder(*_item);
|
||||
|
@ -633,7 +633,7 @@ void PropagateDownloadFile::startDownload()
|
|||
|
||||
// do a klaas' case clash check.
|
||||
if (propagator()->localFileNameClash(_item->_file)) {
|
||||
done(SyncFileItem::NormalError, tr("File %1 cannot be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
done(SyncFileItem::FileNameClash, tr("File %1 cannot be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1126,7 +1126,7 @@ void PropagateDownloadFile::downloadFinished()
|
|||
// In case of file name clash, report an error
|
||||
// This can happen if another parallel download saved a clashing file.
|
||||
if (propagator()->localFileNameClash(_item->_file)) {
|
||||
done(SyncFileItem::NormalError, tr("File %1 cannot be saved because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
done(SyncFileItem::FileNameClash, tr("File %1 cannot be saved because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file)));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,12 @@ public:
|
|||
*/
|
||||
FileNameInvalid,
|
||||
|
||||
/**
|
||||
* There is a file name clash (e.g. attempting to download test.txt when TEST.TXT already exists
|
||||
* on a platform where the filesystem is case-insensitive
|
||||
*/
|
||||
FileNameClash,
|
||||
|
||||
/** For errors that should only appear in the error view.
|
||||
*
|
||||
* Some errors also produce a summary message. Usually displaying that message is
|
||||
|
|
|
@ -141,7 +141,7 @@ void SyncResult::processCompletedItem(const SyncFileItemPtr &item)
|
|||
if (!_firstItemError) {
|
||||
_firstItemError = item;
|
||||
}
|
||||
} else if (item->_status == SyncFileItem::Conflict || item->_status == SyncFileItem::FileNameInvalid) {
|
||||
} else if (item->_status == SyncFileItem::Conflict || item->_status == SyncFileItem::FileNameInvalid || item->_status == SyncFileItem::FileNameClash) {
|
||||
if (item->_instruction == CSYNC_INSTRUCTION_CONFLICT) {
|
||||
_numNewConflictItems++;
|
||||
if (!_firstNewConflictItem) {
|
||||
|
|
Loading…
Reference in a new issue