aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-08-21 10:17:27 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2017-08-21 08:59:21 +0000
commitdda87877ea6351a7b7902bfc2b48d99867a410ab (patch)
tree278589aceb85a9ab35ba933f63adc18ddc3719c3
parent22c93d768b01936a341dea50b85a3a3d7484da72 (diff)
Fix edge case in change tracking
Under certain circumstances, transformers could lose the information about properties requested by their commands. Make sure this doesn't happen anymore. Change-Id: Ib224cd8425760543ae805875024e7886f67825fe Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--src/lib/corelib/buildgraph/rulesapplicator.cpp1
-rw-r--r--src/lib/corelib/buildgraph/transformer.cpp11
-rw-r--r--src/lib/corelib/buildgraph/transformer.h1
-rw-r--r--tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp1
-rw-r--r--tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs21
-rw-r--r--tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs7
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp17
-rw-r--r--tests/auto/blackbox/tst_blackbox.h1
8 files changed, 60 insertions, 0 deletions
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.cpp b/src/lib/corelib/buildgraph/rulesapplicator.cpp
index 51b743527..0df7d204d 100644
--- a/src/lib/corelib/buildgraph/rulesapplicator.cpp
+++ b/src/lib/corelib/buildgraph/rulesapplicator.cpp
@@ -358,6 +358,7 @@ Artifact *RulesApplicator::createOutputArtifact(const QString &filePath, const F
if (m_rule->declaresInputs() && m_rule->requiresInputs)
outputArtifact->clearTimestamp();
m_invalidatedArtifacts += outputArtifact;
+ m_transformer->rescueChangeTrackingData(outputArtifact->transformer);
} else {
QScopedPointer<Artifact> newArtifact(new Artifact);
newArtifact->artifactType = Artifact::Generated;
diff --git a/src/lib/corelib/buildgraph/transformer.cpp b/src/lib/corelib/buildgraph/transformer.cpp
index 0e5b4a084..b6e02e708 100644
--- a/src/lib/corelib/buildgraph/transformer.cpp
+++ b/src/lib/corelib/buildgraph/transformer.cpp
@@ -260,6 +260,17 @@ void Transformer::createCommands(ScriptEngine *engine, const ScriptFunctionConst
}
}
+void Transformer::rescueChangeTrackingData(const TransformerConstPtr &other)
+{
+ if (!other)
+ return;
+ propertiesRequestedInPrepareScript = other->propertiesRequestedInPrepareScript;
+ propertiesRequestedInCommands = other->propertiesRequestedInCommands;
+ propertiesRequestedFromArtifactInPrepareScript
+ = other->propertiesRequestedFromArtifactInPrepareScript;
+ propertiesRequestedFromArtifactInCommands = other->propertiesRequestedFromArtifactInCommands;
+}
+
void Transformer::load(PersistentPool &pool)
{
pool.load(rule);
diff --git a/src/lib/corelib/buildgraph/transformer.h b/src/lib/corelib/buildgraph/transformer.h
index e4ffcb83b..b83321bda 100644
--- a/src/lib/corelib/buildgraph/transformer.h
+++ b/src/lib/corelib/buildgraph/transformer.h
@@ -82,6 +82,7 @@ public:
void setupExplicitlyDependsOn(QScriptValue targetScriptValue);
void createCommands(ScriptEngine *engine, const ScriptFunctionConstPtr &script,
const QScriptValueList &args);
+ void rescueChangeTrackingData(const TransformerConstPtr &other);
private:
Transformer();
diff --git a/tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp b/tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs b/tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs
new file mode 100644
index 000000000..03fdf7a6b
--- /dev/null
+++ b/tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs
@@ -0,0 +1,21 @@
+import qbs
+
+Module {
+ property bool p
+
+ Rule {
+ multiplex: true
+ Artifact {
+ filePath: "dummy"
+ fileTags: ["out"]
+ }
+ prepare: {
+ var cmd = new JavaScriptCommand();
+ cmd.description = "creating dummy";
+ cmd.sourceCode = function() {
+ console.info("m.p: " + product.m.p);
+ };
+ return [cmd];
+ }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs b/tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs
new file mode 100644
index 000000000..2eafcc01d
--- /dev/null
+++ b/tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs
@@ -0,0 +1,7 @@
+import qbs
+
+CppApplication {
+ type: base.concat(["out"])
+ Depends { name: "m" }
+ files: ["main.cpp"]
+}
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index f26f33d53..3e6fe72b9 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -3258,6 +3258,23 @@ void TestBlackbox::requireDeprecated()
m_qbsStderr.constData());
}
+void TestBlackbox::rescueTransformerData()
+{
+ QDir::setCurrent(testDataDir + "/rescue-transformer-data");
+ QCOMPARE(runQbs(), 0);
+ QVERIFY2(m_qbsStdout.contains("compiling main.cpp") && m_qbsStdout.contains("m.p: undefined"),
+ m_qbsStdout.constData());
+ WAIT_FOR_NEW_TIMESTAMP();
+ touch("main.cpp");
+ QCOMPARE(runQbs(), 0);
+ QVERIFY2(m_qbsStdout.contains("compiling main.cpp") && !m_qbsStdout.contains("m.p: "),
+ m_qbsStdout.constData());
+ QCOMPARE(runQbs(QbsRunParameters("resolve", QStringList("modules.m.p:true"))), 0);
+ QCOMPARE(runQbs(), 0);
+ QVERIFY2(!m_qbsStdout.contains("compiling main.cpp") && m_qbsStdout.contains("m.p: true"),
+ m_qbsStdout.constData());
+}
+
void TestBlackbox::multipleChanges()
{
QDir::setCurrent(testDataDir + "/multiple-changes");
diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h
index 1426046cf..9b48fa40d 100644
--- a/tests/auto/blackbox/tst_blackbox.h
+++ b/tests/auto/blackbox/tst_blackbox.h
@@ -156,6 +156,7 @@ private slots:
void reproducibleBuild_data();
void require();
void requireDeprecated();
+ void rescueTransformerData();
void responseFiles();
void ruleConditions();
void ruleCycle();