aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib/api')
-rw-r--r--src/lib/corelib/api/project.cpp60
-rw-r--r--src/lib/corelib/api/project_p.h1
-rw-r--r--src/lib/corelib/api/projectfileupdater.cpp6
3 files changed, 57 insertions, 10 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);