From 8b4a2fbeec302f035274de1b6c262358e97a1f83 Mon Sep 17 00:00:00 2001
From: Andrew Knight <andrew.knight@digia.com>
Date: Sat, 19 Oct 2013 17:26:02 +0300
Subject: [PATCH] Move JSON handling into utils

This allows for every copied file to get added to the JSON output.

Change-Id: I588c173056d359d514e2c1715837b5ce4bf71cb0
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
---
 src/windeployqt/main.cpp  | 40 +++++----------------------------------
 src/windeployqt/utils.cpp |  8 ++++++--
 src/windeployqt/utils.h   | 39 +++++++++++++++++++++++++++++++++-----
 3 files changed, 45 insertions(+), 42 deletions(-)

diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp
index c9dc44618..1b28cd59c 100644
--- a/src/windeployqt/main.cpp
+++ b/src/windeployqt/main.cpp
@@ -152,26 +152,6 @@ static Platform platformFromMkSpec(const QString &xSpec)
 bool optHelp = false;
 int optWebKit2 = 0;
 
-// Container class for JSON output
-class JsonOutput {
-public:
-    void addFile(const QString &source, const QString &target)
-    {
-        QJsonObject object;
-        object.insert(QStringLiteral("source"), QDir::toNativeSeparators(source));
-        object.insert(QStringLiteral("target"), QDir::toNativeSeparators(target));
-        m_files.append(object);
-    }
-    QByteArray toJson() const
-    {
-        QJsonObject document;
-        document.insert(QStringLiteral("files"), m_files);
-        return QJsonDocument(document).toJson();
-    }
-private:
-    QJsonArray m_files;
-};
-
 struct Options {
     Options() : plugins(true), libraries(true), quickImports(true), translations(true)
               , platform(Windows), additionalLibraries(0), disabledLibraries(0)
@@ -764,10 +744,8 @@ static DeployResult deploy(const Options &options,
         const QString targetPath = options.libraryDirectory.isEmpty() ?
             options.directory : options.libraryDirectory;
         foreach (const QString &qtLib, deployedQtLibraries) {
-            if (!updateFile(qtLib, targetPath, options.updateFileFlags, errorMessage))
+            if (!updateFile(qtLib, targetPath, options.updateFileFlags, options.json, errorMessage))
                 return result;
-            if (options.json)
-                options.json->addFile(qtLib, targetPath);
         }
     } // optLibraries
 
@@ -786,10 +764,8 @@ static DeployResult deploy(const Options &options,
                 }
             }
             const QString targetPath = options.directory + slash + targetDirName;
-            if (!updateFile(plugin, targetPath, options.updateFileFlags, errorMessage))
+            if (!updateFile(plugin, targetPath, options.updateFileFlags, options.json, errorMessage))
                 return result;
-            if (options.json)
-                options.json->addFile(plugin, targetPath);
         }
     } // optPlugins
 
@@ -813,10 +789,8 @@ static DeployResult deploy(const Options &options,
                 quick2Imports << QStringLiteral("QtWebKit");
             foreach (const QString &quick2Import, quick2Imports) {
                 const QString sourceFile = quick2ImportPath + slash + quick2Import;
-                if (!updateFile(sourceFile, qmlFileEntryFunction, options.directory, options.updateFileFlags, errorMessage))
+                if (!updateFile(sourceFile, qmlFileEntryFunction, options.directory, options.updateFileFlags, options.json, errorMessage))
                     return result;
-                if (options.json)
-                    options.json->addFile(sourceFile, options.directory);
             }
         } // Quick 2
         if (usesQuick1) {
@@ -826,10 +800,8 @@ static DeployResult deploy(const Options &options,
                 quick1Imports << QStringLiteral("QtWebKit");
             foreach (const QString &quick1Import, quick1Imports) {
                 const QString sourceFile = quick1ImportPath + slash + quick1Import;
-                if (!updateFile(sourceFile, qmlFileEntryFunction, options.directory, options.updateFileFlags, errorMessage))
+                if (!updateFile(sourceFile, qmlFileEntryFunction, options.directory, options.updateFileFlags, options.json, errorMessage))
                     return result;
-                if (options.json)
-                    options.json->addFile(sourceFile, options.directory);
             }
         } // Quick 1
     } // optQuickImports
@@ -851,10 +823,8 @@ static bool deployWebKit2(const QMap<QString, QString> &qmakeVariables,
     const QString webProcess = webProcessBinary(sourceOptions.platform);
     const QString webProcessSource = qmakeVariables.value(QStringLiteral("QT_INSTALL_LIBEXECS")) +
                                      QLatin1Char('/') + webProcess;
-    if (!updateFile(webProcessSource, sourceOptions.directory, sourceOptions.updateFileFlags, errorMessage))
+    if (!updateFile(webProcessSource, sourceOptions.directory, sourceOptions.updateFileFlags, sourceOptions.json, errorMessage))
         return false;
-    if (sourceOptions.json)
-        sourceOptions.json->addFile(webProcessSource, sourceOptions.directory);
     Options options(sourceOptions);
     options.binary = options.directory + QLatin1Char('/') + webProcess;
     options.quickImports = false;
diff --git a/src/windeployqt/utils.cpp b/src/windeployqt/utils.cpp
index 2b045ad45..aa187856e 100644
--- a/src/windeployqt/utils.cpp
+++ b/src/windeployqt/utils.cpp
@@ -476,7 +476,7 @@ QString queryQMake(const QString &variable, QString *errorMessage)
 
 // Update a file or directory.
 bool updateFile(const QString &sourceFileName, const QStringList &nameFilters,
-                const QString &targetDirectory, QString *errorMessage)
+                const QString &targetDirectory, JsonOutput *json, QString *errorMessage)
 {
     const QFileInfo sourceFileInfo(sourceFileName);
     const QString targetFileName = targetDirectory + QLatin1Char('/') + sourceFileInfo.fileName();
@@ -517,7 +517,7 @@ bool updateFile(const QString &sourceFileName, const QStringList &nameFilters,
         QDir dir(sourceFileName);
         const QStringList allEntries = dir.entryList(nameFilters, QDir::Files) + dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
         foreach (const QString &entry, allEntries)
-            if (!updateFile(sourceFileName + QLatin1Char('/') + entry, nameFilters, targetFileName, errorMessage))
+            if (!updateFile(sourceFileName + QLatin1Char('/') + entry, nameFilters, targetFileName, json, errorMessage))
                 return false;
         return true;
     } // Source is directory.
@@ -526,6 +526,8 @@ bool updateFile(const QString &sourceFileName, const QStringList &nameFilters,
         if (targetFileInfo.lastModified() >= sourceFileInfo.lastModified()) {
             if (optVerboseLevel)
                 std::printf("%s is up to date.\n", qPrintable(sourceFileInfo.fileName()));
+            if (json)
+                json->addFile(sourceFileName, targetDirectory);
             return true;
         }
         QFile targetFile(targetFileName);
@@ -545,6 +547,8 @@ bool updateFile(const QString &sourceFileName, const QStringList &nameFilters,
                      file.errorString());
         return false;
     }
+    if (json)
+        json->addFile(sourceFileName, targetDirectory);
     return true;
 }
 
diff --git a/src/windeployqt/utils.h b/src/windeployqt/utils.h
index 8ebf7d6ea..a24dacb3d 100644
--- a/src/windeployqt/utils.h
+++ b/src/windeployqt/utils.h
@@ -47,6 +47,9 @@
 #include <QtCore/QFile>
 #include <QtCore/QDir>
 #include <QtCore/QDateTime>
+#include <QtCore/QJsonArray>
+#include <QtCore/QJsonObject>
+#include <QtCore/QJsonDocument>
 
 #include <cstdio>
 
@@ -69,6 +72,27 @@ enum Platform {
     UnknownPlatform
 };
 
+// Container class for JSON output
+class JsonOutput
+{
+public:
+    void addFile(const QString &source, const QString &target)
+    {
+        QJsonObject object;
+        object.insert(QStringLiteral("source"), QDir::toNativeSeparators(source));
+        object.insert(QStringLiteral("target"), QDir::toNativeSeparators(target));
+        m_files.append(object);
+    }
+    QByteArray toJson() const
+    {
+        QJsonObject document;
+        document.insert(QStringLiteral("files"), m_files);
+        return QJsonDocument(document).toJson();
+    }
+private:
+    QJsonArray m_files;
+};
+
 #ifdef Q_OS_WIN
 QString normalizeFileName(const QString &name);
 QString winErrorMessage(unsigned long error);
@@ -85,7 +109,7 @@ QString queryQMake(const QString &variable, QString *errorMessage);
 QStringList findDependentLibs(const QString &binary, QString *errorMessage);
 
 bool updateFile(const QString &sourceFileName, const QStringList &nameFilters,
-                const QString &targetDirectory, QString *errorMessage);
+                const QString &targetDirectory, JsonOutput *json, QString *errorMessage);
 bool runProcess(const QString &binary, const QStringList &args,
                 const QString &workingDirectory = QString(),
                 unsigned long *exitCode = 0, QByteArray *stdOut = 0, QByteArray *stdErr = 0,
@@ -131,6 +155,7 @@ bool updateFile(const QString &sourceFileName,
                 DirectoryFileEntryFunction directoryFileEntryFunction,
                 const QString &targetDirectory,
                 unsigned flags,
+                JsonOutput *json,
                 QString *errorMessage)
 {
     const QFileInfo sourceFileInfo(sourceFileName);
@@ -155,7 +180,7 @@ bool updateFile(const QString &sourceFileName,
         }
 
         // Update the linked-to file
-        if (!updateFile(sourcePath, directoryFileEntryFunction, targetDirectory, flags, errorMessage))
+        if (!updateFile(sourcePath, directoryFileEntryFunction, targetDirectory, flags, json, errorMessage))
             return false;
 
         if (targetFileInfo.exists()) {
@@ -199,7 +224,7 @@ bool updateFile(const QString &sourceFileName,
 
         const QStringList allEntries = directoryFileEntryFunction(dir) + dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
         foreach (const QString &entry, allEntries)
-            if (!updateFile(sourceFileName + QLatin1Char('/') + entry, directoryFileEntryFunction, targetFileName, flags, errorMessage))
+            if (!updateFile(sourceFileName + QLatin1Char('/') + entry, directoryFileEntryFunction, targetFileName, flags, json, errorMessage))
                 return false;
         return true;
     } // Source is directory.
@@ -209,6 +234,8 @@ bool updateFile(const QString &sourceFileName,
             && targetFileInfo.lastModified() >= sourceFileInfo.lastModified()) {
             if (optVerboseLevel)
                 std::printf("%s is up to date.\n", qPrintable(sourceFileInfo.fileName()));
+            if (json)
+                json->addFile(sourceFileName, targetDirectory);
             return true;
         }
         QFile targetFile(targetFileName);
@@ -228,6 +255,8 @@ bool updateFile(const QString &sourceFileName,
                      file.errorString());
         return false;
     }
+    if (json)
+        json->addFile(sourceFileName, targetDirectory);
     return true;
 }
 
@@ -242,9 +271,9 @@ private:
 };
 
 // Convenience for all files.
-inline bool updateFile(const QString &sourceFileName, const QString &targetDirectory, unsigned flags, QString *errorMessage)
+inline bool updateFile(const QString &sourceFileName, const QString &targetDirectory, unsigned flags, JsonOutput *json, QString *errorMessage)
 {
-    return updateFile(sourceFileName, NameFilterFileEntryFunction(QStringList()), targetDirectory, flags, errorMessage);
+    return updateFile(sourceFileName, NameFilterFileEntryFunction(QStringList()), targetDirectory, flags, json, errorMessage);
 }
 
 QT_END_NAMESPACE
-- 
GitLab