From 7ef3e58cfd543280c3214f559ca50c545593ff83 Mon Sep 17 00:00:00 2001
From: EndrII <EndrIIMail@gmail.com>
Date: Wed, 28 Jul 2021 12:39:25 +0300
Subject: [PATCH] ref #421 added new help page

---
 CQtDeployer/main.cpp    |   7 +-
 Deploy/configparser.cpp |   9 +-
 Deploy/deploycore.cpp   | 413 ++++++++++++++++++----------------------
 Deploy/deploycore.h     |   3 +-
 Deploy/filemanager.cpp  |   3 +
 QuasarAppLib            |   2 +-
 6 files changed, 197 insertions(+), 240 deletions(-)

diff --git a/CQtDeployer/main.cpp b/CQtDeployer/main.cpp
index fbbb40b..560f014 100644
--- a/CQtDeployer/main.cpp
+++ b/CQtDeployer/main.cpp
@@ -21,10 +21,9 @@ int main(int argc, char *argv[]) {
     QCoreApplication::setApplicationName("CQtDeployer");
 
 
-    if (!QuasarAppUtils::Params::parseParams(argc, argv)) {
-        QuasarAppUtils::Params::log("Wrong parameters", QuasarAppUtils::Warning);
-        DeployCore::help();
-        exit(0);
+    if (!QuasarAppUtils::Params::parseParams(argc, argv, DeployCore::avilableOptions())) {
+        QuasarAppUtils::Params::log("Wrong parameters. Please use the 'help' of 'h' option for show help page.", QuasarAppUtils::Warning);
+        exit(4);
     }
 
     Deploy deploy;
diff --git a/Deploy/configparser.cpp b/Deploy/configparser.cpp
index acd42b7..4890917 100644
--- a/Deploy/configparser.cpp
+++ b/Deploy/configparser.cpp
@@ -273,9 +273,7 @@ QJsonValue ConfigParser::writeKeyArray(int separatorLvl, const QString &paramete
 
 void ConfigParser::writeKey(const QString& key, QJsonObject& obj,
                             const QString& confFileDir) const {
-    if (QuasarAppUtils::Params::isEndable(key)) {
-        obj[key] = writeKeyArray(0, QuasarAppUtils::Params::getArg(key), confFileDir);
-    }
+    obj[key] = writeKeyArray(0, QuasarAppUtils::Params::getArg(key), confFileDir);
 }
 
 QString ConfigParser::readKeyArray(int separatorLvl, const QJsonArray &array,
@@ -357,9 +355,10 @@ bool ConfigParser::createFromDeploy(const QString& confFile) const {
 
     auto info = QFileInfo(confFile);
 
-    const auto keys = DeployCore::helpKeys();
+    const auto keys = QuasarAppUtils::Params::getUserParamsMap().keys();
     for (const auto &key :keys) {
-        writeKey(key, obj, info.absolutePath());
+        if (key != "confFile")
+            writeKey(key, obj, info.absolutePath());
     }
 
     if (!QFile::exists(info.absolutePath()) &&
diff --git a/Deploy/deploycore.cpp b/Deploy/deploycore.cpp
index 78debba..e0d9af9 100644
--- a/Deploy/deploycore.cpp
+++ b/Deploy/deploycore.cpp
@@ -7,7 +7,6 @@
 
 #include "extracter.h"
 #include "deploycore.h"
-#include "quasarapp.h"
 #include "pathutils.h"
 #include "pluginsparser.h"
 
@@ -185,103 +184,106 @@ RunMode DeployCore::getMode() {
     return RunMode::Info;
 }
 
-void DeployCore::help() {
-
+QuasarAppUtils::OptionsDataList DeployCore::avilableOptions() {
     QString group = "Part 1 Boolean options";
-    QuasarAppUtils::OptionsDataList _help = {};
-    _help.insert(group, {QuasarAppUtils::OptionData{
-                            {"init"},
+    QuasarAppUtils::OptionsDataList help = {};
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"init"}, "",
                             "will initialize cqtdeployer.json file (configuration file).",
                             "'cqtdeployer init' - for initialize base package configuration. "
                             "'cqtdeployer -init multi' - for initialize multi package configuration "
                             "'cqtdeployer -init single' - for initialize singel package configuration"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"clear"}, "",
                             "Deletes deployable files of the previous session."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"force-clear"}, "",
                             "Deletes the destination directory before deployment."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noStrip"}, "",
                             "Skips strip step"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noTranslations"}, "",
                             "Skips the translations files. It doesn't work without qmake."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noOverwrite"}, "",
                             "Prevents replacing existing files."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noCheckRPATH"}, "",
                             "Disables automatic search of paths to qmake in executable files."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noCheckPATH"}, "",
                             "Disables automatic search of paths to qmake in system PATH."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noRecursiveiIgnoreEnv"}, "",
                             "Disables recursive ignore for ignoreEnv option."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
-                            {"v", "version"},
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"v", "version"}, "",
                             "Shows compiled version"
                         }});
-
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"h", "help"}, "",
+                            "Show all help or help of the selected options."
+                            " You can add any another option to a command line for show help about using options"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"qif","-qif"}, "",
                             "Create the QIF installer for deployment programm"
                             " You can specify the path to your own installer template.",
                             "Examples: cqtdeployer -qif path/to/myCustom/qif."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"qifFromSystem"}, "",
                             "force use system binarycreator tool of qif from path or qt"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"zip"}, "",
                             "Create the ZIP arhive for deployment programm"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"deb", "-deb"}, "",
                              "Create the deb package for deployment programm"
                              " You can specify the path to your own debian template.",
                              "cqtdeployer -deb path/to/myCustom/DEBIAN."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"deploySystem"}, "",
                              "Deploys all libraries."
                              " Not recomendet because there may be conflicts with system libraries"
                              " (on snap version you need to turn on permission)"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noQt"}, "",
                             "Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"allowEmptyPackages"}, "",
                             "Allows configure the empty packages."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"getDefaultTemplate"}, "",
                              "Extracts defaults deb or qif templates."
                              " All templates extract into targetDirectory."
                              " For change target directory use the targetDir option.",
                              "cqtdeployer -bin myExecutable getDefaultTemplate qif deb."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"noHashSum"}, "",
                             "This option disable computation of a packages hash sum"
                         }});
 
     group = "Part 2 Deploy options";
 
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-bin"}, "{list,params}",
                             "Files to deploy or folders that contain files to deploy.",
                             "-bin ~/my/project/bin/,~/my/project/bin.exe,~/my/project/runtimeLinking/lib.dll."
@@ -292,73 +294,215 @@ void DeployCore::help() {
                             " Then, CQtDeployer will extract all dependencies of the copied files and search dependencies in system environments and libDir paths."
                         }});
 
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-binPrefix"}, "{prefixPath}",
                             "Sets prefix path for bin option.",
                             "-bin path/MyExecutable is some as -bin MyExecutable -binPrefix path"
                         }});
 
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-confFile"}, "{params}",
                              "The path to the json file with all deployment configurations. Using this file,"
                              " you can add the necessary options, thereby simplifying the command invocation in the console."
                              " However, the parameters in Kansol have a higher priority than in the file."
                              " For more info about this flag see https://github.com/QuasarApp/CQtDeployer/wiki/DeployConfigFileEn"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-qmlDir"}, "{params}",
                             "Sets path to Qml data dir",
                             "-qmlDir ~/my/project/qml"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-qmake"}, "{params}",
                             "Sets path to the qmake executable.",
                             "-qmake ~/Qt/bin/qmake or -qmake ~/Qt/bin/qmake.exe"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-ignore"}, "{list,params}",
                             "Sets the list of libs to ignore.",
                             "-ignore libicudata.so.56,libicudata2.so.56"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-ignoreEnv"}, "{list,params}",
                             "Sets the list of the environment to ignore.",
                             "-ignoreEnv /bad/dir,/my/bad/Dir"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-libDir"}, "{list,params}",
                             "Sets additional paths for extra libs of an app.",
                             "-libDir ~/myLib,~/newLibs"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-extraLibs"}, "{list,params}",
                             "Sets the mask of the library name for forced copying.",
                             "\"-extraLib mySql\" - forces to copy all libraries whose names contain mySql to the project folder."
                              " This option is case-insensitive on Windows and case-sensitive on other platforms."
                              " This option will only search libraries in system environments similar to **deploySystem**."
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-customScript"}, "{scriptCode}",
                             "Insert extra code inTo All run script.",
                             "",
                             " This option will be removed into next release cqtdeployer."
                             " Please use the runScript option"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-recursiveDepth"}, "{params}",
                             "Sets the Depth of recursive search of libs and depth for ignoreEnv option (default 0)"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-targetDir"}, "{params}",
                             "Sets target directory(by default it is the path to the first deployable file)"
                         }});
-    _help.insert(group, {QuasarAppUtils::OptionData{
+    help.insert(group, {QuasarAppUtils::OptionData{
                             {"-runScript"}, "{list,parems}",
                              "forces cqtdeployer swap default run script to new from the arguments of option."
                              " This option copy all content from input file and insert all code into runScript.sh or .bat",
                              "cqtdeployer -runScript \"myTargetMame;path/to/my/myCustomLaunchScript.sh,myTargetSecondMame;path/to/my/mySecondCustomLaunchScript.sh\""
                         }});
 
+    group = "Part 3 Control of packages options";
+
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-targetPackage"}, "{package;tar1,package;tar2}",
+                            "Creates a new package and adds 'tar1 and tar2' to it. "
+                             "If you want configure the package that do not have any targets use the allowEmptyPackages option."
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-qmlOut"}, "{package;path,path}",
+                            "Sets path to qml out directory"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-libOut"}, "{package;path,path}",
+                            "Sets path to libraries out directory"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-trOut"}, "{package;path,path}",
+                            "Sets path to Sets path to translations out directory"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-pluginOut"}, "{package;path,path}",
+                            "Sets path to plugins out directory"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-binOut"}, "{package;path,path}",
+                            "Sets path to binary out directory"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-recOut"}, "{package;path,path}",
+                            "Sets path to recurses out directory"
+                        }});
+
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-extraDataOut"}, "{package;path,path}",
+                            "Sets path to extra data files out directory. By Default it is root dir of the distribution."
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-name"}, "{package;val,val}",
+                            "Sets name for a package."
+                             "If this if you do not specify a package, the value will be assigned to the default package ("")"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-description"}, "{package;val,val}",
+                            "Sets description for a package"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-deployVersion"}, "{package;val,val}",
+                            "Sets version for a package"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-releaseDate"}, "{package;val,val}",
+                            "Sets release date for a package"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-publisher"}, "{package;val,val}",
+                            "Sets publisher for a package"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-homePage"}, "{package;val,val}",
+                            "Sets the home page url for a package"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-prefix"}, "{package;val,val}",
+                            "Sets the prefix for the package relatively a target directory "
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-extraData"}, "{package;val,val}",
+                            "Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure."
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-tr"}, "{package;val,val}",
+                            "Adds qm files into the translations folder."
+                        }});
+
+    group = "Part 4 Control of packages options";
+
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-icon"}, "{target;val,val}",
+                            "Sets path to icon for a targets"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-disableRunScript"}, "{package;val,val}",
+                            "Disables a generation of run script for selected targets"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-disableShortCut"}, "{package;val,val}",
+                            "Disables a generation of shortcut for selected targets"
+                        }});
+
+    group = "Part 5 Plugins Control Options";
+
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-extraPlugin"}, "{package;val1;val2,SingeleVal}",
+                            "Sets an additional path to third-party application plug-in"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-enablePlugins"}, "{package;val1;val2,SingeleVa}",
+                             "Enables additional plugins for distribution."
+                             " By default disabled next plugins: " + PluginsParser::defaultForbidenPlugins().join(',') + " if you want enable"
+                             " it then use '-enablePlugins " + PluginsParser::defaultForbidenPlugins().join(',') + "' option"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-disablePlugins"}, "{package;val1;val2,SingeleVal}",
+                             "Disables plugins for distribution. "
+                             "You can disable any plugin of your Qt build, just see the yourQtFolder/plugins forlder for available plugins."
+                             " Example if you want disable qxcb plugin: -disablePlugins qxcb."
+                             " Note that the name of the plugin is indicated without its extension"
+                        }});
+
+    group = "Part 6 QtInstallFramework options";
+
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-qifStyle"}, "{path/to/style.css}",
+                            "Sets the path to the CSS style file or sets the default style."
+                            " Available styles: quasar, quasarDark"
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-qifBanner"}, "{path/to/banner.png}",
+                            "Sets path to the banner png file."
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-qifLogo"}, "{path/to/logo.png}",
+                            "Sets path to the logo png file."
+                        }});
+    help.insert(group, {QuasarAppUtils::OptionData{
+                            {"-qifOut"}, "{nameOfOutputInstallerFile}",
+                            "Sets name of output qifw installer. Note: on Windows, the exe suffix will be added to the installer automatically."
+                        }});
+
+    return help;
+}
+
+void DeployCore::help() {
+
+    auto localHelp = QuasarAppUtils::Params::getHelpOfInputOptions();
+
+    if(!localHelp.isEmpty()) {
+        QuasarAppUtils::Help::print(localHelp);
+        return;
+    }
+
+    // help extra data;
     QuasarAppUtils::Help::Charters help = {
         {
             "Part 0 General", {
@@ -366,135 +510,6 @@ void DeployCore::help() {
                 {"Usage", "cqtdeployer <-bin [params]> [options]"},
             }
         },
-//        {
-//            "Part 1 Boolean options", {
-//                {"init", "will initialize cqtdeployer.json file (configuration file)."
-//                 " For example: 'cqtdeployer init' - for initialize base package configuration."
-//                 " 'cqtdeployer -init multi' - for initialize multi package configuration"
-//                 " 'cqtdeployer -init single' - for initialize singel package configuration"},
-//                {"help / h", "Shows help"},
-//                {"clear", "Deletes deployable files of the previous session."},
-//                {"force-clear", "Deletes the destination directory before deployment."},
-//                {"noStrip", "Skips strip step"},
-//                {"noTranslations", "Skips the translations files. It doesn't work without qmake."},
-//                {"noOverwrite", "Prevents replacing existing files."},
-//                {"noCheckRPATH", "Disables automatic search of paths to qmake in executable files."},
-//                {"noCheckPATH", "Disables automatic search of paths to qmake in system PATH."},
-//                {"noRecursiveiIgnoreEnv", "Disables recursive ignore for ignoreEnv option."},
-//                {"v / version", "Shows compiled version"},
-//                {"qif", "Create the QIF installer for deployment programm"
-//                        " You can specify the path to your own installer template. Examples: cqtdeployer -qif path/to/myCustom/qif."},
-//                {"qifFromSystem", "force use system binarycreator tool of qif from path or qt"},
-//                {"zip", "Create the ZIP arhive for deployment programm"},
-//                {"deb", "Create the deb package for deployment programm"
-//                        " You can specify the path to your own debian template. Examples: cqtdeployer -deb path/to/myCustom/DEBIAN."},
-//                {"deploySystem", "Deploys all libraries."
-//                 " Not recomendet because there may be conflicts with system libraries"
-//                 " (on snap version you need to turn on permission)"},
-//                {"noQt", "Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework."},
-//                {"allowEmptyPackages", "Allows configure the empty packages."},
-//                {"getDefaultTemplate", "Extracts defaults deb or qif templates."
-//                 " All templates extract into targetDirectory."
-//                 " For change target directory use the targetDir option."
-//                 " Example: cqtdeployer -bin myExecutable getDefaultTemplate qif deb."},
-//                {"noHashSum", "This option disable computation of a packages hash sum"}
-
-
-//            }
-//        },
-//        {
-//            "Part 2 Deploy options", {
-//                {"-bin [list, params]", "Files to deploy or folders that contain files to deploy."
-//                 " For example -bin ~/my/project/bin/,~/my/project/bin.exe,~/my/project/runtimeLinking/lib.dll."
-//                 " For files: These files will be unconditional copied to the destination directory,"
-//                 " regardless of their format or suffix."
-//                 " For folders:"
-//                 " CCQtDeployer will enter these folders and non-recursively copy all executable files to the destination directory."
-//                 " Then, CQtDeployer will extract all dependencies of the copied files and search dependencies in system environments and libDir paths."},
-//                {"-binPrefix [prefixPath]", "Sets prefix path for bin option."
-//                                            " Example: "
-//                                            "" },
-
-//                {"-confFile [params]", "The path to the json file with all deployment configurations. Using this file,"
-//                 " you can add the necessary options, thereby simplifying the command invocation in the console."
-//                 " However, the parameters in Kansol have a higher priority than in the file."
-//                 " For more info about this flag see https://github.com/QuasarApp/CQtDeployer/wiki/DeployConfigFileEn"},
-//                {"-qmlDir [params]", "Qml data dir. For example -qmlDir ~/my/project/qml"},
-//                {"-qmake [params]", "Deployable file or folder. For example -bin ~/my/project/bin/,~/my/project/bin.exe"},
-//                {"-ignore [list,params]", "The list of libs to ignore. For example -ignore libicudata.so.56,libicudata2.so.56"},
-//                {"-ignoreEnv [list,params]", "The list of the environment to ignore. For example -ignoreEnv /bad/dir,/my/bad/Dir"},
-//                {"-libDir [list,params]", "Sets additional paths for extra libs of an app. For example -libDir ~/myLib,~/newLibs"},
-//                {"-extraLibs [list,params]", "Sets the mask of the library name for forced copying."
-//                 "  Example: \"-extraLib mySql\" - forces to copy all libraries whose names contain mySql to the project folder."
-//                 " This option is case-insensitive on Windows and case-sensitive on other platforms."
-//                 " This option will only search libraries in system environments similar to **deploySystem**."},
-//                {"-customScript [scriptCode]", "Insert extra code inTo All run script."},
-//                {"-recursiveDepth [params]", "Sets the Depth of recursive search of libs and depth for ignoreEnv option (default 0)"},
-//                {"-targetDir [params]", "Sets target directory(by default it is the path to the first deployable file)"},
-//                {"-runScript [list,parems]", "forces cqtdeployer swap default run script to new from the arguments of option."
-//                 " This option copy all content from input file and insert all code into runScript.sh or .bat"
-//                 " Example of use: cqtdeployer -runScript \"myTargetMame;path/to/my/myCustomLaunchScript.sh,myTargetSecondMame;path/to/my/mySecondCustomLaunchScript.sh\""},
-//                {"-verbose [0-3]", "Shows debug log"},
-
-//            }
-//        },
-        {
-            "Part 3 Control of packages options", {
-                {"-targetPackage [package;tar1,package;tar2]", "Creates a new package and adds 'tar1 and tar2' to it."
-                 "If you want configure the package that do not have any targets use the allowEmptyPackages option."},
-                {"-qmlOut [package;path,path]", "Sets path to qml out directory"},
-                {"-libOut [package;path,path]", "Sets path to libraries out directory"},
-                {"-trOut [package;path,path]", "Sets path to translations out directory"},
-                {"-pluginOut [package;path,path]", "Sets path to plugins out directory"},
-                {"-binOut [package;path,path]", "Sets path to binary out directory"},
-                {"-recOut [package;path,path]", "Sets path to recurses out directory"},
-                {"-extraDataOut [package;path,path]", "Sets path to extra data files out directory. By Default it is root dir of the distribution."},
-                {"-name [package;val,val]", "Sets name for a package. "
-                 "If this if you do not specify a package, the value will be assigned to the default package ("")"},
-                {"-description [package;val,val]", "Sets description for a package"},
-                {"-deployVersion [package;val,val]", "Sets version for a package"},
-                {"-releaseDate [package;val,val]", "Sets release date for a package"},
-                {"-publisher [package;val,val]", "Sets publisher for a package"},
-                {"-homePage [package;val,val]", "Sets the home page url for a package"},
-                {"-prefix [package;val,val]", "Sets the prefix for the package relatively a target directory "},
-                {"-extraData [package;val,val]", "Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure."},
-                {"-tr [package;val,val]", "Adds qm files into the translations folder."},
-
-
-            }
-        },
-
-        {
-            "Part 4 Control of packages options", {
-                {"-icon [target;val,val]", "Sets path to icon for a targets"},
-                {"-disableRunScript [target;val,val]", "Disables a generation of run script for selected targets"},
-                {"-disableShortCut [target;val,val]", "Disables a generation of shortcut for selected targets"}
-
-            }
-        },
-
-        {
-            "Part 5 Plugins Control Options", {
-                {"-extraPlugin [package;val1;val2,SingeleVal]", "Sets an additional path to third-party application plug-in"},
-                {"-enablePlugins [package;val1;val2,SingeleVal", "Enables additional plugins for distribution."
-                 " By default disabled next plugins: " + PluginsParser::defaultForbidenPlugins().join(',') + " if you want enable"
-                 " it then use '-enablePlugins " + PluginsParser::defaultForbidenPlugins().join(',') + "' option"},
-                {"-disablePlugins [package;val1;val2,SingeleVal]", "Disables plugins for distribution. "
-                 "You can disable any plugin of your Qt build, just see the yourQtFolder/plugins forlder for available plugins."
-                 " Example if you want disable qxcb plugin: -disablePlugins qxcb."
-                 " Note that the name of the plugin is indicated without its extension"},
-
-            }
-        },
-        {
-            "Part 6 QtInstallFramework options", {
-                {"-qifStyle [path/to/style.css]", "Sets the path to the CSS style file or sets the default style."
-                 " Available styles: quasar, quasarDark"},
-                {"-qifBanner [path/to/banner.png]", "Sets path to the banner png file."},
-                {"-qifLogo [path/to/logo.png]", "Sets path to the logo png file."},
-                {"-qifOut [nameOfOutputInstallerFile", "Sets name of output qifw installer. Note: on Windows, the exe suffix will be added to the installer automatically."},
-            }
-        },
         {
             "Support", {
                 {"Support for you", "If you have any questions or problems with cqtdeployer you can write to us about the problem on the GitHub page: https://github.com/QuasarApp/CQtDeployer/issues"},
@@ -503,73 +518,13 @@ void DeployCore::help() {
         }
     };
 
-    help.unite(QuasarAppUtils::Params::getParamsHelp());
+    help += QuasarAppUtils::Params::getHelp();
 
     QuasarAppUtils::Help::print(help);
 
     return;
 }
 
-QStringList DeployCore::helpKeys() {
-    return {
-        "help",
-        "noOverwrite",
-        "bin",
-        "extraData",
-        "qmlDir",
-        "deploySystem",
-        "qmake",
-        "ignore",
-        "ignoreEnv",
-        "clear",
-        "force-clear",
-        "libDir",
-        "extraLibs",
-        "extraPlugin",
-        "recursiveDepth",
-        "targetDir",
-        "targetPackage",
-        "noStrip",
-        "extractPlugins",
-        "noTranslations",
-        "noRecursiveiIgnoreEnv",
-        "qifFromSystem",
-        "qmlOut",
-        "libOut",
-        "trOut",
-        "pluginOut",
-        "binOut",
-        "recOut",
-        "extraDataOut",
-        "version",
-        "verbose",
-        "qif",
-        "noCheckRPATH",
-        "noCheckPATH",
-        "name",
-        "description",
-        "deployVersion",
-        "releaseDate",
-        "icon",
-        "publisher",
-        "customScript",
-        "qifStyle",
-        "qifBanner",
-        "qifLogo",
-        "zip",
-        "noQt",
-        "homePage",
-        "prefix",
-        "deb",
-        "allowEmptyPackages",
-        "runScript",
-        "getDefaultTemplate",
-        "tr",
-        "disableRunScript",
-        "disableShortCut"
-    };
-}
-
 QStringList DeployCore::extractTranslation(const QSet<QString> &libs) {
     QSet<QString> res;
     const size_t qtModulesCount = sizeof(qtModuleEntries) / sizeof(QtModuleEntry);
diff --git a/Deploy/deploycore.h b/Deploy/deploycore.h
index 2628091..f091966 100644
--- a/Deploy/deploycore.h
+++ b/Deploy/deploycore.h
@@ -13,6 +13,7 @@
 #include <QFileInfo>
 #include "deploy_global.h"
 #include "defines.h"
+#include "quasarapp.h"
 
 enum MSVCVersion: int {
     MSVC_Unknown = 0x0,
@@ -249,7 +250,7 @@ public:
     static bool isGui(DeployCore::QtModule module);
     static RunMode getMode();
     static void help();
-    static QStringList helpKeys();
+    static QuasarAppUtils::OptionsDataList avilableOptions();
 
     static QStringList extractTranslation(const QSet<QString> &libs);
     static QString getAppVersion();
diff --git a/Deploy/filemanager.cpp b/Deploy/filemanager.cpp
index 688ec2c..1d5d73b 100644
--- a/Deploy/filemanager.cpp
+++ b/Deploy/filemanager.cpp
@@ -117,6 +117,9 @@ void FileManager::removeFromDeployed(const QString &path) {
 }
 
 void FileManager::saveDeploymendFiles(const QString& targetDir) {
+    if (targetDir.isEmpty())
+        return;
+
     auto settings = QuasarAppUtils::Settings::instance();
     settings->setValue(targetDir, getDeployedFilesStringList());
 }
diff --git a/QuasarAppLib b/QuasarAppLib
index 93839d1..cae8747 160000
--- a/QuasarAppLib
+++ b/QuasarAppLib
@@ -1 +1 @@
-Subproject commit 93839d1dc0faab01d81a57bb0e8ef418e463675c
+Subproject commit cae874728fe3e86e98d18ba6654654ce0717d04e