diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2017-12-15 09:11:01 +0100 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2017-12-15 13:55:23 +0000 |
commit | 0dafe5cb8c8135d365c8cb0d365eae5ce66d268e (patch) | |
tree | 8117fc60a8a02bd661f31f86ac0d5fc29fc23e8a /src/libs/utils/savefile.cpp | |
parent | 8187c6a14628a7411eb8d20c0cd9462c3fb316e9 (diff) |
Utils: improve savefile error messages
Change-Id: I505c33e1e56a67a3682de2e2cbfe2ab967d04242
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/libs/utils/savefile.cpp')
-rw-r--r-- | src/libs/utils/savefile.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp index 3e00b36beee..b14178ed47c 100644 --- a/src/libs/utils/savefile.cpp +++ b/src/libs/utils/savefile.cpp @@ -112,25 +112,35 @@ bool SaveFile::commit() QString finalFileName = FileUtils::resolveSymlinks(FileName::fromString(m_finalFileName)).toString(); - QString bakname = finalFileName + QLatin1Char('~'); + const QString backupName = finalFileName + '~'; + // Back up current file. + // If it's opened by another application, the lock follows the move. if (QFile::exists(finalFileName)) { - QFile::remove(bakname); // Kill old backup - // Try to back up current file - if (!QFile::rename(finalFileName, bakname)) { + // Kill old backup. Might be useful if creator crashed before removing backup. + QFile::remove(backupName); + QFile finalFile(finalFileName); + if (!finalFile.rename(backupName)) { remove(); - setErrorString(tr("File might be locked.")); + setErrorString(finalFile.errorString()); return false; } } - if (!rename(finalFileName)) { // Replace current file - QFile::rename(bakname, finalFileName); // Rollback to current file + + bool result = true; + if (!rename(finalFileName)) { + // The case when someone else was able to create finalFileName after we've renamed it. + // Higher level call may try to save this file again but here we do nothing and + // return false while keeping the error string from last rename call. + const QString &renameError = errorString(); remove(); - return false; + setErrorString(renameError); + result = false; } - QFile::remove(bakname); - return true; + QFile::remove(backupName); + + return result; } void SaveFile::initializeUmask() |