aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/incredibuild/commandbuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/incredibuild/commandbuilder.cpp')
-rw-r--r--src/plugins/incredibuild/commandbuilder.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/plugins/incredibuild/commandbuilder.cpp b/src/plugins/incredibuild/commandbuilder.cpp
new file mode 100644
index 0000000000..605d345a0e
--- /dev/null
+++ b/src/plugins/incredibuild/commandbuilder.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "commandbuilder.h"
+
+namespace IncrediBuild {
+namespace Internal {
+
+namespace Constants {
+const QLatin1String CUSTOMCOMMANDBUILDER_COMMAND("IncrediBuild.BuildConsole.CustomCommandBuilder.Command");
+const QLatin1String CUSTOMCOMMANDBUILDER_ARGS("IncrediBuild.BuildConsole.CustomCommandBuilder.Arguments");
+const QLatin1String CUSTOMCOMMANDBUILDER_ARGSSET("IncrediBuild.BuildConsole.CustomCommandBuilder.ArgumentsSet");
+} // namespace Constants
+
+QString CommandBuilder::fullCommandFlag()
+{
+ QString argsLine;
+ for (const QString &a : arguments())
+ argsLine += "\"" + a + "\" ";
+
+ if (!keepJobNum())
+ argsLine = setMultiProcessArg(argsLine);
+
+ QString fullCommand("\"%0\" %1");
+ fullCommand = fullCommand.arg(command(), argsLine);
+
+ return fullCommand;
+}
+
+void CommandBuilder::reset()
+{
+ m_command.clear();
+ m_args.clear();
+ m_argsSet = false;
+}
+
+bool CommandBuilder::fromMap(const QVariantMap &map)
+{
+ m_command = map.value(Constants::CUSTOMCOMMANDBUILDER_COMMAND, QVariant(QString())).toString();
+ m_argsSet = map.value(Constants::CUSTOMCOMMANDBUILDER_ARGSSET, QVariant(false)).toBool();
+ if (m_argsSet)
+ arguments(map.value(Constants::CUSTOMCOMMANDBUILDER_ARGS, QVariant(QString())).toString());
+
+ // Not loading m_keepJobNum as it is managed by the build step.
+ return true;
+}
+
+void CommandBuilder::toMap(QVariantMap *map) const
+{
+ (*map)[Constants::CUSTOMCOMMANDBUILDER_COMMAND] = QVariant(m_command);
+ (*map)[Constants::CUSTOMCOMMANDBUILDER_ARGSSET] = QVariant(m_argsSet);
+ if (m_argsSet)
+ (*map)[Constants::CUSTOMCOMMANDBUILDER_ARGS] = QVariant(m_args);
+
+ // Not saving m_keepJobNum as it is managed by the build step.
+}
+
+// Split args to quoted or spaced parts
+void CommandBuilder::arguments(const QString &argsLine)
+{
+ QStringList args;
+ QString currArg;
+ bool inQuote = false;
+ bool inArg = false;
+ for (int i = 0; i < argsLine.length(); ++i) {
+ QChar c = argsLine[i];
+ if (c.isSpace()) {
+ if (!inArg) // Spaces between arguments
+ continue;
+
+ if (!inQuote) { // Arg termination
+ if (currArg.length() > 0) {
+ args.append(currArg);
+ currArg.clear();
+ }
+ inArg = false;
+ continue;
+ } else { // Space within argument
+ currArg += c;
+ continue;
+ }
+ }
+
+ inArg = true;
+ if (c == '"') {
+ if ((i < (argsLine.length() - 1))
+ && (argsLine[i + 1] == '"')) { // Convert '""' to double-quote within arg
+ currArg += '"';
+ ++i;
+ continue;
+ }
+
+ if (inQuote) { // Arg termination
+ if (currArg.length() > 0) {
+ args.append(currArg);
+ currArg.clear();
+ }
+ inArg = false;
+ inQuote = false;
+ continue;
+ }
+
+ // Arg start
+ inArg = true;
+ inQuote = true;
+ continue;
+ }
+
+ // Simple character
+ inArg = true;
+ currArg += c;
+ }
+
+ if (currArg.length() > 0)
+ args.append(currArg);
+
+ arguments(args);
+}
+
+} // namespace Internal
+} // namespace IncrediBuild