From a834c5104d4ff09a42cbdbb68a8db18f1602316b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 24 May 2017 15:31:40 +0200 Subject: [PATCH] Fix check if example location is writable on Windows The normal permission check done by QFileInfo is not sufficient in many cases. Task-number: QTCREATORBUG-18184 Change-Id: Icab92c592e6d3c8610304e0b987eded6142f4ab3 Reviewed-by: David Schulz --- src/libs/utils/fileutils.h | 27 +++++++++++++++++++ .../qtsupport/gettingstartedwelcomepage.cpp | 14 ++++++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index e1c3b471287..fc6d80f7297 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -49,6 +49,11 @@ class QWidget; QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug dbg, const Utils::FileName &c); +// for withNTFSPermissions +#ifdef Q_OS_WIN +extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; +#endif + QT_END_NAMESPACE namespace Utils { @@ -121,6 +126,28 @@ public: static QString resolvePath(const QString &baseDir, const QString &fileName); }; +// for actually finding out if e.g. directories are writable on Windows +#ifdef Q_OS_WIN + +template +static T withNTFSPermissions(const std::function &task) +{ + qt_ntfs_permission_lookup++; + T result = task(); + qt_ntfs_permission_lookup--; + return result; +} + +#else // Q_OS_WIN + +template +static T withNTFSPermissions(const std::function &task) +{ + return task(); +} + +#endif // Q_OS_WIN + class QTCREATOR_UTILS_EXPORT FileReader { Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic! diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index 4561ce5a0f5..c5ca314c05a 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -28,6 +28,7 @@ #include "exampleslistmodel.h" #include "screenshotcropper.h" +#include #include #include @@ -199,13 +200,16 @@ void ExamplesWelcomePage::openProject(const ExampleItem &item) if (!proFileInfo.exists()) return; - QFileInfo pathInfo(proFileInfo.path()); // If the Qt is a distro Qt on Linux, it will not be writable, hence compilation will fail - if (!proFileInfo.isWritable() - || !pathInfo.isWritable() /* path of .pro file */ - || !QFileInfo(pathInfo.path()).isWritable() /* shadow build directory */) { + // Same if it is installed in non-writable location for other reasons + const bool needsCopy = withNTFSPermissions([proFileInfo] { + QFileInfo pathInfo(proFileInfo.path()); + return !proFileInfo.isWritable() + || !pathInfo.isWritable() /* path of .pro file */ + || !QFileInfo(pathInfo.path()).isWritable() /* shadow build directory */; + }); + if (needsCopy) proFile = copyToAlternativeLocation(proFileInfo, filesToOpen, item.dependencies); - } // don't try to load help and files if loading the help request is being cancelled if (proFile.isEmpty())