diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/corelib/api/project.cpp | 60 | ||||
-rw-r--r-- | src/lib/corelib/api/project_p.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/api/projectfileupdater.cpp | 6 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 10 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.h | 3 |
5 files changed, 64 insertions, 16 deletions
diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp index c83471dbb..3e5ea76d9 100644 --- a/src/lib/corelib/api/project.cpp +++ b/src/lib/corelib/api/project.cpp @@ -66,6 +66,7 @@ #include <QDir> #include <QMutex> #include <QMutexLocker> +#include <QRegExp> #include <QSharedData> namespace qbs { @@ -323,6 +324,26 @@ ProjectPrivate::GroupUpdateContext ProjectPrivate::getGroupContext(const Product return context; } +static bool matchesWildcard(const QString &filePath, const GroupConstPtr &group) +{ + if (!group->wildcards) + return false; + foreach (const QString &pattern, group->wildcards->patterns) { + QString fullPattern; + if (QFileInfo(group->prefix).isAbsolute()) { + fullPattern = group->prefix; + } else { + fullPattern = QFileInfo(group->location.fileName()).absolutePath() + + QLatin1Char('/') + group->prefix; + } + fullPattern.append(QLatin1Char('/')).append(pattern); + fullPattern = QDir::cleanPath(fullPattern); + if (QRegExp(fullPattern, Qt::CaseSensitive, QRegExp::Wildcard).exactMatch(filePath)) + return true; + } + return false; +} + ProjectPrivate::FileListUpdateContext ProjectPrivate::getFileListContext(const ProductData &product, const GroupData &group, const QStringList &filePaths) { @@ -352,13 +373,27 @@ ProjectPrivate::FileListUpdateContext ProjectPrivate::getFileListContext(const P throw ErrorInfo(Tr::tr("File '%1' appears more than once.").arg(absPath)); if (!FileInfo(absPath).exists()) throw ErrorInfo(Tr::tr("File '%1' does not exist.").arg(absPath)); - filesContext.absoluteFilePaths << absPath; - filesContext.relativeFilePaths << baseDir.relativeFilePath(absPath); + if (matchesWildcard(absPath, groupContext.resolvedGroups.first())) { + filesContext.absoluteFilePathsFromWildcards << absPath; + } else { + filesContext.absoluteFilePaths << absPath; + filesContext.relativeFilePaths << baseDir.relativeFilePath(absPath); + } } return filesContext; } +static SourceArtifactPtr createSourceArtifact(const QString &filePath, + const ResolvedProductPtr &product, const GroupConstPtr &group, + QList<SourceArtifactPtr> &artifactList, Logger &logger) +{ + const SourceArtifactPtr artifact = ProjectResolver::createSourceArtifact(product, + group->properties, filePath, group->fileTags, group->overrideTags, artifactList); + ProjectResolver::applyFileTaggers(artifact, product, logger); + return artifact; +} + void ProjectPrivate::addFiles(const ProductData &product, const GroupData &group, const QStringList &filePaths) { @@ -392,14 +427,13 @@ void ProjectPrivate::addFiles(const ProductData &product, const GroupData &group const ResolvedProductPtr &resolvedProduct = groupContext.resolvedProducts.at(i); const GroupPtr &resolvedGroup = groupContext.resolvedGroups.at(i); foreach (const QString &file, filesContext.absoluteFilePaths) { - const SourceArtifactPtr artifact = SourceArtifact::create(); - artifact->absoluteFilePath = file; - artifact->properties = resolvedGroup->properties; - artifact->fileTags = resolvedGroup->fileTags; - artifact->overrideFileTags = resolvedGroup->overrideTags; - ProjectResolver::applyFileTaggers(artifact, resolvedProduct, logger); - addedSourceArtifacts << artifact; - resolvedGroup->files << artifact; + addedSourceArtifacts << createSourceArtifact(file, resolvedProduct, + resolvedGroup, resolvedGroup->files, logger); + } + foreach (const QString &file, filesContext.absoluteFilePathsFromWildcards) { + QBS_CHECK(resolvedGroup->wildcards); + addedSourceArtifacts << createSourceArtifact(file, resolvedProduct, + resolvedGroup, resolvedGroup->wildcards->files, logger); } if (resolvedProduct->enabled) { foreach (const SourceArtifactConstPtr &sa, addedSourceArtifacts) @@ -409,6 +443,7 @@ void ProjectPrivate::addFiles(const ProductData &product, const GroupData &group doSanityChecks(internalProject, logger); foreach (const GroupData &g, groupContext.groups) { g.d->filePaths << filesContext.absoluteFilePaths; + g.d->expandedWildcards << filesContext.absoluteFilePathsFromWildcards; qSort(g.d->filePaths); } } @@ -419,6 +454,11 @@ void ProjectPrivate::removeFiles(const ProductData &product, const GroupData &gr FileListUpdateContext filesContext = getFileListContext(product, group, filePaths); GroupUpdateContext &groupContext = filesContext.groupContext; + if (!filesContext.absoluteFilePathsFromWildcards.isEmpty()) { + throw ErrorInfo(Tr::tr("The following files cannot be removed from the project file, " + "because they match wildcard patterns: %1") + .arg(filesContext.absoluteFilePathsFromWildcards.join(QLatin1String(", ")))); + } QStringList filesNotFound = filesContext.absoluteFilePaths; QList<SourceArtifactPtr> sourceArtifacts; foreach (const SourceArtifactPtr &sa, groupContext.resolvedGroups.first()->files) { diff --git a/src/lib/corelib/api/project_p.h b/src/lib/corelib/api/project_p.h index 2c6dddf73..30c966dce 100644 --- a/src/lib/corelib/api/project_p.h +++ b/src/lib/corelib/api/project_p.h @@ -84,6 +84,7 @@ public: GroupUpdateContext groupContext; QStringList absoluteFilePaths; QStringList relativeFilePaths; + QStringList absoluteFilePathsFromWildcards; // Not included in the other two lists. }; GroupUpdateContext getGroupContext(const ProductData &product, const GroupData &group); diff --git a/src/lib/corelib/api/projectfileupdater.cpp b/src/lib/corelib/api/projectfileupdater.cpp index 2deb83264..fd38e87a0 100644 --- a/src/lib/corelib/api/projectfileupdater.cpp +++ b/src/lib/corelib/api/projectfileupdater.cpp @@ -269,6 +269,9 @@ ProjectFileFilesAdder::ProjectFileFilesAdder(const ProductData &product, const G void ProjectFileFilesAdder::doApply(QString &fileContent, UiProgram *ast) { + if (m_files.isEmpty()) + return; + // Find the item containing the "files" binding. ItemFinder itemFinder(m_group.isValid() ? m_group.location() : m_product.location()); ast->accept(&itemFinder); @@ -389,6 +392,9 @@ ProjectFileFilesRemover::ProjectFileFilesRemover(const ProductData &product, con void ProjectFileFilesRemover::doApply(QString &fileContent, UiProgram *ast) { + if (m_files.isEmpty()) + return; + // Find the item containing the "files" binding. ItemFinder itemFinder(m_group.isValid() ? m_group.location() : m_product.location()); ast->accept(&itemFinder); diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 5d6a97349..92244f6a4 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -425,12 +425,9 @@ void ProjectResolver::resolveModule(const QStringList &moduleName, Item *item, m_moduleContext = 0; } -static void createSourceArtifact(const ResolvedProductConstPtr &rproduct, - const PropertyMapPtr &properties, - const QString &fileName, - const FileTags &fileTags, - bool overrideTags, - QList<SourceArtifactPtr> &artifactList) +SourceArtifactPtr ProjectResolver::createSourceArtifact(const ResolvedProductConstPtr &rproduct, + const PropertyMapPtr &properties, const QString &fileName, const FileTags &fileTags, + bool overrideTags, QList<SourceArtifactPtr> &artifactList) { SourceArtifactPtr artifact = SourceArtifact::create(); artifact->absoluteFilePath = FileInfo::resolvePath(rproduct->sourceDirectory, fileName); @@ -438,6 +435,7 @@ static void createSourceArtifact(const ResolvedProductConstPtr &rproduct, artifact->overrideFileTags = overrideTags; artifact->properties = properties; artifactList += artifact; + return artifact; } static bool isSomeModulePropertySet(Item *group) diff --git a/src/lib/corelib/language/projectresolver.h b/src/lib/corelib/language/projectresolver.h index 091c932f3..5bb711b15 100644 --- a/src/lib/corelib/language/projectresolver.h +++ b/src/lib/corelib/language/projectresolver.h @@ -64,6 +64,9 @@ public: static void applyFileTaggers(const SourceArtifactPtr &artifact, const ResolvedProductConstPtr &product, const Logger &logger); + static SourceArtifactPtr createSourceArtifact(const ResolvedProductConstPtr &rproduct, + const PropertyMapPtr &properties, const QString &fileName, + const FileTags &fileTags, bool overrideTags, QList<SourceArtifactPtr> &artifactList); private: struct ProjectContext |