aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/config-ui
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-02-21 11:07:07 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-02-21 11:40:40 +0100
commit500a9716746fb61e80e1a284e271d9374b08265e (patch)
treea68660c1908cddeca3fd705850ffb2ba59a7dc5e /src/app/config-ui
parent956331f697037cdd5547a1569e6e77884b0bc501 (diff)
Add command line parser classes to config-ui and setup-qt.
These tools will soon get more options. Change-Id: I72ea2a180376b2e70c0c5b1119460adb3768e622 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/app/config-ui')
-rw-r--r--src/app/config-ui/commandlineparser.cpp91
-rw-r--r--src/app/config-ui/commandlineparser.h53
-rw-r--r--src/app/config-ui/config-ui.pro4
-rw-r--r--src/app/config-ui/config-ui.qbs2
-rw-r--r--src/app/config-ui/main.cpp24
5 files changed, 161 insertions, 13 deletions
diff --git a/src/app/config-ui/commandlineparser.cpp b/src/app/config-ui/commandlineparser.cpp
new file mode 100644
index 000000000..f094fb3b6
--- /dev/null
+++ b/src/app/config-ui/commandlineparser.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Build Suite.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "commandlineparser.h"
+
+#include <logging/translator.h>
+#include <tools/error.h>
+
+#include <QFileInfo>
+
+using qbs::Internal::Tr;
+
+static QString helpOptionShort() { return QLatin1String("-h"); }
+static QString helpOptionLong() { return QLatin1String("--help"); }
+
+void CommandLineParser::parse(const QStringList &commandLine)
+{
+ m_commandLine = commandLine;
+ Q_ASSERT(!m_commandLine.isEmpty());
+ m_command = QFileInfo(m_commandLine.takeFirst()).fileName();
+ m_helpRequested = false;
+
+ if (m_commandLine.isEmpty())
+ return;
+ const QString &arg = m_commandLine.first();
+ if (arg == helpOptionShort() || arg == helpOptionLong()) {
+ m_commandLine.removeFirst();
+ m_helpRequested = true;
+ }
+
+ if (!m_commandLine.isEmpty())
+ complainAboutExtraArguments();
+}
+
+void CommandLineParser::throwError(const QString &message)
+{
+ qbs::ErrorInfo error(Tr::tr("Syntax error: %1").arg(message));
+ error.append(usageString());
+ throw error;
+}
+
+QString CommandLineParser::usageString() const
+{
+ QString s = Tr::tr("This tool displays qbs settings in a GUI.\n"
+ "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());
+ return s;
+}
+
+void CommandLineParser::assignOptionArgument(const QString &option, QString &argument)
+{
+ if (m_commandLine.isEmpty())
+ throwError(Tr::tr("Option '%1' needs an argument.").arg(option));
+ argument = m_commandLine.takeFirst();
+ if (argument.isEmpty())
+ throwError(Tr::tr("Argument for option '%1' must not be empty.").arg(option));
+}
+
+void CommandLineParser::complainAboutExtraArguments()
+{
+ throwError(Tr::tr("Extraneous command-line arguments '%1'.")
+ .arg(m_commandLine.join(QLatin1String(" "))));
+}
diff --git a/src/app/config-ui/commandlineparser.h b/src/app/config-ui/commandlineparser.h
new file mode 100644
index 000000000..0a5fcab0a
--- /dev/null
+++ b/src/app/config-ui/commandlineparser.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Build Suite.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef QBS_CONFIGUI_COMMANDLINEPARSER_H
+#define QBS_CONFIGUI_COMMANDLINEPARSER_H
+
+#include <QStringList>
+
+class CommandLineParser
+{
+public:
+ void parse(const QStringList &commandLine);
+
+ bool helpRequested() const { return m_helpRequested; }
+
+ QString usageString() const;
+
+private:
+ void throwError(const QString &message);
+ void assignOptionArgument(const QString &option, QString &argument);
+ void complainAboutExtraArguments();
+
+ bool m_helpRequested;
+ QStringList m_commandLine;
+ QString m_command;
+};
+
+#endif // Include guard
diff --git a/src/app/config-ui/config-ui.pro b/src/app/config-ui/config-ui.pro
index 3581ef42a..601b625e4 100644
--- a/src/app/config-ui/config-ui.pro
+++ b/src/app/config-ui/config-ui.pro
@@ -6,6 +6,6 @@ greaterThan(QT_MAJOR_VERSION, 4):QT += widgets
TARGET = qbs-config-ui
-HEADERS += settingsmodel.h mainwindow.h
-SOURCES += settingsmodel.cpp mainwindow.cpp main.cpp
+HEADERS += commandlineparser.h settingsmodel.h mainwindow.h
+SOURCES += commandlineparser.cpp settingsmodel.cpp mainwindow.cpp main.cpp
FORMS += mainwindow.ui
diff --git a/src/app/config-ui/config-ui.qbs b/src/app/config-ui/config-ui.qbs
index b8856d795..c50c93a9f 100644
--- a/src/app/config-ui/config-ui.qbs
+++ b/src/app/config-ui/config-ui.qbs
@@ -6,6 +6,8 @@ QbsApp {
name: "qbs-config-ui"
consoleApplication: false
files: [
+ "commandlineparser.cpp",
+ "commandlineparser.h",
"main.cpp",
"mainwindow.cpp",
"mainwindow.h",
diff --git a/src/app/config-ui/main.cpp b/src/app/config-ui/main.cpp
index b11042b72..6515ec227 100644
--- a/src/app/config-ui/main.cpp
+++ b/src/app/config-ui/main.cpp
@@ -28,29 +28,31 @@
****************************************************************************/
#include "mainwindow.h"
-#include "../shared/logging/consolelogger.h"
-#include "../shared/qbssettings.h"
+#include "commandlineparser.h"
#include <logging/translator.h>
+#include <tools/error.h>
#include <QApplication>
#include <cstdlib>
+#include <iostream>
using qbs::Internal::Tr;
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
- SettingsPtr settings = qbsSettings();
- ConsoleLogger::instance(settings.data());
- const QStringList args = app.arguments().mid(1);
- if (args.count() == 1 &&
- (args.first() == QLatin1String("--help") || args.first() == QLatin1String("-h"))) {
- qbsInfo() << Tr::tr("This tool displays qbs settings in a GUI.\n"
- "If you have more than a few settings, this might be preferable to "
- "plain \"qbs config\", as it presents a hierarchical view.");
- return EXIT_SUCCESS;
+ CommandLineParser clParser;
+ try {
+ clParser.parse(app.arguments());
+ if (clParser.helpRequested()) {
+ std::cout << qPrintable(clParser.usageString());
+ return EXIT_SUCCESS;
+ }
+ } catch (const qbs::ErrorInfo &error) {
+ std::cerr << qPrintable(error.toString());
+ return EXIT_FAILURE;
}
MainWindow mw;