diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-13 13:51:33 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-14 09:11:17 +0000 |
commit | c8944cf6cdd94a211400eb881425256cfea50b8b (patch) | |
tree | cd8ef8e8be1739bc2c33707a75c1b426ca99bb93 | |
parent | a6a67b6adb75d7adf9ff9c919e67bc93f650e9a7 (diff) |
Change tracking: Detect formerly missing source files being present
This is only relevant for relaxed mode (i.e. in IDEs), where we don't
throw an error when listed source files are missing.
Task-number: QBS-1061
Change-Id: I4d044a5a317362abfe04e073f32bacfcf8f0e7e2
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r-- | src/lib/corelib/buildgraph/buildgraphloader.cpp | 16 | ||||
-rw-r--r-- | src/lib/corelib/language/language.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/language.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.h | 2 | ||||
-rw-r--r-- | tests/auto/api/testdata/missing-source-file/file1.txt | 0 | ||||
-rw-r--r-- | tests/auto/api/testdata/missing-source-file/file2.txt.missing | 0 | ||||
-rw-r--r-- | tests/auto/api/testdata/missing-source-file/file3.txt | 0 | ||||
-rw-r--r-- | tests/auto/api/testdata/missing-source-file/missing-source-file.qbs | 9 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 29 | ||||
-rw-r--r-- | tests/auto/api/tst_api.h | 1 |
11 files changed, 61 insertions, 2 deletions
diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp index 56e918ab6..d5d877f64 100644 --- a/src/lib/corelib/buildgraph/buildgraphloader.cpp +++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp @@ -468,6 +468,22 @@ bool BuildGraphLoader::hasProductFileChanged(const QList<ResolvedProductPtr> &re m_logger.qbsDebug() << "A product was changed, must re-resolve project"; hasChanged = true; } else if (!changedProducts.contains(product)) { + bool foundMissingSourceFile = false; + for (auto file = product->missingSourceFiles.cbegin(); + file != product->missingSourceFiles.cend(); ++file) { + if (FileInfo(*file).exists()) { + m_logger.qbsDebug() << "Formerly missing file " << *file << " in product " + << product->name << " exists now, must re-resolve project"; + foundMissingSourceFile = true; + break; + } + } + if (foundMissingSourceFile) { + hasChanged = true; + changedProducts += product; + continue; + } + AccumulatingTimer wildcardTimer(m_parameters.logElapsedTime() ? &m_wildcardExpansionEffort : nullptr); foreach (const GroupPtr &group, product->groups) { diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp index 5d00b013c..016adcaf4 100644 --- a/src/lib/corelib/language/language.cpp +++ b/src/lib/corelib/language/language.cpp @@ -501,6 +501,7 @@ void ResolvedProduct::load(PersistentPool &pool) targetName = pool.idLoadString(); sourceDirectory = pool.idLoadString(); destinationDirectory = pool.idLoadString(); + missingSourceFiles = pool.idLoadStringList(); location.load(pool); productProperties = pool.loadVariantMap(); moduleProperties = pool.idLoadS<PropertyMapInternal>(); @@ -524,6 +525,7 @@ void ResolvedProduct::store(PersistentPool &pool) const pool.storeString(targetName); pool.storeString(sourceDirectory); pool.storeString(destinationDirectory); + pool.storeStringList(missingSourceFiles); location.store(pool); pool.store(productProperties); pool.store(moduleProperties); diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h index fa7731d86..ba66fc224 100644 --- a/src/lib/corelib/language/language.h +++ b/src/lib/corelib/language/language.h @@ -394,6 +394,7 @@ public: QList<GroupPtr> groups; QList<ProbeConstPtr> probes; QList<ArtifactPropertiesPtr> artifactProperties; + QStringList missingSourceFiles; QScopedPointer<ProductBuildData> buildData; mutable QProcessEnvironment buildEnvironment; // must not be saved diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 0aa5e9c48..41d0b700e 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -489,7 +489,7 @@ void ProjectResolver::resolveModule(const QualifiedId &moduleName, Item *item, b m_moduleContext = oldModuleContext; } -SourceArtifactPtr ProjectResolver::createSourceArtifact(const ResolvedProductConstPtr &rproduct, +SourceArtifactPtr ProjectResolver::createSourceArtifact(const ResolvedProductPtr &rproduct, const QString &fileName, const GroupPtr &group, bool wildcard, const CodeLocation &filesLocation, QHash<QString, CodeLocation> *fileLocations, ErrorInfo *errorInfo) @@ -499,6 +499,7 @@ SourceArtifactPtr ProjectResolver::createSourceArtifact(const ResolvedProductCon if (!wildcard && !FileInfo(absFilePath).exists()) { if (errorInfo) errorInfo->append(Tr::tr("File '%1' does not exist.").arg(absFilePath), filesLocation); + rproduct->missingSourceFiles << absFilePath; return SourceArtifactPtr(); } if (group->enabled && fileLocations) { diff --git a/src/lib/corelib/language/projectresolver.h b/src/lib/corelib/language/projectresolver.h index 45e63eee4..ffcc0e669 100644 --- a/src/lib/corelib/language/projectresolver.h +++ b/src/lib/corelib/language/projectresolver.h @@ -71,7 +71,7 @@ public: static void applyFileTaggers(const SourceArtifactPtr &artifact, const ResolvedProductConstPtr &product, Logger &logger); - static SourceArtifactPtr createSourceArtifact(const ResolvedProductConstPtr &rproduct, + static SourceArtifactPtr createSourceArtifact(const ResolvedProductPtr &rproduct, const QString &fileName, const GroupPtr &group, bool wildcard, const CodeLocation &filesLocation = CodeLocation(), QHash<QString, CodeLocation> *fileLocations = nullptr, ErrorInfo *errorInfo = nullptr); diff --git a/tests/auto/api/testdata/missing-source-file/file1.txt b/tests/auto/api/testdata/missing-source-file/file1.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/api/testdata/missing-source-file/file1.txt diff --git a/tests/auto/api/testdata/missing-source-file/file2.txt.missing b/tests/auto/api/testdata/missing-source-file/file2.txt.missing new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/api/testdata/missing-source-file/file2.txt.missing diff --git a/tests/auto/api/testdata/missing-source-file/file3.txt b/tests/auto/api/testdata/missing-source-file/file3.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/api/testdata/missing-source-file/file3.txt diff --git a/tests/auto/api/testdata/missing-source-file/missing-source-file.qbs b/tests/auto/api/testdata/missing-source-file/missing-source-file.qbs new file mode 100644 index 000000000..db666f9fd --- /dev/null +++ b/tests/auto/api/testdata/missing-source-file/missing-source-file.qbs @@ -0,0 +1,9 @@ +import qbs + +Product { + files: [ + "file1.txt", + "file2.txt", + "file3.txt", + ] +} diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 9ee9f9cca..446fd77c8 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -1332,6 +1332,35 @@ void TestApi::listBuildSystemFiles() + "/subproject2/subproject3/subproject3.qbs")); } +void TestApi::missingSourceFile() +{ + qbs::SetupProjectParameters setupParams + = defaultSetupParameters("missing-source-file/missing-source-file.qbs"); + setupParams.setProductErrorMode(qbs::ErrorHandlingMode::Relaxed); + + QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams, + m_logSink, 0)); + waitForFinished(job.data()); + QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); + qbs::ProjectData project = job->project().projectData(); + QCOMPARE(project.allProducts().count(), 1); + qbs::ProductData product = project.allProducts().first(); + QCOMPARE(product.groups().count(), 1); + qbs::GroupData group = product.groups().first(); + QCOMPARE(group.allSourceArtifacts().count(), 2); + + QFile::rename("file2.txt.missing", "file2.txt"); + job.reset(qbs::Project().setupProject(setupParams, m_logSink, 0)); + waitForFinished(job.data()); + QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); + project = job->project().projectData(); + QCOMPARE(project.allProducts().count(), 1); + product = project.allProducts().first(); + QCOMPARE(product.groups().count(), 1); + group = product.groups().first(); + QCOMPARE(group.allSourceArtifacts().count(), 3); +} + void TestApi::mocCppIncluded() { // Initial build. diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index 54aed93e8..c3912f825 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -96,6 +96,7 @@ private slots: void installableFiles(); void isRunnable(); void listBuildSystemFiles(); + void missingSourceFile(); void mocCppIncluded(); void multiArch(); void newOutputArtifactInDependency(); |