diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 53b8957794d..654d263664d 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -990,8 +990,10 @@ QTextStream &operator<<(QTextStream &s, const FilePath &fn) } #ifdef QT_GUI_LIB -FileUtils::CopyAskingForOverwrite::CopyAskingForOverwrite(QWidget *dialogParent) +FileUtils::CopyAskingForOverwrite::CopyAskingForOverwrite( + QWidget *dialogParent, const std::function &postOperation) : m_parent(dialogParent) + , m_postOperation(postOperation) {} bool FileUtils::CopyAskingForOverwrite::operator()(const QFileInfo &src, @@ -1036,6 +1038,8 @@ bool FileUtils::CopyAskingForOverwrite::operator()(const QFileInfo &src, } return false; } + if (m_postOperation) + m_postOperation(dest); } m_files.append(dest.absoluteFilePath()); return true; diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 9f1a0bef91c..5456582f26d 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -168,13 +168,15 @@ public: class QTCREATOR_UTILS_EXPORT CopyAskingForOverwrite { public: - CopyAskingForOverwrite(QWidget *dialogParent); + CopyAskingForOverwrite(QWidget *dialogParent, + const std::function &postOperation = {}); bool operator()(const QFileInfo &src, const QFileInfo &dest, QString *error); QStringList files() const; private: QWidget *m_parent; QStringList m_files; + std::function m_postOperation; bool m_overwriteAll = false; bool m_skipAll = false; }; diff --git a/src/plugins/coreplugin/plugininstallwizard.cpp b/src/plugins/coreplugin/plugininstallwizard.cpp index c9ce41b3489..ee2f4bd1f6c 100644 --- a/src/plugins/coreplugin/plugininstallwizard.cpp +++ b/src/plugins/coreplugin/plugininstallwizard.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -418,6 +419,19 @@ private: Data *m_data = nullptr; }; +static std::function postCopyOperation() +{ + return [](const QFileInfo &fi) { + if (!HostOsInfo::isMacHost()) + return; + // On macOS, downloaded files get a quarantine flag, remove it, otherwise it is a hassle + // to get it loaded as a plugin in Qt Creator. + SynchronousProcess xattr; + xattr.setTimeoutS(1); + xattr.runBlocking({"/usr/bin/xattr", {"-d", "com.apple.quarantine", fi.absoluteFilePath()}}); + }; +} + static bool copyPluginFile(const FilePath &src, const FilePath &dest) { const FilePath destFile = dest.pathAppended(src.fileName()); @@ -444,6 +458,7 @@ static bool copyPluginFile(const FilePath &src, const FilePath &dest) .arg(destFile.toUserOutput())); return false; } + postCopyOperation()(destFile.toFileInfo()); return true; } @@ -475,8 +490,8 @@ bool PluginInstallWizard::exec() if (!FileUtils::copyRecursively(data.extractedPath, installPath, &error, - FileUtils::CopyAskingForOverwrite( - ICore::dialogParent()))) { + FileUtils::CopyAskingForOverwrite(ICore::dialogParent(), + postCopyOperation()))) { QMessageBox::warning(ICore::dialogParent(), PluginInstallWizard::tr("Failed to Copy Plugin Files"), error);