aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/savefile.cpp
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2017-12-15 09:11:01 +0100
committerIvan Donchevskii <ivan.donchevskii@qt.io>2017-12-15 13:55:23 +0000
commit0dafe5cb8c8135d365c8cb0d365eae5ce66d268e (patch)
tree8117fc60a8a02bd661f31f86ac0d5fc29fc23e8a /src/libs/utils/savefile.cpp
parent8187c6a14628a7411eb8d20c0cd9462c3fb316e9 (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.cpp30
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()