summaryrefslogtreecommitdiffstats
path: root/tools/archivegen
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-06-10 12:14:16 +0200
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-06-10 12:53:28 +0000
commit97b5fe3ebc452d74d70cc7e5a325599ba607cea1 (patch)
treec6207e934e4fc6726df36ca83568b4abc3a1617d /tools/archivegen
parenta893c90bfa27a6088597eb34355ee4a353712ea5 (diff)
Update archivegen.
Stop on file errors. Better verbose/ help output. Add support for compression level. Do not hide symbols in statically build lib7z to use e.g. CPercentPrinter symbol in dynamic IFW builds. Task-number: QTIFW-695 Change-Id: I18e2ea58b5f1880bfb7f3ed84e34b8810f864188 Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
Diffstat (limited to 'tools/archivegen')
-rw-r--r--tools/archivegen/archive.cpp162
-rw-r--r--tools/archivegen/archivegen.pro1
2 files changed, 149 insertions, 14 deletions
diff --git a/tools/archivegen/archive.cpp b/tools/archivegen/archive.cpp
index 256fd5201..b6ae31bfa 100644
--- a/tools/archivegen/archive.cpp
+++ b/tools/archivegen/archive.cpp
@@ -31,43 +31,177 @@
** $QT_END_LICENSE$
**
**************************************************************************/
-#include "common/repositorygen.h"
#include <errors.h>
-#include <init.h>
#include <lib7z_create.h>
+#include <lib7z_facade.h>
#include <utils.h>
#include <QCoreApplication>
-#include <QFileInfo>
+#include <QCommandLineParser>
#include <iostream>
using namespace QInstaller;
-static void printUsage()
+class FailOnErrorCallback : public Lib7z::UpdateCallback
{
- std::cout << "Usage: " << QFileInfo(QCoreApplication::applicationFilePath()).fileName()
- << " directory.7z [files | directories]" << std::endl;
-}
+ HRESULT OpenFileError(const wchar_t*, DWORD) {
+ return S_FALSE;
+ }
+
+ HRESULT CanNotFindError(const wchar_t*, DWORD) {
+ return S_FALSE;
+ }
+
+ HRESULT OpenResult(const wchar_t*, HRESULT result, const wchar_t*) {
+ return result;
+ }
+};
+
+class VerbosePrinterCallback : public Lib7z::UpdateCallback
+{
+public:
+ ~VerbosePrinterCallback() {
+ m_PercentPrinter.ClosePrint();
+ }
+
+private:
+ HRESULT SetTotal(UInt64 size) {
+ m_PercentPrinter.SetTotal(size);
+ return S_OK;
+ }
+
+ HRESULT SetCompleted(const UInt64 *size) {
+ if (size) {
+ m_PercentPrinter.SetRatio(*size);
+ m_PercentPrinter.PrintRatio();
+ }
+ return S_OK;
+ }
+
+ HRESULT OpenResult(const wchar_t *file, HRESULT result, const wchar_t*) {
+ if (result != S_OK) {
+ printBlock(QCoreApplication::translate("archivegen", "Cannot update file: '%1'. "
+ "Unsuporrted archive.").arg(QString::fromWCharArray(file)), Q_NULLPTR);
+ }
+ return result;
+ }
+
+ HRESULT OpenFileError(const wchar_t *file, DWORD) {
+ printBlock(QCoreApplication::translate("archivegen", "Cannot open file: "), file);
+ return S_FALSE;
+ }
+
+ HRESULT CanNotFindError(const wchar_t *file, DWORD) {
+ printBlock(QCoreApplication::translate("archivegen", "Cannot find file: "), file);
+ return S_FALSE;
+ }
+
+ HRESULT StartArchive(const wchar_t *name, bool) {
+ printLine(QCoreApplication::translate("archivegen", "Create archive."));
+ if (name) {
+ m_PercentPrinter.PrintNewLine();
+ m_PercentPrinter.PrintString(name);
+ }
+ return S_OK;
+ }
+
+ HRESULT FinishArchive() {
+ m_PercentPrinter.PrintNewLine();
+ printLine(QCoreApplication::translate("archivegen", "Finished archive."));
+ return S_OK;
+ }
+
+ void printLine(const QString &message) {
+ m_PercentPrinter.PrintString(message.toStdWString().c_str());
+ }
+
+ void printBlock(const QString &message, const wchar_t *message2) {
+ m_PercentPrinter.PrintNewLine();
+ m_PercentPrinter.PrintString(message.toStdWString().c_str());
+ if (message2)
+ m_PercentPrinter.PrintString(message2);
+ m_PercentPrinter.PrintNewLine();
+ }
+
+ Lib7z::PercentPrinter m_PercentPrinter;
+};
int main(int argc, char *argv[])
{
try {
QCoreApplication app(argc, argv);
+#define QUOTE_(x) #x
+#define QUOTE(x) QUOTE_(x)
+ QCoreApplication::setApplicationVersion(QLatin1String(QUOTE(IFW_VERSION_STR)));
+#undef QUOTE
+#undef QUOTE_
+
+ QCommandLineParser parser;
+ const QCommandLineOption help = parser.addHelpOption();
+ const QCommandLineOption version = parser.addVersionOption();
+ QCommandLineOption verbose(QLatin1String("verbose"),
+ QCoreApplication::translate("archivegen", "Verbose mode. Prints out more information."));
+ const QCommandLineOption compression = QCommandLineOption(QStringList()
+ << QLatin1String("c") << QLatin1String("compression"),
+ QCoreApplication::translate("archivegen",
+ "0 (No compression)\n"
+ "1 (Fastest compressing)\n"
+ "3 (Fast compressing)\n"
+ "5 (Normal compressing)\n"
+ "7 (Maximum compressing)\n"
+ "9 (Ultra compressing)\n"
+ "Defaults to 5 (Normal compression)."
+ ), QLatin1String("5"), QLatin1String("5"));
+
+ parser.addOption(verbose);
+ parser.addOption(compression);
+ parser.addPositionalArgument(QLatin1String("archive"),
+ QCoreApplication::translate("archivegen", "Compressed archive to create."));
+ parser.addPositionalArgument(QLatin1String("sources"),
+ QCoreApplication::translate("archivegen", "List of files and directories to compress."));
+
+ parser.parse(app.arguments());
+ if (parser.isSet(help)) {
+ std::cout << parser.helpText() << std::endl;
+ return EXIT_SUCCESS;
+ }
- if (app.arguments().count() < 3) {
- printUsage();
+ if (parser.isSet(version)) {
+ parser.showVersion();
+ return EXIT_SUCCESS;
+ }
+
+ const QStringList args = parser.positionalArguments();
+ if (args.count() < 2) {
+ std::cerr << QCoreApplication::translate("archivegen", "Wrong argument count. See "
+ "'archivgen --help'.") << std::endl;
return EXIT_FAILURE;
}
- QInstaller::init();
- QInstaller::setVerbose(true);
- const QStringList sourceDirectories = app.arguments().mid(2);
- Lib7z::createArchive(app.arguments().at(1), sourceDirectories, Lib7z::QTmpFile::No);
+ bool ok = false;
+ const int values[6] = { 0, 1, 3, 5, 7, 9 };
+ const int value = parser.value(compression).toInt(&ok);
+ if (!ok || (std::find(std::begin(values), std::end(values), value) == std::end(values))) {
+ throw QInstaller::Error(QCoreApplication::translate("archivegen",
+ "Unknown compression level '%1'. See 'archivgen --help'.").arg(value));
+ }
+
+ Lib7z::initSevenZ();
+ Lib7z::createArchive(args[0], args.mid(1), Lib7z::QTmpFile::No, Lib7z::Compression(value),
+ [&] () -> Lib7z::UpdateCallback * {
+ if (parser.isSet(verbose))
+ return new VerbosePrinterCallback;
+ return new FailOnErrorCallback;
+ } ()
+ );
return EXIT_SUCCESS;
} catch (const QInstaller::Error &e) {
- std::cerr << "Caught exception: " << e.message() << std::endl;
+ std::cerr << e.message() << std::endl;
+ } catch (...) {
+ std::cerr << QCoreApplication::translate("archivegen", "Unknown exception caught.")
+ << std::endl;
}
return EXIT_FAILURE;
}
diff --git a/tools/archivegen/archivegen.pro b/tools/archivegen/archivegen.pro
index 135c34010..719b35a7f 100644
--- a/tools/archivegen/archivegen.pro
+++ b/tools/archivegen/archivegen.pro
@@ -7,6 +7,7 @@ include(../../installerfw.pri)
QT -= gui
QT += qml xml
+LIBS += -l7z
CONFIG += console
DESTDIR = $$IFW_APP_PATH