Propagate download: Fix restoring files for which the conflict file exists
authorOlivier Goffart <ogoffart@woboq.com>
Thu, 16 Apr 2015 09:21:39 +0000 (11:21 +0200)
committerOlivier Goffart <ogoffart@woboq.com>
Thu, 16 Apr 2015 09:36:01 +0000 (11:36 +0200)
For issue #3106

1) Always use the actual timestamp from the file in the file system
to create the conflict file.  This is important because if one edit a
file several time, they should have different name. Also it makes more
sens to have the mtime of the modified file.

2) Give the correct size to the job so we know when the temporary file
is complete in case of resuming.

src/libsync/propagator_legacy.cpp
src/libsync/syncengine.cpp

index dc714b607c5a8bab265f1df028fdf8f9028c4df0..b9dc7e8cde9c12438bbbefdda46312bede34c095 100644 (file)
@@ -695,7 +695,8 @@ void PropagateDownloadFileLegacy::start()
         && !FileSystem::fileEquals(fn, tmpFile.fileName()); // compare the files to see if there was an actual conflict.
     //In case of conflict, make a backup of the old file
     if (isConflict) {
-        QString conflictFileName = makeConflictFileName(fn, Utility::qDateTimeFromTime_t(_item._modtime));
+        auto conflictDate = FileSystem::fileExists(fn) ? FileSystem::getModTime(fn) : _item._modtime;
+        QString conflictFileName = makeConflictFileName(fn, Utility::qDateTimeFromTime_t(conflictDate));
         QString renameError;
         if (!FileSystem::rename(fn, conflictFileName, &renameError)) {
             //If the rename fails, don't replace it.
index d8fa74a89dead864ac297c55531b694e81ad41f5..81d0872972bb51f1db111a1e17779825f5c089b5 100644 (file)
@@ -999,8 +999,8 @@ void SyncEngine::checkForPermission()
                     it->_direction = SyncFileItem::Down;
                     it->_isRestoration = true;
                     // take the things to write to the db from the "other" node (i.e: info from server)
-                    // ^^ FIXME This might not be needed anymore since we merge the info in treewalkFile
                     it->_modtime = it->log._other_modtime;
+                    it->_size = it->log._other_size;
                     it->_fileId = it->log._other_fileId;
                     it->_etag = it->log._other_etag;
                     it->_errorString = tr("Not allowed to upload this file because it is read-only on the server, restoring");