aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-07-23 14:36:52 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-07-23 16:28:36 +0200
commitbbae2f5918ec902533c769387f32d53bf8582bb0 (patch)
treeaceb3a3104218a49608406158de0d19fc0ffd210 /src/lib
parent77ba7c98a81009122e99681dd4e34a4c4309de52 (diff)
API: Be smarter about adding files already matched by wildcards.
The project file does not need an update in this case. Actually, that would even lead to an error on the next project resolving, as the file would then be listed twice (once explicitly and once matched by a pattern). Task-number: QBS-653 Change-Id: If56969c36d1bba3f9194621690c2e1f25229ee9e Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib')
-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
-rw-r--r--src/lib/corelib/language/projectresolver.cpp10
-rw-r--r--src/lib/corelib/language/projectresolver.h3
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