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/qbs | |
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/qbs')
-rw-r--r-- | src/app/qbs/main.cpp | 7 | ||||
-rw-r--r-- | src/app/qbs/parser/command.cpp | 2 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoption.cpp | 29 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoption.h | 20 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoptionpool.cpp | 10 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoptionpool.h | 1 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.cpp | 64 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.h | 3 |
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; |