From bf905c1fed6d440301800f2cfcf39b9fc6c2e7a6 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 6 Sep 2024 15:33:12 +0200 Subject: [PATCH] Wizards: Keep file permissions intact when generating files Useful e.g. for wizards that create scripts that should be executable. Change-Id: I0437e81008a70137d1c9d24ae562409297f2b734 Reviewed-by: Christian Stenger --- src/plugins/coreplugin/generatedfile.cpp | 58 +++++++++++++++---- src/plugins/coreplugin/generatedfile.h | 4 ++ .../jsonwizard/jsonwizardfilegenerator.cpp | 1 + 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/plugins/coreplugin/generatedfile.cpp b/src/plugins/coreplugin/generatedfile.cpp index 35ac4e1fa5b..3c9a7165f06 100644 --- a/src/plugins/coreplugin/generatedfile.cpp +++ b/src/plugins/coreplugin/generatedfile.cpp @@ -12,6 +12,8 @@ #include #include +#include + using namespace Utils; namespace Core { @@ -34,7 +36,12 @@ class GeneratedFilePrivate : public QSharedData public: GeneratedFilePrivate() = default; explicit GeneratedFilePrivate(const FilePath &path); + + bool writeContents(QString *errorMessage) const; + bool writePermissions(QString *errorMessage) const; + FilePath path; + std::optional permissions; QByteArray contents; Id editorId; bool binary = false; @@ -93,6 +100,16 @@ void GeneratedFile::setFilePath(const FilePath &p) m_d->path = p; } +void GeneratedFile::setPermissions(QFileDevice::Permissions permissions) +{ + m_d->permissions = permissions; +} + +std::optional GeneratedFile::permissions() const +{ + return m_d->permissions; +} + QString GeneratedFile::contents() const { return QString::fromUtf8(m_d->contents); @@ -133,6 +150,33 @@ void GeneratedFile::setEditorId(Id id) m_d->editorId = id; } +bool GeneratedFilePrivate::writeContents(QString *errorMessage) const +{ + if (binary) { + QIODevice::OpenMode flags = QIODevice::WriteOnly | QIODevice::Truncate; + FileSaver saver(path, flags); + saver.write(contents); + return saver.finalize(errorMessage); + } + + TextFileFormat format; + format.codec = EditorManager::defaultTextCodec(); + format.lineTerminationMode = EditorManager::defaultLineEnding(); + return format.writeFile(path, QString::fromUtf8(contents), errorMessage); +} + +bool GeneratedFilePrivate::writePermissions(QString *errorMessage) const +{ + if (!permissions) + return true; + if (!path.setPermissions(*permissions)) { + if (errorMessage) + *errorMessage = Tr::tr("Failed to set permissions."); + return false; + } + return true; +} + bool GeneratedFile::write(QString *errorMessage) const { // Ensure the directory @@ -146,17 +190,9 @@ bool GeneratedFile::write(QString *errorMessage) const } // Write out - if (isBinary()) { - QIODevice::OpenMode flags = QIODevice::WriteOnly | QIODevice::Truncate; - Utils::FileSaver saver(m_d->path, flags); - saver.write(m_d->contents); - return saver.finalize(errorMessage); - } - - Utils::TextFileFormat format; - format.codec = EditorManager::defaultTextCodec(); - format.lineTerminationMode = EditorManager::defaultLineEnding(); - return format.writeFile(m_d->path, contents(), errorMessage); + if (!m_d->writeContents(errorMessage)) + return false; + return m_d->writePermissions(errorMessage); } GeneratedFile::Attributes GeneratedFile::attributes() const diff --git a/src/plugins/coreplugin/generatedfile.h b/src/plugins/coreplugin/generatedfile.h index 0ac801149f7..f9a470d0111 100644 --- a/src/plugins/coreplugin/generatedfile.h +++ b/src/plugins/coreplugin/generatedfile.h @@ -7,6 +7,7 @@ #include +#include #include #include @@ -44,6 +45,9 @@ public: void setFilePath(const Utils::FilePath &p); Utils::FilePath filePath() const; + void setPermissions(QFile::Permissions permissions); + std::optional permissions() const; + // Contents of the file (UTF8) QString contents() const; void setContents(const QString &c); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp index d8baafb0cfe..e6f4c4a0104 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp @@ -163,6 +163,7 @@ Core::GeneratedFile JsonWizardFileGenerator::generateFile(const File &file, return Core::GeneratedFile(); } } + gf.setPermissions(file.source.permissions()); } Core::GeneratedFile::Attributes attributes;