diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-08-22 14:10:26 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-08-22 14:11:11 +0000 |
commit | b44df152e922cead8510ccc6f94e0c35db284012 (patch) | |
tree | c1bb63af7d4941cbaa800521badc11e8993b0a38 | |
parent | da4fd1c19544f15a46cb531d9a7041d94fa1d893 (diff) |
API: Take rescuable artifact data into account for project data
Otherwise, information about generated artifacts will temporarily
disappear when product build data has been invalidated after project re-
resolving, which is annoying for IDE users.
Change-Id: Idea2d03fba5a823256e95ce554a2f2f413e3d977
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
9 files changed, 79 insertions, 0 deletions
diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp index 13c002f72..e3d4ba5a9 100644 --- a/src/lib/corelib/api/project.cpp +++ b/src/lib/corelib/api/project.cpp @@ -53,6 +53,7 @@ #include <buildgraph/transformer.h> #include <language/language.h> #include <language/projectresolver.h> +#include <language/propertymapinternal.h> #include <logging/logger.h> #include <logging/translator.h> #include <tools/cleanoptions.h> @@ -771,6 +772,19 @@ void ProjectPrivate::retrieveProjectData(ProjectData &projectData, setupInstallData(ta, resolvedProduct); product.d->generatedArtifacts << ta; } + for (auto it = resolvedProduct->buildData->rescuableArtifactData.constBegin(); + it != resolvedProduct->buildData->rescuableArtifactData.constEnd(); ++it) { + ArtifactData ta; + ta.d->filePath = it.key(); + ta.d->fileTags = it.value().fileTags.toStringList(); + ta.d->properties.d->m_map = PropertyMapInternal::create(); + ta.d->properties.d->m_map->setValue(it.value().properties); + ta.d->isGenerated = true; + ta.d->isTargetArtifact = resolvedProduct->fileTags.matches(it.value().fileTags); + ta.d->isValid = true; + setupInstallData(ta, resolvedProduct); + product.d->generatedArtifacts << ta; + } } foreach (const ResolvedProductPtr &resolvedDependentProduct, resolvedProduct->dependencies) product.d->dependencies << resolvedDependentProduct->name; diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp index dd926dcca..9afe50040 100644 --- a/src/lib/corelib/buildgraph/buildgraphloader.cpp +++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp @@ -807,6 +807,8 @@ void BuildGraphLoader::rescueOldBuildData(const ResolvedProductConstPtr &restore if (!newArtifact) { RescuableArtifactData rad; rad.timeStamp = oldArtifact->timestamp(); + rad.fileTags = oldArtifact->fileTags(); + rad.properties = oldArtifact->properties->value(); rad.commands = oldArtifact->transformer->commands; rad.propertiesRequestedInPrepareScript = oldArtifact->transformer->propertiesRequestedInPrepareScript; diff --git a/src/lib/corelib/buildgraph/rescuableartifactdata.cpp b/src/lib/corelib/buildgraph/rescuableartifactdata.cpp index 464ea1135..43530babf 100644 --- a/src/lib/corelib/buildgraph/rescuableartifactdata.cpp +++ b/src/lib/corelib/buildgraph/rescuableartifactdata.cpp @@ -60,6 +60,8 @@ void RescuableArtifactData::load(PersistentPool &pool) propertiesRequestedInCommands = restorePropertySet(pool); propertiesRequestedFromArtifactInPrepareScript = restorePropertyHash(pool); commands = loadCommandList(pool); + pool.stream() >> fileTags; + pool.stream() >> properties; } void RescuableArtifactData::store(PersistentPool &pool) const @@ -78,6 +80,7 @@ void RescuableArtifactData::store(PersistentPool &pool) const storePropertySet(pool, propertiesRequestedInCommands); storePropertyHash(pool, propertiesRequestedFromArtifactInPrepareScript); storeCommandList(commands, pool); + pool.stream() << fileTags << properties; } } // namespace Internal diff --git a/src/lib/corelib/buildgraph/rescuableartifactdata.h b/src/lib/corelib/buildgraph/rescuableartifactdata.h index b04f5d073..0ec617a51 100644 --- a/src/lib/corelib/buildgraph/rescuableartifactdata.h +++ b/src/lib/corelib/buildgraph/rescuableartifactdata.h @@ -33,6 +33,7 @@ #include "forward_decls.h" +#include <language/filetags.h> #include <language/property.h> #include <tools/filetime.h> @@ -72,6 +73,10 @@ public: PropertySet propertiesRequestedInCommands; PropertyHash propertiesRequestedFromArtifactInPrepareScript; + // Only needed for API purposes + FileTags fileTags; + QVariantMap properties; + }; typedef QHash<QString, RescuableArtifactData> AllRescuableArtifactData; diff --git a/tests/auto/api/testdata/project-data-after-product-invalidation/file.cpp b/tests/auto/api/testdata/project-data-after-product-invalidation/file.cpp new file mode 100644 index 000000000..8101b05dc --- /dev/null +++ b/tests/auto/api/testdata/project-data-after-product-invalidation/file.cpp @@ -0,0 +1 @@ +void f() { } diff --git a/tests/auto/api/testdata/project-data-after-product-invalidation/main.cpp b/tests/auto/api/testdata/project-data-after-product-invalidation/main.cpp new file mode 100644 index 000000000..237c8ce18 --- /dev/null +++ b/tests/auto/api/testdata/project-data-after-product-invalidation/main.cpp @@ -0,0 +1 @@ +int main() {} diff --git a/tests/auto/api/testdata/project-data-after-product-invalidation/project-data-after-product-invalidation.qbs b/tests/auto/api/testdata/project-data-after-product-invalidation/project-data-after-product-invalidation.qbs new file mode 100644 index 000000000..030db6bc2 --- /dev/null +++ b/tests/auto/api/testdata/project-data-after-product-invalidation/project-data-after-product-invalidation.qbs @@ -0,0 +1,8 @@ +import qbs + +CppApplication { + files: [ + "file.cpp", + "main.cpp", + ] +} diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 285da5357..9607b4dfd 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -1544,6 +1544,50 @@ void TestApi::objC() VERIFY_NO_ERROR(errorInfo); } +void TestApi::projectDataAfterProductInvalidation() +{ + qbs::SetupProjectParameters setupParams = defaultSetupParameters("project-data-after-" + "product-invalidation/project-data-after-product-invalidation.qbs"); + QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams, + m_logSink, 0)); + waitForFinished(setupJob.data()); + QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); + qbs::Project project = setupJob->project(); + QVERIFY(project.isValid()); + QCOMPARE(project.projectData().products().count(), 1); + QVERIFY(project.projectData().products().first().generatedArtifacts().isEmpty()); + QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(qbs::BuildOptions())); + waitForFinished(buildJob.data()); + QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString())); + QCOMPARE(project.projectData().products().count(), 1); + const qbs::ProductData productAfterBulding = project.projectData().products().first(); + QVERIFY(!productAfterBulding.generatedArtifacts().isEmpty()); + QFile projectFile(setupParams.projectFilePath()); + WAIT_FOR_NEW_TIMESTAMP(); + QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString())); + QByteArray content = projectFile.readAll(); + QVERIFY(!content.isEmpty()); + content.replace("\"file.cpp", "// \"file.cpp"); + projectFile.resize(0); + projectFile.write(content); + projectFile.flush(); + setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); + waitForFinished(setupJob.data()); + QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); + QVERIFY(!project.isValid()); + project = setupJob->project(); + QVERIFY(project.isValid()); + QCOMPARE(project.projectData().products().count(), 1); + QVERIFY(project.projectData().products().first().generatedArtifacts() + == productAfterBulding.generatedArtifacts()); + buildJob.reset(project.buildAllProducts(qbs::BuildOptions())); + waitForFinished(buildJob.data()); + QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString())); + QCOMPARE(project.projectData().products().count(), 1); + QVERIFY(project.projectData().products().first().generatedArtifacts() + != productAfterBulding.generatedArtifacts()); +} + void TestApi::processResult() { // On Windows, even closed files seem to sometimes block the removal of their parent directories diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index 4661fa0d8..e59c67d3f 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -105,6 +105,7 @@ private slots: void nonexistingProjectPropertyFromCommandLine(); void nonexistingProjectPropertyFromProduct(); void objC(); + void projectDataAfterProductInvalidation(); void processResult(); void processResult_data(); void projectInvalidation(); |