diff options
| author | Jake Petroules <jake.petroules@petroules.com> | 2015-07-21 00:59:54 -0700 |
|---|---|---|
| committer | Jake Petroules <jake.petroules@petroules.com> | 2015-07-24 08:34:37 +0000 |
| commit | e892568b556ed5587bf4820163c44cb56880c0e4 (patch) | |
| tree | 0ffd857d3838b26e20f1c82ed9e3c146b628d720 | |
| parent | fe0a111c18e96168eb944f6d5bf20d067129b495 (diff) | |
| download | qbs-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.cpp | 15 | ||||
| -rw-r--r-- | src/lib/corelib/buildgraph/buildgraphloader.h | 1 | ||||
| -rw-r--r-- | src/lib/corelib/jsextensions/file.cpp | 13 | ||||
| -rw-r--r-- | src/lib/corelib/language/language.cpp | 5 | ||||
| -rw-r--r-- | src/lib/corelib/language/language.h | 1 | ||||
| -rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 1 | ||||
| -rw-r--r-- | src/lib/corelib/language/scriptengine.cpp | 6 | ||||
| -rw-r--r-- | src/lib/corelib/language/scriptengine.h | 3 | ||||
| -rw-r--r-- | src/lib/corelib/tools/persistence.cpp | 2 |
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) { |
