aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-08-22 14:10:26 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2016-08-22 14:11:11 +0000
commitb44df152e922cead8510ccc6f94e0c35db284012 (patch)
treec1bb63af7d4941cbaa800521badc11e8993b0a38
parentda4fd1c19544f15a46cb531d9a7041d94fa1d893 (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>
-rw-r--r--src/lib/corelib/api/project.cpp14
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.cpp2
-rw-r--r--src/lib/corelib/buildgraph/rescuableartifactdata.cpp3
-rw-r--r--src/lib/corelib/buildgraph/rescuableartifactdata.h5
-rw-r--r--tests/auto/api/testdata/project-data-after-product-invalidation/file.cpp1
-rw-r--r--tests/auto/api/testdata/project-data-after-product-invalidation/main.cpp1
-rw-r--r--tests/auto/api/testdata/project-data-after-product-invalidation/project-data-after-product-invalidation.qbs8
-rw-r--r--tests/auto/api/tst_api.cpp44
-rw-r--r--tests/auto/api/tst_api.h1
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();