aboutsummaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-02-21 11:36:02 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2014-02-21 12:04:25 +0100
commitbab99ac39ad9de7f1c244006ccfd49852941ac26 (patch)
treeebc89a823692e632cf775d1b01edb4ff307e851a /src/app
parentee7eb1f45529a16a4337c33fac82b205406ca1a0 (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')
-rw-r--r--src/app/config-ui/commandlineparser.cpp9
-rw-r--r--src/app/config-ui/commandlineparser.h2
-rw-r--r--src/app/config-ui/main.cpp2
-rw-r--r--src/app/config-ui/mainwindow.cpp5
-rw-r--r--src/app/config-ui/mainwindow.h2
-rw-r--r--src/app/config-ui/settingsmodel.cpp4
-rw-r--r--src/app/config-ui/settingsmodel.h2
-rw-r--r--src/app/config/configcommandlineparser.cpp54
-rw-r--r--src/app/config/configcommandlineparser.h4
-rw-r--r--src/app/config/configmain.cpp9
-rw-r--r--src/app/qbs-qmltypes/main.cpp4
-rw-r--r--src/app/qbs-setup-qt/commandlineparser.cpp12
-rw-r--r--src/app/qbs-setup-qt/commandlineparser.h5
-rw-r--r--src/app/qbs-setup-qt/main.cpp2
-rw-r--r--src/app/qbs-setup-toolchains/commandlineparser.cpp34
-rw-r--r--src/app/qbs-setup-toolchains/commandlineparser.h2
-rw-r--r--src/app/qbs-setup-toolchains/main.cpp3
-rw-r--r--src/app/qbs/main.cpp7
-rw-r--r--src/app/qbs/parser/command.cpp2
-rw-r--r--src/app/qbs/parser/commandlineoption.cpp29
-rw-r--r--src/app/qbs/parser/commandlineoption.h20
-rw-r--r--src/app/qbs/parser/commandlineoptionpool.cpp10
-rw-r--r--src/app/qbs/parser/commandlineoptionpool.h1
-rw-r--r--src/app/qbs/parser/commandlineparser.cpp64
-rw-r--r--src/app/qbs/parser/commandlineparser.h3
-rw-r--r--src/app/shared/logging/consolelogger.cpp7
-rw-r--r--src/app/shared/logging/consolelogger.h1
-rw-r--r--src/app/shared/qbssettings.h4
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)