propfindJob->start();
}
+
/* Given a path on the remote, give the path as it is when the rename is done */
QString DiscoveryPhase::adjustRenamedPath(const QString &original) const
+{
+ return OCC::adjustRenamedPath(_renamedItems, original);
+}
+
+QString adjustRenamedPath(const QMap<QString, QString> renamedItems, const QString original)
{
int slashPos = original.size();
while ((slashPos = original.lastIndexOf('/', slashPos - 1)) > 0) {
- auto it = _renamedItems.constFind(original.left(slashPos));
- if (it != _renamedItems.constEnd()) {
+ auto it = renamedItems.constFind(original.left(slashPos));
+ if (it != renamedItems.constEnd()) {
return *it + original.mid(slashPos);
}
}
// A new folder was discovered and was not synced because of the confirmation feature
void newBigFolder(const QString &folder, bool isExternal);
};
+
+/// Implementation of DiscoveryPhase::adjustRenamedPath
+QString adjustRenamedPath(const QMap<QString, QString> renamedItems, const QString original);
}
#include "common/utility.h"
#include "account.h"
#include "common/asserts.h"
+#include "discoveryphase.h"
#ifdef Q_OS_WIN
#include <windef.h>
return true;
}
+QString OwncloudPropagator::adjustRenamedPath(const QString &original) const
+{
+ return OCC::adjustRenamedPath(_renamedDirectories, original);
+}
+
// ================================================================================
PropagatorJob::PropagatorJob(OwncloudPropagator *propagator)
bool createConflict(const SyncFileItemPtr &item,
PropagatorCompositeJob *composite, QString *error);
+
+ QMap<QString, QString> _renamedDirectories;
+ QString adjustRenamedPath(const QString &original) const;
+
private slots:
void abortTimeout()
if (propagator()->_abortRequested.fetchAndAddRelaxed(0))
return;
- qCDebug(lcPropagateRemoteMove) << _item->_file << _item->_renameTarget;
+ QString origin = propagator()->adjustRenamedPath(_item->_file);
+ qCDebug(lcPropagateRemoteMove) << origin << _item->_renameTarget;
QString targetFile(propagator()->getFilePath(_item->_renameTarget));
- if (_item->_file == _item->_renameTarget) {
+ if (origin == _item->_renameTarget) {
// The parent has been renamed already so there is nothing more to do.
finalize();
return;
}
- QString source = propagator()->_remoteFolder + _item->_file;
+ QString source = propagator()->_remoteFolder + origin;
QString destination = QDir::cleanPath(propagator()->account()->davUrl().path() + propagator()->_remoteFolder + _item->_renameTarget);
auto &vfs = propagator()->syncOptions()._vfs;
if (vfs->mode() == Vfs::WithSuffix
}
if (_item->isDirectory()) {
+ propagator()->_renamedDirectories.insert(_item->_file, _item->_renameTarget);
if (!adjustSelectiveSync(propagator()->_journal, _item->_file, _item->_renameTarget)) {
done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
return;
if (propagator()->_abortRequested.fetchAndAddRelaxed(0))
return;
- QString existingFile = propagator()->getFilePath(_item->_file);
+ QString existingFile = propagator()->getFilePath(propagator()->adjustRenamedPath(_item->_file));
QString targetFile = propagator()->getFilePath(_item->_renameTarget);
// if the file is a file underneath a moved dir, the _item->file is equal
return;
}
} else {
+ propagator()->_renamedDirectories.insert(oldFile, _item->_renameTarget);
if (!PropagateRemoteMove::adjustSelectiveSync(propagator()->_journal, oldFile, _item->_renameTarget)) {
done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
return;
QCOMPARE(fakeFolder.currentLocalState(), expectedState);
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
- /* FIXME - likely addressed by ogoffart's sync code refactor
// Now, the revert, but "crossed"
fakeFolder.localModifier().rename("Empty/A", "A");
fakeFolder.localModifier().rename("AllEmpty/C", "C");
QVERIFY(fakeFolder.syncOnce());
QCOMPARE(fakeFolder.currentLocalState(), expectedState);
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
- */
+
+ // Reverse on remote
+ fakeFolder.remoteModifier().rename("A/AllEmpty", "AllEmpty");
+ fakeFolder.remoteModifier().rename("C/Empty", "Empty");
+ fakeFolder.remoteModifier().rename("C", "AllEmpty/C");
+ fakeFolder.remoteModifier().rename("A", "Empty/A");
+ expectedState = fakeFolder.currentRemoteState();
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), expectedState);
+ QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
}
};