diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-02-21 11:36:02 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-02-21 12:04:25 +0100 |
commit | bab99ac39ad9de7f1c244006ccfd49852941ac26 (patch) | |
tree | ebc89a823692e632cf775d1b01edb4ff307e851a /src/app | |
parent | ee7eb1f45529a16a4337c33fac82b205406ca1a0 (diff) |
Allow the user to specify a custom place for settings.
Task-number: QBS-509
Change-Id: I4ad32c648121068880d652e3ba39d4eea59dfbc3
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/app')
28 files changed, 207 insertions, 96 deletions
diff --git a/src/app/config-ui/commandlineparser.cpp b/src/app/config-ui/commandlineparser.cpp index f094fb3b6..fb8d41796 100644 --- a/src/app/config-ui/commandlineparser.cpp +++ b/src/app/config-ui/commandlineparser.cpp @@ -37,6 +37,7 @@ using qbs::Internal::Tr; static QString helpOptionShort() { return QLatin1String("-h"); } static QString helpOptionLong() { return QLatin1String("--help"); } +static QString settingsDirOption() { return QLatin1String("--settings-dir"); } void CommandLineParser::parse(const QStringList &commandLine) { @@ -44,6 +45,7 @@ void CommandLineParser::parse(const QStringList &commandLine) Q_ASSERT(!m_commandLine.isEmpty()); m_command = QFileInfo(m_commandLine.takeFirst()).fileName(); m_helpRequested = false; + m_settingsDir.clear(); if (m_commandLine.isEmpty()) return; @@ -51,6 +53,9 @@ void CommandLineParser::parse(const QStringList &commandLine) if (arg == helpOptionShort() || arg == helpOptionLong()) { m_commandLine.removeFirst(); m_helpRequested = true; + } else if (arg == settingsDirOption()) { + m_commandLine.removeFirst(); + assignOptionArgument(settingsDirOption(), m_settingsDir); } if (!m_commandLine.isEmpty()) @@ -70,8 +75,8 @@ QString CommandLineParser::usageString() const "If you have more than a few settings, this might be preferable to " "plain \"qbs config\", as it presents a hierarchical view.\n"); s += Tr::tr("Usage:\n"); - s += Tr::tr(" %1 [%3|%4]\n") - .arg(m_command, helpOptionShort(), helpOptionLong()); + s += Tr::tr(" %1 [%2 <settings directory>] [%3|%4]\n") + .arg(m_command, settingsDirOption(), helpOptionShort(), helpOptionLong()); return s; } diff --git a/src/app/config-ui/commandlineparser.h b/src/app/config-ui/commandlineparser.h index 0a5fcab0a..e8edc8cd5 100644 --- a/src/app/config-ui/commandlineparser.h +++ b/src/app/config-ui/commandlineparser.h @@ -37,6 +37,7 @@ public: void parse(const QStringList &commandLine); bool helpRequested() const { return m_helpRequested; } + QString settingsDir() const { return m_settingsDir; } QString usageString() const; @@ -46,6 +47,7 @@ private: void complainAboutExtraArguments(); bool m_helpRequested; + QString m_settingsDir; QStringList m_commandLine; QString m_command; }; diff --git a/src/app/config-ui/main.cpp b/src/app/config-ui/main.cpp index 6515ec227..940065602 100644 --- a/src/app/config-ui/main.cpp +++ b/src/app/config-ui/main.cpp @@ -55,7 +55,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - MainWindow mw; + MainWindow mw(clParser.settingsDir()); mw.show(); return app.exec(); } diff --git a/src/app/config-ui/mainwindow.cpp b/src/app/config-ui/mainwindow.cpp index fd8651057..6a49f55d7 100644 --- a/src/app/config-ui/mainwindow.cpp +++ b/src/app/config-ui/mainwindow.cpp @@ -40,10 +40,11 @@ #include <QPoint> #include <QString> -MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) +MainWindow::MainWindow(const QString &settingsDir, QWidget *parent) + : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); - m_model = new SettingsModel(this); + m_model = new SettingsModel(settingsDir, this); ui->treeView->setModel(m_model); ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->treeView, SIGNAL(expanded(QModelIndex)), SLOT(adjustColumns())); diff --git a/src/app/config-ui/mainwindow.h b/src/app/config-ui/mainwindow.h index 91ba13e6a..5998a99e6 100644 --- a/src/app/config-ui/mainwindow.h +++ b/src/app/config-ui/mainwindow.h @@ -43,7 +43,7 @@ class MainWindow : public QMainWindow Q_OBJECT public: - explicit MainWindow(QWidget *parent = 0); + explicit MainWindow(const QString &settingsDir, QWidget *parent = 0); ~MainWindow(); private slots: diff --git a/src/app/config-ui/settingsmodel.cpp b/src/app/config-ui/settingsmodel.cpp index faa8a01c2..f983d464e 100644 --- a/src/app/config-ui/settingsmodel.cpp +++ b/src/app/config-ui/settingsmodel.cpp @@ -60,10 +60,10 @@ public: bool dirty; }; -SettingsModel::SettingsModel(QObject *parent) +SettingsModel::SettingsModel(const QString &settingsDir, QObject *parent) : QAbstractItemModel(parent), d(new SettingsModelPrivate) { - d->settings = qbsSettings(); + d->settings = qbsSettings(settingsDir); d->readSettings(); } diff --git a/src/app/config-ui/settingsmodel.h b/src/app/config-ui/settingsmodel.h index 6bfac91bd..4d9333877 100644 --- a/src/app/config-ui/settingsmodel.h +++ b/src/app/config-ui/settingsmodel.h @@ -32,7 +32,7 @@ class SettingsModel : public QAbstractItemModel { Q_OBJECT public: - SettingsModel(QObject *parent = 0); + SettingsModel(const QString &settingsDir, QObject *parent = 0); ~SettingsModel(); int keyColumn() const { return 0; } diff --git a/src/app/config/configcommandlineparser.cpp b/src/app/config/configcommandlineparser.cpp index a25e75d8b..076fb1c90 100644 --- a/src/app/config/configcommandlineparser.cpp +++ b/src/app/config/configcommandlineparser.cpp @@ -40,18 +40,19 @@ void ConfigCommandLineParser::parse(const QStringList &commandLine) { m_command = ConfigCommand(); m_helpRequested = false; + m_settingsDir.clear(); - QStringList args = commandLine; - if (args.isEmpty()) + m_commandLine = commandLine; + if (m_commandLine.isEmpty()) throw ErrorInfo(Tr::tr("No parameters supplied.")); - if (args.count() == 1 && (args.first() == QLatin1String("--help") - || args.first() == QLatin1String("-h"))) { + if (m_commandLine.count() == 1 && (m_commandLine.first() == QLatin1String("--help") + || m_commandLine.first() == QLatin1String("-h"))) { m_helpRequested = true; return; } - while (!args.isEmpty() && args.first().startsWith(QLatin1String("--"))) { - const QString arg = args.takeFirst().mid(2); + while (!m_commandLine.isEmpty() && m_commandLine.first().startsWith(QLatin1String("--"))) { + const QString arg = m_commandLine.takeFirst().mid(2); if (arg == QLatin1String("list")) setCommand(ConfigCommand::CfgList); else if (arg == QLatin1String("unset")) @@ -60,41 +61,43 @@ void ConfigCommandLineParser::parse(const QStringList &commandLine) setCommand(ConfigCommand::CfgExport); else if (arg == QLatin1String("import")) setCommand(ConfigCommand::CfgImport); + else if (arg == QLatin1String("settings-dir")) + assignOptionArgument(arg, m_settingsDir); else throw ErrorInfo(Tr::tr("Unknown option for config command.")); } switch (command().command) { case ConfigCommand::CfgNone: - if (args.isEmpty()) + if (m_commandLine.isEmpty()) throw ErrorInfo(Tr::tr("No parameters supplied.")); - if (args.count() > 2) + if (m_commandLine.count() > 2) throw ErrorInfo(Tr::tr("Too many arguments.")); - m_command.varNames << args.first(); - if (args.count() == 1) { + m_command.varNames << m_commandLine.first(); + if (m_commandLine.count() == 1) { setCommand(ConfigCommand::CfgGet); } else { - m_command.varValue = args.at(1); + m_command.varValue = m_commandLine.at(1); setCommand(ConfigCommand::CfgSet); } break; case ConfigCommand::CfgUnset: - if (args.isEmpty()) + if (m_commandLine.isEmpty()) throw ErrorInfo(Tr::tr("Need name of variable to unset.")); - m_command.varNames = args; + m_command.varNames = m_commandLine; break; case ConfigCommand::CfgExport: - if (args.count() != 1) + if (m_commandLine.count() != 1) throw ErrorInfo(Tr::tr("Need name of file to which to export.")); - m_command.fileName = args.first(); + m_command.fileName = m_commandLine.first(); break; case ConfigCommand::CfgImport: - if (args.count() != 1) + if (m_commandLine.count() != 1) throw ErrorInfo(Tr::tr("Need name of file from which to import.")); - m_command.fileName = args.first(); + m_command.fileName = m_commandLine.first(); break; case ConfigCommand::CfgList: - m_command.varNames = args; + m_command.varNames = m_commandLine; break; default: break; @@ -111,9 +114,9 @@ void ConfigCommandLineParser::setCommand(ConfigCommand::Command command) void ConfigCommandLineParser::printUsage() const { puts("Usage:\n" - " qbs config <options>\n" - " qbs config <key>\n" - " qbs config <key> <value>" + " qbs config [--settings-dir <settings directory] <options>\n" + " qbs config [--settings-dir <settings directory] <key>\n" + " qbs config [--settings-dir <settings directory] <key> <value>" "\n" "Options:\n" " --list [<root> ...] list keys under key <root> or all keys\n" @@ -121,3 +124,12 @@ void ConfigCommandLineParser::printUsage() const " --import <file> import settings from given file\n" " --export <file> export settings to given file\n"); } + +void ConfigCommandLineParser::assignOptionArgument(const QString &option, QString &argument) +{ + if (m_commandLine.isEmpty()) + throw ErrorInfo(Tr::tr("Option '%1' needs an argument.").arg(option)); + argument = m_commandLine.takeFirst(); + if (argument.isEmpty()) + throw ErrorInfo(Tr::tr("Argument for option '%1' must not be empty.").arg(option)); +} diff --git a/src/app/config/configcommandlineparser.h b/src/app/config/configcommandlineparser.h index a4cf7b049..8b3268b33 100644 --- a/src/app/config/configcommandlineparser.h +++ b/src/app/config/configcommandlineparser.h @@ -40,14 +40,18 @@ public: ConfigCommand command() const { return m_command; } + QString settingsDir() const { return m_settingsDir; } bool helpRequested() const { return m_helpRequested; } void printUsage() const; private: + void assignOptionArgument(const QString &option, QString &argument); void setCommand(ConfigCommand::Command command); ConfigCommand m_command; bool m_helpRequested; + QString m_settingsDir; + QStringList m_commandLine; }; #endif // COMMANDLINEPARSER_H diff --git a/src/app/config/configmain.cpp b/src/app/config/configmain.cpp index 32284e4c8..9bf1c9a87 100644 --- a/src/app/config/configmain.cpp +++ b/src/app/config/configmain.cpp @@ -29,7 +29,6 @@ #include "configcommandlineparser.h" #include "configcommandexecutor.h" -#include "../shared/logging/consolelogger.h" #include "../shared/qbssettings.h" #include <logging/translator.h> @@ -38,25 +37,25 @@ #include <QCoreApplication> #include <cstdlib> +#include <iostream> using qbs::Internal::Tr; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); - SettingsPtr settings = qbsSettings(); ConfigCommandLineParser parser; - ConsoleLogger::instance(settings.data()); try { parser.parse(app.arguments().mid(1)); if (parser.helpRequested()) { - qbsInfo() << Tr::tr("This tool manages qbs settings."); + std::cout << qPrintable(Tr::tr("This tool manages qbs settings.")) << std::endl; parser.printUsage(); return EXIT_SUCCESS; } + SettingsPtr settings = qbsSettings(parser.settingsDir()); ConfigCommandExecutor(settings.data()).execute(parser.command()); } catch (const qbs::ErrorInfo &e) { - qbsError() << e.toString(); + std::cerr << qPrintable(e.toString()) << std::endl; parser.printUsage(); return EXIT_FAILURE; } diff --git a/src/app/qbs-qmltypes/main.cpp b/src/app/qbs-qmltypes/main.cpp index 21552b886..c7f71ae46 100644 --- a/src/app/qbs-qmltypes/main.cpp +++ b/src/app/qbs-qmltypes/main.cpp @@ -27,7 +27,6 @@ ** ****************************************************************************/ #include "../shared/logging/consolelogger.h" -#include "../shared/qbssettings.h" #include <language/scriptengine.h> #include <language/loader.h> @@ -46,8 +45,7 @@ int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); - SettingsPtr settings = qbsSettings(); - ConsoleLogger &cl = ConsoleLogger::instance(settings.data()); + ConsoleLogger &cl = ConsoleLogger::instance(); const QStringList args = app.arguments().mid(1); if (args.count() == 1 && (args.first() == QLatin1String("--help") || args.first() == QLatin1String("-h"))) { diff --git a/src/app/qbs-setup-qt/commandlineparser.cpp b/src/app/qbs-setup-qt/commandlineparser.cpp index d5811d1c4..a040b5ca4 100644 --- a/src/app/qbs-setup-qt/commandlineparser.cpp +++ b/src/app/qbs-setup-qt/commandlineparser.cpp @@ -38,6 +38,7 @@ using qbs::Internal::Tr; static QString helpOptionShort() { return QLatin1String("-h"); } static QString helpOptionLong() { return QLatin1String("--help"); } static QString detectOption() { return QLatin1String("--detect"); } +static QString settingsDirOption() { return QLatin1String("--settings-dir"); } void CommandLineParser::parse(const QStringList &commandLine) { @@ -48,6 +49,7 @@ void CommandLineParser::parse(const QStringList &commandLine) m_autoDetectionMode = false; m_qmakePath.clear(); m_profileName.clear(); + m_settingsDir.clear(); if (m_commandLine.isEmpty()) throwError(Tr::tr("No command-line arguments provided.")); @@ -61,6 +63,8 @@ void CommandLineParser::parse(const QStringList &commandLine) m_helpRequested = true; else if (arg == detectOption()) m_autoDetectionMode = true; + else if (arg == settingsDirOption()) + assignOptionArgument(settingsDirOption(), m_settingsDir); } if (m_helpRequested || m_autoDetectionMode) { @@ -93,10 +97,10 @@ QString CommandLineParser::usageString() const { QString s = Tr::tr("This tool creates qbs profiles from Qt versions.\n"); s += Tr::tr("Usage:\n"); - s += Tr::tr(" %1 %3\n") - .arg(m_command, detectOption()); - s += Tr::tr(" %1 <compiler path> <profile name>\n") - .arg(m_command); + s += Tr::tr(" %1 [%2 <settings directory>] %3\n") + .arg(m_command, settingsDirOption(), detectOption()); + s += Tr::tr(" %1 [%3 <settings directory>] <compiler path> <profile name>\n") + .arg(m_command, settingsDirOption()); s += Tr::tr(" %1 %2|%3\n").arg(m_command, helpOptionShort(), helpOptionLong()); s += Tr::tr("The first form tries to auto-detect all known Qt versions, looking them up " "via the PATH environment variable.\n"); diff --git a/src/app/qbs-setup-qt/commandlineparser.h b/src/app/qbs-setup-qt/commandlineparser.h index 21310f432..2b64fe854 100644 --- a/src/app/qbs-setup-qt/commandlineparser.h +++ b/src/app/qbs-setup-qt/commandlineparser.h @@ -26,8 +26,8 @@ ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ****************************************************************************/ -#ifndef QBS_SETUPQT_COMMANDLINEPARSER_H -#define QBS_SETUPQT_COMMANDLINEPARSER_H +#ifndef QBS_SETUPTOOLCHAINS_COMMANDLINEPARSER_H +#define QBS_SETUPTOOLCHAINS_COMMANDLINEPARSER_H #include <QStringList> @@ -41,6 +41,7 @@ public: QString qmakePath() const { return m_qmakePath; } QString profileName() const { return m_profileName; } + QString settingsDir() const { return m_settingsDir; } QString usageString() const; diff --git a/src/app/qbs-setup-qt/main.cpp b/src/app/qbs-setup-qt/main.cpp index bbd80461c..065f142c9 100644 --- a/src/app/qbs-setup-qt/main.cpp +++ b/src/app/qbs-setup-qt/main.cpp @@ -56,7 +56,7 @@ int main(int argc, char *argv[]) return EXIT_SUCCESS; } - SettingsPtr settings = qbsSettings(); + SettingsPtr settings = qbsSettings(clParser.settingsDir()); if (clParser.autoDetectionMode()) { // search all Qt's in path and dump their settings diff --git a/src/app/qbs-setup-toolchains/commandlineparser.cpp b/src/app/qbs-setup-toolchains/commandlineparser.cpp index dd8a1e6c9..b47cdd649 100644 --- a/src/app/qbs-setup-toolchains/commandlineparser.cpp +++ b/src/app/qbs-setup-toolchains/commandlineparser.cpp @@ -39,6 +39,7 @@ static QString helpOptionShort() { return QLatin1String("-h"); } static QString helpOptionLong() { return QLatin1String("--help"); } static QString detectOption() { return QLatin1String("--detect"); } static QString typeOption() { return QLatin1String("--type"); } +static QString settingsDirOption() { return QLatin1String("--settings-dir"); } void CommandLineParser::parse(const QStringList &commandLine) { @@ -50,20 +51,24 @@ void CommandLineParser::parse(const QStringList &commandLine) m_compilerPath.clear(); m_toolchainType.clear(); m_profileName.clear(); + m_settingsDir.clear(); if (m_commandLine.isEmpty()) throwError(Tr::tr("No command-line arguments provided.")); - const QString &arg = m_commandLine.first(); - if (arg == helpOptionShort() || arg == helpOptionLong()) { + while (!m_commandLine.isEmpty()) { + const QString arg = m_commandLine.first(); + if (!arg.startsWith(QLatin1String("--"))) + break; m_commandLine.removeFirst(); - m_helpRequested = true; - } else if (arg == detectOption()) { - m_autoDetectionMode = true; - m_commandLine.removeFirst(); - } else if (arg == typeOption()) { - m_commandLine.removeFirst(); - assignOptionArgument(typeOption(), m_toolchainType); + if (arg == helpOptionShort() || arg == helpOptionLong()) + m_helpRequested = true; + else if (arg == detectOption()) + m_autoDetectionMode = true; + else if (arg == typeOption()) + assignOptionArgument(typeOption(), m_toolchainType); + else if (arg == settingsDirOption()) + assignOptionArgument(settingsDirOption(), m_settingsDir); } if (m_helpRequested || m_autoDetectionMode) { @@ -94,10 +99,13 @@ void CommandLineParser::throwError(const QString &message) QString CommandLineParser::usageString() const { - QString s = Tr::tr("Usage:\n"); - s += Tr::tr(" %1 %2\n").arg(m_command, detectOption()); - s += Tr::tr(" %1 [%2 <toolchain type>] <compiler path> <profile name>\n") - .arg(m_command, typeOption()); + QString s = Tr::tr("This tool creates qbs profiles from toolchains.\n"); + s += Tr::tr("Usage:\n"); + s += Tr::tr(" %1 [%2 <settings directory>] %3\n") + .arg(m_command, settingsDirOption(), detectOption()); + s += Tr::tr(" %1 [%3 <settings directory>] [%2 <toolchain type>] " + "<compiler path> <profile name>\n") + .arg(m_command, typeOption(), settingsDirOption()); s += Tr::tr(" %1 %2|%3\n").arg(m_command, helpOptionShort(), helpOptionLong()); s += Tr::tr("The first form tries to auto-detect all known toolchains, looking them up " "via the PATH environment variable.\n"); diff --git a/src/app/qbs-setup-toolchains/commandlineparser.h b/src/app/qbs-setup-toolchains/commandlineparser.h index 6f6cd4f18..37703bc6d 100644 --- a/src/app/qbs-setup-toolchains/commandlineparser.h +++ b/src/app/qbs-setup-toolchains/commandlineparser.h @@ -42,6 +42,7 @@ public: QString compilerPath() const { return m_compilerPath; } QString toolchainType() const { return m_toolchainType; } QString profileName() const { return m_profileName; } + QString settingsDir() const { return m_settingsDir; } QString usageString() const; @@ -55,6 +56,7 @@ private: QString m_compilerPath; QString m_toolchainType; QString m_profileName; + QString m_settingsDir; QStringList m_commandLine; QString m_command; }; diff --git a/src/app/qbs-setup-toolchains/main.cpp b/src/app/qbs-setup-toolchains/main.cpp index cc41baa7e..fbed0fd14 100644 --- a/src/app/qbs-setup-toolchains/main.cpp +++ b/src/app/qbs-setup-toolchains/main.cpp @@ -50,8 +50,6 @@ int main(int argc, char **argv) { QCoreApplication app(argc, argv); - SettingsPtr settings = qbsSettings(); - CommandLineParser clParser; try { clParser.parse(app.arguments()); @@ -59,6 +57,7 @@ int main(int argc, char **argv) printUsage(clParser.usageString()); return EXIT_SUCCESS; } + SettingsPtr settings = qbsSettings(clParser.settingsDir()); if (clParser.autoDetectionMode()) { probe(settings.data()); return EXIT_SUCCESS; diff --git a/src/app/qbs/main.cpp b/src/app/qbs/main.cpp index 2ccaf3582..3ce3333d7 100644 --- a/src/app/qbs/main.cpp +++ b/src/app/qbs/main.cpp @@ -53,8 +53,7 @@ static bool tryToRunTool(const QStringList &arguments, int &exitCode) int main(int argc, char *argv[]) { - SettingsPtr settings = qbsSettings(); - ConsoleLogger::instance(settings.data()); + ConsoleLogger::instance(); try { Application app(argc, argv); @@ -66,7 +65,7 @@ int main(int argc, char *argv[]) return toolExitCode; CommandLineParser parser; - if (!parser.parseCommandLine(arguments, settings.data())) + if (!parser.parseCommandLine(arguments)) return EXIT_FAILURE; if (parser.command() == HelpCommandType) { @@ -74,6 +73,8 @@ int main(int argc, char *argv[]) return 0; } + SettingsPtr settings = qbsSettings(parser.settingsDir()); + ConsoleLogger::instance().setSettings(settings.data()); CommandLineFrontend clFrontend(parser, settings.data()); app.setCommandLineFrontend(&clFrontend); QTimer::singleShot(0, &clFrontend, SLOT(start())); diff --git a/src/app/qbs/parser/command.cpp b/src/app/qbs/parser/command.cpp index 01d4ad427..8bbbc7da8 100644 --- a/src/app/qbs/parser/command.cpp +++ b/src/app/qbs/parser/command.cpp @@ -77,6 +77,8 @@ QList<CommandLineOption::Type> Command::actualSupportedOptions() const QList<CommandLineOption::Type> options = supportedOptions(); if (!HostOsInfo::isAnyUnixHost()) options.removeOne(CommandLineOption::ShowProgressOptionType); + if (type() != HelpCommandType) + options << CommandLineOption::SettingsDirOptionType; // Valid for almost all commands. return options; } diff --git a/src/app/qbs/parser/commandlineoption.cpp b/src/app/qbs/parser/commandlineoption.cpp index c80a95f71..8b15b5ec0 100644 --- a/src/app/qbs/parser/commandlineoption.cpp +++ b/src/app/qbs/parser/commandlineoption.cpp @@ -472,4 +472,33 @@ QString LogTimeOption::longRepresentation() const return logTimeRepresentation(); } + +SettingsDirOption::SettingsDirOption() +{ +} + +QString SettingsDirOption::description(CommandType command) const +{ + Q_UNUSED(command); + return Tr::tr("%1 <directory>\n" + "\tRead all settings (such as profile information) from the given directory.\n" + "\tThe default value is system-specific (see the QSettings documentation).\n" + "\tIf the directory does not exist, it will be created.\n") + .arg(longRepresentation()); +} + +QString SettingsDirOption::longRepresentation() const +{ + return QLatin1String("--settings-dir"); +} + +void SettingsDirOption::doParse(const QString &representation, QStringList &input) +{ + if (input.isEmpty()) { + throw ErrorInfo(Tr::tr("Invalid use of option '%1: Argument expected.\n" + "Usage: %2").arg(representation, description(command()))); + } + m_settingsDir = input.takeFirst(); +} + } // namespace qbs diff --git a/src/app/qbs/parser/commandlineoption.h b/src/app/qbs/parser/commandlineoption.h index 27ab339ca..bf317728e 100644 --- a/src/app/qbs/parser/commandlineoption.h +++ b/src/app/qbs/parser/commandlineoption.h @@ -52,7 +52,8 @@ public: InstallRootOptionType, RemoveFirstOptionType, NoBuildOptionType, ForceOptionType, ForceTimestampCheckOptionType, - LogTimeOptionType + LogTimeOptionType, + SettingsDirOptionType }; virtual ~CommandLineOption(); @@ -290,6 +291,23 @@ public: QString longRepresentation() const; }; +class SettingsDirOption : public CommandLineOption +{ +public: + SettingsDirOption(); + + QString settingsDir() const { return m_settingsDir; } + + QString description(CommandType command) const; + QString shortRepresentation() const { return QString(); } + QString longRepresentation() const; + +private: + void doParse(const QString &representation, QStringList &input); + + QString m_settingsDir; +}; + } // namespace qbs #endif // QBS_COMMANDLINEOPTION_H diff --git a/src/app/qbs/parser/commandlineoptionpool.cpp b/src/app/qbs/parser/commandlineoptionpool.cpp index 1be482cf4..a6f2c2641 100644 --- a/src/app/qbs/parser/commandlineoptionpool.cpp +++ b/src/app/qbs/parser/commandlineoptionpool.cpp @@ -94,6 +94,11 @@ CommandLineOption *CommandLineOptionPool::getOption(CommandLineOption::Type type case CommandLineOption::LogTimeOptionType: option = new LogTimeOption; break; + case CommandLineOption::SettingsDirOptionType: + option = new SettingsDirOption; + break; + default: + qFatal("Unknown option type %d", type); } } return option; @@ -190,4 +195,9 @@ LogTimeOption *CommandLineOptionPool::logTimeOption() const return static_cast<LogTimeOption *>(getOption(CommandLineOption::LogTimeOptionType)); } +SettingsDirOption *CommandLineOptionPool::settingsDirOption() const +{ + return static_cast<SettingsDirOption *>(getOption(CommandLineOption::SettingsDirOptionType)); +} + } // namespace qbs diff --git a/src/app/qbs/parser/commandlineoptionpool.h b/src/app/qbs/parser/commandlineoptionpool.h index e0117c299..0fc73a6a4 100644 --- a/src/app/qbs/parser/commandlineoptionpool.h +++ b/src/app/qbs/parser/commandlineoptionpool.h @@ -59,6 +59,7 @@ public: ForceOption *forceOption() const; ForceTimeStampCheckOption *forceTimestampCheckOption() const; LogTimeOption *logTimeOption() const; + SettingsDirOption *settingsDirOption() const; private: mutable QHash<CommandLineOption::Type, CommandLineOption *> m_options; diff --git a/src/app/qbs/parser/commandlineparser.cpp b/src/app/qbs/parser/commandlineparser.cpp index 54d3cddf8..ff3bd1616 100644 --- a/src/app/qbs/parser/commandlineparser.cpp +++ b/src/app/qbs/parser/commandlineparser.cpp @@ -73,13 +73,16 @@ public: void setupProgress(); void setupLogLevel(); void setupBuildOptions(); + bool checkForExistingBuildConfiguration(const QList<QVariantMap> &buildConfigs, + const QString &buildVariant, const QString &profile); + bool isSameProfile(const QString &profile1, const QString &profile2) const; bool dryRun() const { return optionPool.dryRunOption()->enabled(); } + QString settingsDir() const { return optionPool.settingsDirOption()->settingsDir(); } QString propertyName(const QString &aCommandLineName) const; QStringList commandLine; - Settings *settings; Command *command; QString projectFilePath; QString projectBuildDirectory; @@ -212,6 +215,11 @@ bool CommandLineParser::showProgress() const return d->showProgress; } +QString CommandLineParser::settingsDir() const +{ + return d->settingsDir(); +} + QString CommandLineParser::commandName() const { return d->command->representation(); @@ -222,18 +230,6 @@ QString CommandLineParser::commandDescription() const return d->command->longDescription(); } -static bool isSameProfile(const QString &profile1, const QString &profile2, - const Settings *settings) -{ - if (profile1 == profile2) - return true; - if (profile1.isEmpty()) - return profile2.isEmpty() || profile2 == settings->defaultProfile(); - if (profile2.isEmpty()) - return profile1 == settings->defaultProfile(); - return false; -} - static QString getBuildVariant(const QVariantMap &buildConfig) { return buildConfig.value(QLatin1String("qbs.buildVariant")).toString(); @@ -244,18 +240,6 @@ static QString getProfile(const QVariantMap &buildConfig) return buildConfig.value(QLatin1String("qbs.profile")).toString(); } -static bool checkForExistingBuildConfiguration(const QList<QVariantMap> &buildConfigs, - const QString &buildVariant, const QString &profile, const Settings *settings) -{ - foreach (const QVariantMap &buildConfig, buildConfigs) { - if (buildVariant == getBuildVariant(buildConfig) - && isSameProfile(profile, getProfile(buildConfig), settings)) { - return true; - } - } - return false; -} - QList<QVariantMap> CommandLineParser::buildConfigurations() const { // first: build variant, second: properties. Empty variant name used for global properties. @@ -298,7 +282,7 @@ QList<QVariantMap> CommandLineParser::buildConfigurations() const const QString buildVariant = item.first; const QString profile = getProfile(properties); - if (checkForExistingBuildConfiguration(buildConfigs, buildVariant, profile, d->settings)) { + if (d->checkForExistingBuildConfiguration(buildConfigs, buildVariant, profile)) { qbsWarning() << Tr::tr("Ignoring redundant request to build for variant '%1' and " "profile '%2'.").arg(buildVariant, profile); continue; @@ -311,12 +295,11 @@ QList<QVariantMap> CommandLineParser::buildConfigurations() const return buildConfigs; } -bool CommandLineParser::parseCommandLine(const QStringList &args, Settings *settings) +bool CommandLineParser::parseCommandLine(const QStringList &args) { delete d; d = new CommandLineParserPrivate; d->commandLine = args; - d->settings = settings; try { d->doParse(); return true; @@ -556,4 +539,29 @@ QString CommandLineParser::CommandLineParserPrivate::propertyName(const QString return QLatin1String("qbs.") + aCommandLineName; } +bool CommandLineParser::CommandLineParserPrivate::checkForExistingBuildConfiguration( + const QList<QVariantMap> &buildConfigs, const QString &buildVariant, const QString &profile) +{ + foreach (const QVariantMap &buildConfig, buildConfigs) { + if (buildVariant == getBuildVariant(buildConfig) + && isSameProfile(profile, getProfile(buildConfig))) { + return true; + } + } + return false; +} + +bool CommandLineParser::CommandLineParserPrivate::isSameProfile(const QString &profile1, + const QString &profile2) const +{ + if (profile1 == profile2) + return true; + Settings settings(settingsDir()); + if (profile1.isEmpty()) + return profile2.isEmpty() || profile2 == settings.defaultProfile(); + if (profile2.isEmpty()) + return profile1 == settings.defaultProfile(); + return false; +} + } // namespace qbs diff --git a/src/app/qbs/parser/commandlineparser.h b/src/app/qbs/parser/commandlineparser.h index bbd2db5f4..4301a2919 100644 --- a/src/app/qbs/parser/commandlineparser.h +++ b/src/app/qbs/parser/commandlineparser.h @@ -47,7 +47,7 @@ public: CommandLineParser(); ~CommandLineParser(); - bool parseCommandLine(const QStringList &args, Settings *settings); + bool parseCommandLine(const QStringList &args); void printHelp() const; CommandType command() const; @@ -67,6 +67,7 @@ public: QStringList products() const; QList<QVariantMap> buildConfigurations() const; bool showProgress() const; + QString settingsDir() const; private: class CommandLineParserPrivate; diff --git a/src/app/shared/logging/consolelogger.cpp b/src/app/shared/logging/consolelogger.cpp index 33707e878..eb5f546d7 100644 --- a/src/app/shared/logging/consolelogger.cpp +++ b/src/app/shared/logging/consolelogger.cpp @@ -94,8 +94,13 @@ ConsoleLogger &ConsoleLogger::instance(qbs::Settings *settings) return logger; } -ConsoleLogger::ConsoleLogger(qbs::Settings *settings) : Logger(&m_logSink) +void ConsoleLogger::setSettings(qbs::Settings *settings) { if (settings) m_logSink.setColoredOutputEnabled(qbs::Preferences(settings).useColoredOutput()); } + +ConsoleLogger::ConsoleLogger(qbs::Settings *settings) : Logger(&m_logSink) +{ + setSettings(settings); +} diff --git a/src/app/shared/logging/consolelogger.h b/src/app/shared/logging/consolelogger.h index 387ddc749..eddeaeb77 100644 --- a/src/app/shared/logging/consolelogger.h +++ b/src/app/shared/logging/consolelogger.h @@ -59,6 +59,7 @@ class ConsoleLogger : public qbs::Internal::Logger public: static ConsoleLogger &instance(qbs::Settings *settings = 0); ConsoleLogSink *logSink() { return &m_logSink; } + void setSettings(qbs::Settings *settings); private: ConsoleLogger(qbs::Settings *settings); diff --git a/src/app/shared/qbssettings.h b/src/app/shared/qbssettings.h index 356399cde..43852758a 100644 --- a/src/app/shared/qbssettings.h +++ b/src/app/shared/qbssettings.h @@ -37,9 +37,9 @@ typedef QSharedPointer<qbs::Settings> SettingsPtr; -inline SettingsPtr qbsSettings() +inline SettingsPtr qbsSettings(const QString &baseDir) { - return SettingsPtr(new qbs::Settings(QLatin1String("QtProject"), QLatin1String("qbs"))); + return SettingsPtr(new qbs::Settings(baseDir)); } inline QString settingsValueToRepresentation(const QVariant &value) |