summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@petroules.com>2015-07-21 00:59:54 -0700
committerJake Petroules <jake.petroules@petroules.com>2015-07-24 08:34:37 +0000
commite892568b556ed5587bf4820163c44cb56880c0e4 (patch)
tree0ffd857d3838b26e20f1c82ed9e3c146b628d720
parentfe0a111c18e96168eb944f6d5bf20d067129b495 (diff)
downloadqbs-e892568b556ed5587bf4820163c44cb56880c0e4.tar.gz
Add a File.canonicalFilePath function.
Change-Id: I0759c9c81569d0bc3cc44937b7c4d6cce6af5d29 Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.cpp15
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.h1
-rw-r--r--src/lib/corelib/jsextensions/file.cpp13
-rw-r--r--src/lib/corelib/language/language.cpp5
-rw-r--r--src/lib/corelib/language/language.h1
-rw-r--r--src/lib/corelib/language/projectresolver.cpp1
-rw-r--r--src/lib/corelib/language/scriptengine.cpp6
-rw-r--r--src/lib/corelib/language/scriptengine.h3
-rw-r--r--src/lib/corelib/tools/persistence.cpp2
9 files changed, 45 insertions, 2 deletions
diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp
index 25f7d3666..d3244f4d1 100644
--- a/src/lib/corelib/buildgraph/buildgraphloader.cpp
+++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp
@@ -213,6 +213,7 @@ void BuildGraphLoader::trackProjectChanges()
// anew.
if (hasBuildSystemFileChanged(buildSystemFiles, restoredProject->lastResolveTime)
|| hasEnvironmentChanged(restoredProject)
+ || hasCanonicalFilePathResultChanged(restoredProject)
|| hasFileExistsResultChanged(restoredProject)
|| hasFileLastModifiedResultChanged(restoredProject)) {
reResolvingNecessary = true;
@@ -345,6 +346,20 @@ bool BuildGraphLoader::hasEnvironmentChanged(const TopLevelProjectConstPtr &rest
return false;
}
+bool BuildGraphLoader::hasCanonicalFilePathResultChanged(const TopLevelProjectConstPtr &restoredProject) const
+{
+ for (auto it = restoredProject->canonicalFilePathResults.constBegin();
+ it != restoredProject->canonicalFilePathResults.constEnd(); ++it) {
+ if (QFileInfo(it.key()).canonicalFilePath() != it.value()) {
+ m_logger.qbsDebug() << "Canonical file path for file '" << it.key()
+ << "' changed, must re-resolve project.";
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool BuildGraphLoader::hasFileExistsResultChanged(const TopLevelProjectConstPtr &restoredProject) const
{
for (QHash<QString, bool>::ConstIterator it = restoredProject->fileExistsResults.constBegin();
diff --git a/src/lib/corelib/buildgraph/buildgraphloader.h b/src/lib/corelib/buildgraph/buildgraphloader.h
index c5dcefa17..77dcd0fa4 100644
--- a/src/lib/corelib/buildgraph/buildgraphloader.h
+++ b/src/lib/corelib/buildgraph/buildgraphloader.h
@@ -74,6 +74,7 @@ private:
void checkBuildGraphCompatibility(const TopLevelProjectConstPtr &project);
void trackProjectChanges();
bool hasEnvironmentChanged(const TopLevelProjectConstPtr &restoredProject) const;
+ bool hasCanonicalFilePathResultChanged(const TopLevelProjectConstPtr &restoredProject) const;
bool hasFileExistsResultChanged(const TopLevelProjectConstPtr &restoredProject) const;
bool hasFileLastModifiedResultChanged(const TopLevelProjectConstPtr &restoredProject) const;
bool hasProductFileChanged(const QList<ResolvedProductPtr> &restoredProducts,
diff --git a/src/lib/corelib/jsextensions/file.cpp b/src/lib/corelib/jsextensions/file.cpp
index 8ebeaecc2..c653a8e4f 100644
--- a/src/lib/corelib/jsextensions/file.cpp
+++ b/src/lib/corelib/jsextensions/file.cpp
@@ -52,6 +52,7 @@ private:
static QScriptValue js_lastModified(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_makePath(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_remove(QScriptContext *context, QScriptEngine *engine);
+ static QScriptValue js_canonicalFilePath(QScriptContext *context, QScriptEngine *engine);
};
@@ -64,6 +65,8 @@ void initializeJsExtensionFile(QScriptValue extensionObject)
fileObj.setProperty(QLatin1String("lastModified"), engine->newFunction(File::js_lastModified));
fileObj.setProperty(QLatin1String("makePath"), engine->newFunction(File::js_makePath));
fileObj.setProperty(QLatin1String("remove"), engine->newFunction(File::js_remove));
+ fileObj.setProperty(QLatin1String("canonicalFilePath"),
+ engine->newFunction(File::js_canonicalFilePath));
extensionObject.setProperty(QLatin1String("File"), fileObj);
}
@@ -144,5 +147,15 @@ QScriptValue File::js_makePath(QScriptContext *context, QScriptEngine *engine)
return QDir::root().mkpath(context->argument(0).toString());
}
+QScriptValue File::js_canonicalFilePath(QScriptContext *context, QScriptEngine *engine)
+{
+ Q_UNUSED(engine);
+ if (Q_UNLIKELY(context->argumentCount() < 1)) {
+ return context->throwError(QScriptContext::SyntaxError,
+ Tr::tr("canonicalFilePath expects 1 argument"));
+ }
+ return QFileInfo(context->argument(0).toString()).canonicalFilePath();
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp
index 9668ae60a..68fcd16c3 100644
--- a/src/lib/corelib/language/language.cpp
+++ b/src/lib/corelib/language/language.cpp
@@ -1010,6 +1010,7 @@ void TopLevelProject::load(PersistentPool &pool)
ResolvedProject::load(pool);
m_id = pool.idLoadString();
pool.stream() >> usedEnvironment;
+ pool.stream() >> canonicalFilePathResults;
pool.stream() >> fileExistsResults;
pool.stream() >> fileLastModifiedResults;
QHash<QString, QString> envHash;
@@ -1028,7 +1029,9 @@ void TopLevelProject::store(PersistentPool &pool) const
{
ResolvedProject::store(pool);
pool.storeString(m_id);
- pool.stream() << usedEnvironment << fileExistsResults
+ pool.stream() << usedEnvironment
+ << canonicalFilePathResults
+ << fileExistsResults
<< fileLastModifiedResults;
QHash<QString, QString> envHash;
foreach (const QString &key, environment.keys())
diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h
index 940fe2bc7..d487db6c6 100644
--- a/src/lib/corelib/language/language.h
+++ b/src/lib/corelib/language/language.h
@@ -463,6 +463,7 @@ public:
QString buildDirectory; // Not saved
QProcessEnvironment environment;
QHash<QString, QString> usedEnvironment; // Environment variables requested by the project while resolving.
+ QHash<QString, QString> canonicalFilePathResults; // Results of calls to "File.canonicalFilePath()."
QHash<QString, bool> fileExistsResults; // Results of calls to "File.exists()".
QHash<QString, FileTime> fileLastModifiedResults; // Results of calls to "File.lastModified()".
QScopedPointer<ProjectBuildData> buildData;
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index 715237c1d..f000df40b 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -200,6 +200,7 @@ void ProjectResolver::resolveTopLevelProject(Item *item, ProjectContext *project
resolveProject(item, projectContext);
project->setBuildConfiguration(m_setupParams.finalBuildConfigurationTree());
project->usedEnvironment = m_engine->usedEnvironment();
+ project->canonicalFilePathResults = m_engine->canonicalFilePathResults();
project->fileExistsResults = m_engine->fileExistsResults();
project->fileLastModifiedResults = m_engine->fileLastModifiedResults();
project->environment = m_engine->environment();
diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp
index c4e663323..fb80c03de 100644
--- a/src/lib/corelib/language/scriptengine.cpp
+++ b/src/lib/corelib/language/scriptengine.cpp
@@ -434,6 +434,12 @@ void ScriptEngine::addEnvironmentVariable(const QString &name, const QString &va
m_usedEnvironment.insert(name, value);
}
+void ScriptEngine::addCanonicalFilePathResult(const QString &filePath,
+ const QString &resultFilePath)
+{
+ m_canonicalFilePathResult.insert(filePath, resultFilePath);
+}
+
void ScriptEngine::addFileExistsResult(const QString &filePath, bool exists)
{
m_fileExistsResult.insert(filePath, exists);
diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h
index f69608d12..b901db2b3 100644
--- a/src/lib/corelib/language/scriptengine.h
+++ b/src/lib/corelib/language/scriptengine.h
@@ -94,8 +94,10 @@ public:
void setEnvironment(const QProcessEnvironment &env);
void addEnvironmentVariable(const QString &name, const QString &value);
QHash<QString, QString> usedEnvironment() const { return m_usedEnvironment; }
+ void addCanonicalFilePathResult(const QString &filePath, const QString &resultFilePath);
void addFileExistsResult(const QString &filePath, bool exists);
void addFileLastModifiedResult(const QString &filePath, FileTime fileTime);
+ QHash<QString, QString> canonicalFilePathResults() const { return m_canonicalFilePathResult; }
QHash<QString, bool> fileExistsResults() const { return m_fileExistsResult; }
QHash<QString, FileTime> fileLastModifiedResults() const { return m_fileLastModifiedResult; }
QSet<QString> imports() const;
@@ -157,6 +159,7 @@ private:
QScriptValue m_emptyFunction;
QProcessEnvironment m_environment;
QHash<QString, QString> m_usedEnvironment;
+ QHash<QString, QString> m_canonicalFilePathResult;
QHash<QString, bool> m_fileExistsResult;
QHash<QString, FileTime> m_fileLastModifiedResult;
QStack<QString> m_currentDirPathStack;
diff --git a/src/lib/corelib/tools/persistence.cpp b/src/lib/corelib/tools/persistence.cpp
index 5d36e4d3a..a2da7ed40 100644
--- a/src/lib/corelib/tools/persistence.cpp
+++ b/src/lib/corelib/tools/persistence.cpp
@@ -41,7 +41,7 @@
namespace qbs {
namespace Internal {
-static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-79";
+static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-80";
PersistentPool::PersistentPool(const Logger &logger) : m_logger(logger)
{