windeployqt: Add output options for simple lists
authorAndrew Knight <andrew.knight@digia.com>
Mon, 30 Dec 2013 10:58:11 +0000 (12:58 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 6 Jan 2014 15:24:42 +0000 (16:24 +0100)
Some tools, such as MSBuild, can't parse JSON easily. This change adds
a "list" option, which changes the output to list the deployed files, one
per line. The user can view the source, target, or relative target files
by passing -line <source|target|relative> to windeployqt.

Task-number: QTBUG-35328

Change-Id: I8181ea4f230e7e2b146a5019934ae5fbe768bcec
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
src/windeployqt/main.cpp
src/windeployqt/utils.h

index a5e5a92..2aeec1f 100644 (file)
@@ -184,7 +184,7 @@ int optWebKit2 = 0;
 struct Options {
     Options() : plugins(true), libraries(true), quickImports(true), translations(true), systemD3dCompiler(true)
               , platform(Windows), additionalLibraries(0), disabledLibraries(0)
-              , updateFileFlags(0), json(0) {}
+              , updateFileFlags(0), json(0), list(ListNone) {}
 
     bool plugins;
     bool libraries;
@@ -200,6 +200,7 @@ struct Options {
     QString libraryDirectory;
     QString binary;
     JsonOutput *json;
+    ListOption list;
 };
 
 // Return binary from folder
@@ -283,6 +284,16 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse
                                   QStringLiteral("Print to stdout in JSON format."));
     parser->addOption(jsonOption);
 
+    QCommandLineOption listOption(QStringLiteral("list"),
+                                  QLatin1String("Print only the names of the files copied.\n"
+                                                "Available options:\n"
+                                                "  source:   absolute path of the source files\n"
+                                                "  target:   absolute path of the target files\n"
+                                                "  relative: paths of the target files, relative\n"
+                                                "            to the target directory"),
+                                  QStringLiteral("option"));
+    parser->addOption(listOption);
+
     QCommandLineOption verboseOption(QStringLiteral("verbose"),
                                      QStringLiteral("Verbose level."),
                                      QStringLiteral("level"));
@@ -341,7 +352,21 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse
     if (options->additionalLibraries & QtDesignerComponents)
         options->additionalLibraries |= QtDesignerModule;
 
-    if (parser->isSet(jsonOption)) {
+    if (parser->isSet(listOption)) {
+        const QString value = parser->value(listOption);
+        if (value == QStringLiteral("source")) {
+            options->list = ListSource;
+        } else if (value == QStringLiteral("target")) {
+            options->list = ListTarget;
+        } else if (value == QStringLiteral("relative")) {
+            options->list = ListRelative;
+        } else {
+            *errorMessage = QStringLiteral("Please specify a valid option for -list (source, target, relative).");
+            return CommandLineParseError;
+        }
+    }
+
+    if (parser->isSet(jsonOption) || options->list) {
         optVerboseLevel = 0;
         options->json = new JsonOutput;
     } else {
@@ -998,7 +1023,10 @@ int main(int argc, char **argv)
     }
 
     if (options.json) {
-        std::fputs(options.json->toJson().constData(), stdout);
+        if (options.list)
+            std::fputs(options.json->toList(options.list, options.directory).constData(), stdout);
+        else
+            std::fputs(options.json->toJson().constData(), stdout);
         delete options.json;
         options.json = 0;
     }
index 4519e9d..56d6dbd 100644 (file)
@@ -72,6 +72,13 @@ enum Platform {
     UnknownPlatform
 };
 
+enum ListOption {
+    ListNone = 0,
+    ListSource,
+    ListTarget,
+    ListRelative
+};
+
 // Container class for JSON output
 class JsonOutput
 {
@@ -89,6 +96,29 @@ public:
         document.insert(QStringLiteral("files"), m_files);
         return QJsonDocument(document).toJson();
     }
+    QByteArray toList(ListOption option, const QDir &base) const
+    {
+        QByteArray list;
+        foreach (const QJsonValue &file, m_files) {
+            const QString source = file.toObject().value(QStringLiteral("source")).toString();
+            const QString fileName = QFileInfo(source).fileName();
+            const QString target = file.toObject().value(QStringLiteral("target")).toString() + QDir::separator() + fileName;
+            switch (option) {
+            case ListNone:
+                break;
+            case ListSource:
+                list += source.toUtf8() + '\n';
+                break;
+            case ListTarget:
+                list += target.toUtf8() + '\n';
+                break;
+            case ListRelative:
+                list += QDir::toNativeSeparators(base.relativeFilePath(target)).toUtf8() + '\n';
+                break;
+            }
+        }
+        return list;
+    }
 private:
     QJsonArray m_files;
 };