aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-12-13 13:51:33 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2016-12-14 09:11:17 +0000
commitc8944cf6cdd94a211400eb881425256cfea50b8b (patch)
treecd8ef8e8be1739bc2c33707a75c1b426ca99bb93
parenta6a67b6adb75d7adf9ff9c919e67bc93f650e9a7 (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.cpp16
-rw-r--r--src/lib/corelib/language/language.cpp2
-rw-r--r--src/lib/corelib/language/language.h1
-rw-r--r--src/lib/corelib/language/projectresolver.cpp3
-rw-r--r--src/lib/corelib/language/projectresolver.h2
-rw-r--r--tests/auto/api/testdata/missing-source-file/file1.txt0
-rw-r--r--tests/auto/api/testdata/missing-source-file/file2.txt.missing0
-rw-r--r--tests/auto/api/testdata/missing-source-file/file3.txt0
-rw-r--r--tests/auto/api/testdata/missing-source-file/missing-source-file.qbs9
-rw-r--r--tests/auto/api/tst_api.cpp29
-rw-r--r--tests/auto/api/tst_api.h1
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();