From 9d95afc803abe0cb41e882c780d05fe646ae13f2 Mon Sep 17 00:00:00 2001 From: Thomas Epting Date: Mon, 18 Aug 2014 16:30:43 +0200 Subject: [PATCH] QbsProjectManager: Write enable project files before adding/removing Prevent failures in situations where Qbs project files are still write protected, like e.g. in Perforce VCS. Change-Id: I2828546adcc314b7c6b0b6720e1cf96733d62fa5 Reviewed-by: Christian Kandeler --- src/plugins/qbsprojectmanager/qbsproject.cpp | 27 ++++++++++++++++++++ src/plugins/qbsprojectmanager/qbsproject.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 11d20a80e44..e1156498688 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -39,6 +39,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -68,6 +71,7 @@ #include #include #include +#include #include using namespace Core; @@ -229,6 +233,27 @@ private: bool m_wasInDocumentManager; }; +bool QbsProject::ensureWriteableQbsFile(const QString &file) +{ + // Ensure that the file is not read only + QFileInfo fi(file); + if (!fi.isWritable()) { + // Try via vcs manager + Core::IVersionControl *versionControl = + Core::VcsManager::findVersionControlForDirectory(fi.absolutePath()); + if (!versionControl || !versionControl->vcsOpen(file)) { + bool makeWritable = QFile::setPermissions(file, fi.permissions() | QFile::WriteUser); + if (!makeWritable) { + QMessageBox::warning(Core::ICore::mainWindow(), + tr("Failed!"), + tr("Could not write project file %1.").arg(file)); + return false; + } + } + } + return true; +} + bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &filePaths, const qbs::ProductData &productData, const qbs::GroupData &groupData, QStringList *notAdded) { @@ -236,6 +261,7 @@ bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList & QStringList allPaths = groupData.allFilePaths(); const QString productFilePath = productData.location().fileName(); ChangeExpector expector(productFilePath, m_qbsDocuments); + ensureWriteableQbsFile(productFilePath); foreach (const QString &path, filePaths) { qbs::ErrorInfo err = m_qbsProject.addFiles(productData, groupData, QStringList() << path); if (err.hasError()) { @@ -261,6 +287,7 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL QStringList allPaths = groupData.allFilePaths(); const QString productFilePath = productData.location().fileName(); ChangeExpector expector(productFilePath, m_qbsDocuments); + ensureWriteableQbsFile(productFilePath); foreach (const QString &path, filePaths) { qbs::ErrorInfo err = m_qbsProject.removeFiles(productData, groupData, QStringList() << path); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 75d9f428811..84dcda80e96 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -135,6 +135,8 @@ private: void updateDeploymentInfo(const qbs::Project &project); void updateBuildTargetData(); + static bool ensureWriteableQbsFile(const QString &file); + QbsManager *const m_manager; const QString m_projectName; const QString m_fileName;