aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/qbs
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/qbs
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/qbs')
-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
8 files changed, 103 insertions, 33 deletions
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;