summaryrefslogtreecommitdiffstats
path: root/src/qtattributionsscanner/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qtattributionsscanner/main.cpp')
-rw-r--r--src/qtattributionsscanner/main.cpp145
1 files changed, 72 insertions, 73 deletions
diff --git a/src/qtattributionsscanner/main.cpp b/src/qtattributionsscanner/main.cpp
index 2684a6207..ed3ccaeeb 100644
--- a/src/qtattributionsscanner/main.cpp
+++ b/src/qtattributionsscanner/main.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the tools applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "jsongenerator.h"
#include "logging.h"
@@ -39,55 +14,63 @@
#include <iostream>
+using namespace Qt::Literals::StringLiterals;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
- a.setApplicationName(QStringLiteral("Qt Attributions Scanner"));
- a.setApplicationVersion(QStringLiteral("1.1"));
+ a.setApplicationName(u"Qt Attributions Scanner"_s);
+ a.setApplicationVersion(u"1.3"_s);
QCommandLineParser parser;
parser.setApplicationDescription(tr("Processes attribution files in Qt sources."));
- parser.addPositionalArgument(QStringLiteral("path"),
- tr("Path to a qt_attribution.json/README.chromium file, "
- "or a directory to be scannned recursively."));
+ parser.addPositionalArgument(u"paths"_s,
+ tr("Paths to qt_attribution.json/README.chromium files, "
+ "or directories to be scannned recursively."));
parser.addHelpOption();
parser.addVersionOption();
- QCommandLineOption generatorOption(QStringLiteral("output-format"),
+ QCommandLineOption generatorOption(u"output-format"_s,
tr("Output format (\"qdoc\", \"json\")."),
- QStringLiteral("generator"),
- QStringLiteral("qdoc"));
- QCommandLineOption inputFormatOption(QStringLiteral("input-files"),
- tr("Input files (\"qt_attributions\" scans for qt_attribution.json, "
- "\"chromium_attributions\" for README.Chromium, \"all\" for both)."),
- QStringLiteral("input_format"),
- QStringLiteral("qt_attributions"));
- QCommandLineOption filterOption(QStringLiteral("filter"),
- tr("Filter packages according to <filter> (e.g. QDocModule=qtcore)"),
- QStringLiteral("expression"));
- QCommandLineOption baseDirOption(QStringLiteral("basedir"),
+ u"generator"_s, u"qdoc"_s);
+ QCommandLineOption inputFormatOption(u"input-files"_s,
+ tr("Input files (\"qt_attributions\" scans for "
+ "qt_attribution.json, \"chromium_attributions\" for "
+ "README.Chromium, \"all\" for both)."),
+ u"input_format"_s,
+ u"qt_attributions"_s);
+ QCommandLineOption filterOption(u"filter"_s,
+ tr("Filter packages according to <filter> "
+ "(e.g. QDocModule=qtcore)"),
+ u"expression"_s);
+ QCommandLineOption baseDirOption(u"basedir"_s,
tr("Paths in documentation are made relative to this "
"directory."),
- QStringLiteral("directory"));
- QCommandLineOption outputOption({ QStringLiteral("o"), QStringLiteral("output") },
+ u"directory"_s);
+ QCommandLineOption noCheckPathsOption(
+ u"no-check-paths"_s,
+ tr("Do not check whether referenced file paths exist in basedir."));
+ QCommandLineOption outputOption({ u"o"_s, u"output"_s },
tr("Write generated data to <file>."),
- QStringLiteral("file"));
- QCommandLineOption verboseOption(QStringLiteral("verbose"),
- tr("Verbose output."));
- QCommandLineOption silentOption({ QStringLiteral("s"), QStringLiteral("silent") },
- tr("Minimal output."));
+ u"file"_s);
+ QCommandLineOption verboseOption(u"verbose"_s, tr("Verbose output."));
+ QCommandLineOption silentOption({ u"s"_s, u"silent"_s }, tr("Minimal output."));
parser.addOption(generatorOption);
parser.addOption(inputFormatOption);
parser.addOption(filterOption);
parser.addOption(baseDirOption);
+ parser.addOption(noCheckPathsOption);
parser.addOption(outputOption);
parser.addOption(verboseOption);
parser.addOption(silentOption);
parser.process(a.arguments());
+ using Scanner::Checks, Scanner::Check;
+ Checks checks = Check::All;
+ checks.setFlag(Check::Paths, !parser.isSet(noCheckPathsOption));
+
LogLevel logLevel = NormalLog;
if (parser.isSet(verboseOption) && parser.isSet(silentOption)) {
std::cerr << qPrintable(tr("--verbose and --silent cannot be set simultaneously.")) << std::endl;
@@ -99,18 +82,18 @@ int main(int argc, char *argv[])
else if (parser.isSet(silentOption))
logLevel = SilentLog;
- if (parser.positionalArguments().size() != 1)
+ if (parser.positionalArguments().size() == 0)
parser.showHelp(2);
- const QString path = parser.positionalArguments().constLast();
+ const QStringList paths = parser.positionalArguments();
QString inputFormat = parser.value(inputFormatOption);
Scanner::InputFormats formats;
- if (inputFormat == QLatin1String("qt_attributions"))
+ if (inputFormat == "qt_attributions"_L1)
formats = Scanner::InputFormat::QtAttributions;
- else if (inputFormat == QLatin1String("chromium_attributions"))
+ else if (inputFormat == "chromium_attributions"_L1)
formats = Scanner::InputFormat::ChromiumAttributions;
- else if (inputFormat == QLatin1String("all"))
+ else if (inputFormat == "all"_L1)
formats = Scanner::InputFormat::QtAttributions | Scanner::InputFormat::ChromiumAttributions;
else {
std::cerr << qPrintable(tr("%1 is not a valid input-files argument").arg(inputFormat)) << std::endl << std::endl;
@@ -119,18 +102,28 @@ int main(int argc, char *argv[])
// Parse the attribution files
QList<Package> packages;
- const QFileInfo pathInfo(path);
- if (pathInfo.isDir()) {
- if (logLevel == VerboseLog)
- std::cerr << qPrintable(tr("Recursively scanning %1 for attribution files...").arg(
- QDir::toNativeSeparators(path))) << std::endl;
- packages = Scanner::scanDirectory(path, formats, logLevel);
- } else if (pathInfo.isFile()) {
- packages = Scanner::readFile(path, logLevel);
- } else {
- std::cerr << qPrintable(tr("%1 is not a valid file or directory.").arg(
- QDir::toNativeSeparators(path))) << std::endl << std::endl;
- parser.showHelp(7);
+ for (const QString &path: paths) {
+ const QFileInfo pathInfo(path);
+ if (pathInfo.isDir()) {
+ if (logLevel == VerboseLog)
+ std::cerr << qPrintable(tr("Recursively scanning %1 for attribution files...").arg(
+ QDir::toNativeSeparators(path))) << std::endl;
+ std::optional<QList<Package>> p
+ = Scanner::scanDirectory(path, formats, checks, logLevel);
+ if (!p)
+ return 1;
+ packages.append(*p);
+ } else if (pathInfo.isFile()) {
+ std::optional<QList<Package>> p = Scanner::readFile(path, checks, logLevel);
+ if (!p)
+ return 1;
+ packages.append(*p);
+
+ } else {
+ std::cerr << qPrintable(tr("%1 is not a valid file or directory.").arg(
+ QDir::toNativeSeparators(path))) << std::endl << std::endl;
+ parser.showHelp(7);
+ }
}
// Apply the filter
@@ -147,8 +140,8 @@ int main(int argc, char *argv[])
std::cerr << qPrintable(tr("%1 packages found.").arg(packages.size())) << std::endl;
// Prepare the output text stream
- QTextStream out(stdout);
QFile outFile(parser.value(outputOption));
+ QTextStream out(stdout);
if (!outFile.fileName().isEmpty()) {
if (!outFile.open(QFile::WriteOnly)) {
std::cerr << qPrintable(tr("Cannot open %1 for writing.").arg(
@@ -161,19 +154,25 @@ int main(int argc, char *argv[])
// Generate the output and write it
QString generator = parser.value(generatorOption);
- if (generator == QLatin1String("qdoc")) {
+ if (generator == "qdoc"_L1) {
QString baseDirectory = parser.value(baseDirOption);
if (baseDirectory.isEmpty()) {
+ if (paths.size() != 1) {
+ std::cerr << qPrintable(tr("baseDir option is not optional."));
+ return 1;
+ }
+
+ const QFileInfo pathInfo(paths.last());
if (pathInfo.isDir()) {
// include top level module name in printed paths
- baseDirectory = pathInfo.dir().absoluteFilePath(QStringLiteral(".."));
+ baseDirectory = pathInfo.dir().absoluteFilePath(u".."_s);
} else {
- baseDirectory = pathInfo.absoluteDir().absoluteFilePath(QStringLiteral(".."));
+ baseDirectory = pathInfo.absoluteDir().absoluteFilePath(u".."_s);
}
}
QDocGenerator::generate(out, packages, baseDirectory, logLevel);
- } else if (generator == QLatin1String("json")) {
+ } else if (generator == "json"_L1) {
JsonGenerator::generate(out, packages, logLevel);
} else {
std::cerr << qPrintable(tr("Unknown output-format %1.").arg(generator)) << std::endl;