From 7d22c101431783f2a78930153a0ede97d8ec999d Mon Sep 17 00:00:00 2001 From: Vlad Brovko Date: Thu, 20 Oct 2011 22:33:54 +0200 Subject: [PATCH] don't rewrite symlink on save, rewrite target instead Merge-request: 399 Reviewed-by: Oswald Buddenhagen Change-Id: If81446a8fd49e9de7611c2f09abd39af2c9c930d --- src/libs/utils/fileutils.cpp | 22 ++++++++++++++++++++++ src/libs/utils/fileutils.h | 1 + src/libs/utils/savefile.cpp | 10 ++++++---- 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) -- 2.11.0