diff options
Diffstat (limited to 'src/qtattributionsscanner/main.cpp')
-rw-r--r-- | src/qtattributionsscanner/main.cpp | 145 |
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; |