PropagateDownload: Read the mtime from the file system after writing it
authorOlivier Goffart <ogoffart@woboq.com>
Wed, 15 Apr 2015 13:31:47 +0000 (15:31 +0200)
committerOlivier Goffart <ogoffart@woboq.com>
Wed, 15 Apr 2015 13:50:20 +0000 (15:50 +0200)
Because file system like FAT only have two second accuracy and would result
in a upload if the mtime in the database is not the same as the one that was
downloaded

Issue #3103

src/libsync/propagatedownload.cpp

index e19ee7f6b73b211ed9a1836dc98c47a2c4d83cb8..98a78b45d0db94f550fca934da928948785d3c0a 100644 (file)
@@ -519,10 +519,14 @@ void PropagateDownloadFileQNAM::downloadFinished()
         _tmpFile.setPermissions(existingFile.permissions());
     }
 
-    FileSystem::setFileHidden(_tmpFile.fileName(), false);
+    FileSystem::setModTime(_tmpFile.fileName(), _item._modtime);
+    // We need to fetch the time again because some file system such as FAT have a less than a second
+    // Accuracy, and we really need the time from the file system. (#3103)
+    _item._modtime = FileSystem::getModTime(_tmpFile.fileName());
 
     QString error;
     _propagator->addTouchedFile(fn);
+    FileSystem::setFileHidden(_tmpFile.fileName(), false);
     if (!FileSystem::renameReplace(_tmpFile.fileName(), fn, &error)) {
         qDebug() << Q_FUNC_INFO << QString("Rename failed: %1 => %2").arg(_tmpFile.fileName()).arg(fn);
         // If we moved away the original file due to a conflict but can't
@@ -543,7 +547,6 @@ void PropagateDownloadFileQNAM::downloadFinished()
 
     // Maybe we downloaded a newer version of the file than we thought we would...
     // Get up to date information for the journal.
-    FileSystem::setModTime(fn, _item._modtime);
     _item._size = FileSystem::getSize(fn);
 
     _propagator->_journal->setFileRecord(SyncJournalFileRecord(_item, fn));