summaryrefslogtreecommitdiff
path: root/src/libs/utils
diff options
context:
space:
mode:
authorVlad Brovko <brovka75@mail.ru>2011-10-20 22:33:54 +0200
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2011-10-20 22:33:54 +0200
commit7d22c101431783f2a78930153a0ede97d8ec999d (patch)
tree9421dbd1cb60d97c0757e43eb68159808b9aa288 /src/libs/utils
parentdb31112e8e8ed8258ac219a4d38b51d42f6e4701 (diff)
downloadqt-creator-7d22c101431783f2a78930153a0ede97d8ec999d.tar.gz
don't rewrite symlink on save, rewrite target instead
Merge-request: 399 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Change-Id: If81446a8fd49e9de7611c2f09abd39af2c9c930d
Diffstat (limited to 'src/libs/utils')
-rw-r--r--src/libs/utils/fileutils.cpp22
-rw-r--r--src/libs/utils/fileutils.h1
-rw-r--r--src/libs/utils/savefile.cpp10
3 files changed, 29 insertions, 4 deletions
diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp
index 407b96abb6..4821af16ae 100644
--- a/src/libs/utils/fileutils.cpp
+++ b/src/libs/utils/fileutils.cpp
@@ -92,6 +92,18 @@ namespace Utils {
\return Whether at least one file in \a filePath has a newer date than \a timeStamp.
*/
+/*!
+ \fn Utils::FileUtils::resolveSymlinks(const QString &filePath)
+
+ Recursively resolve possibly present symlinks in \a filePath.
+ Unlike QFileInfo::canonicalFilePath(), this function will still return the expected target file
+ even if the symlink is dangling.
+
+ \note Maximum recursion depth == 16.
+
+ return Symlink target file path.
+*/
+
bool FileUtils::removeRecursively(const QString &filePath, QString *error)
{
QFileInfo fileInfo(filePath);
@@ -197,6 +209,16 @@ bool FileUtils::isFileNewerThan(const QString &filePath,
return false;
}
+QString FileUtils::resolveSymlinks(const QString &path)
+{
+ QFileInfo f(path);
+ int links = 16;
+ while (links-- && f.isSymLink())
+ f.setFile(f.symLinkTarget());
+ if (links <= 0)
+ return QString();
+ return f.filePath();
+}
QByteArray FileReader::fetchQrc(const QString &fileName)
diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h
index 27efdaec95..cde1f1fb14 100644
--- a/src/libs/utils/fileutils.h
+++ b/src/libs/utils/fileutils.h
@@ -57,6 +57,7 @@ public:
const QString &tgtFilePath, QString *error = 0);
static bool isFileNewerThan(const QString &filePath,
const QDateTime &timeStamp);
+ static QString resolveSymlinks(const QString &path);
};
class QTCREATOR_UTILS_EXPORT FileReader
diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp
index 63028d8250..6c5bb3103b 100644
--- a/src/libs/utils/savefile.cpp
+++ b/src/libs/utils/savefile.cpp
@@ -32,6 +32,7 @@
#include "savefile.h"
#include "qtcassert.h"
+#include "fileutils.h"
namespace Utils {
@@ -84,11 +85,12 @@ bool SaveFile::commit()
return false;
}
- QString bakname = m_finalFileName + QLatin1Char('~');
+ QString finalFileName = Utils::FileUtils::resolveSymlinks(m_finalFileName);
+ QString bakname = finalFileName + QLatin1Char('~');
QFile::remove(bakname); // Kill old backup
- QFile::rename(m_finalFileName, bakname); // Backup current file
- if (!rename(m_finalFileName)) { // Replace current file
- QFile::rename(bakname, m_finalFileName); // Rollback to current file
+ QFile::rename(finalFileName, bakname); // Backup current file
+ if (!rename(finalFileName)) { // Replace current file
+ QFile::rename(bakname, finalFileName); // Rollback to current file
return false;
}
if (!m_backup)