From 2774e4fd95a6e8d6777fab1e708bf04aa6055c39 Mon Sep 17 00:00:00 2001 From: Iikka Eklund Date: Mon, 25 Mar 2013 12:24:43 +0200 Subject: Add missing files into paths_file_lists.qrc Embedded specific files were missing from the resource file thus not included in builds. Change-Id: Ib96a7036182399bed5f8a3f9d703cf4e1b850ccd Reviewed-by: Samuli Piippo Reviewed-by: Niels Weber Reviewed-by: Tim Jenssen --- src/libs/installer/resources/patch_file_lists.qrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/installer/resources/patch_file_lists.qrc b/src/libs/installer/resources/patch_file_lists.qrc index 26154dec2..fe4b77046 100644 --- a/src/libs/installer/resources/patch_file_lists.qrc +++ b/src/libs/installer/resources/patch_file_lists.qrc @@ -6,5 +6,7 @@ files-to-patch-linux-qt5 files-to-patch-windows-qt5 files-to-patch-macx-qt5 + files-to-patch-linux-emb-arm + files-to-patch-windows-emb-arm -- cgit v1.2.3 From e29ef32ec02e01d51065962e0b0f88c70121b3de Mon Sep 17 00:00:00 2001 From: kh1 Date: Tue, 26 Mar 2013 13:10:09 +0100 Subject: Add strict and relaxed parsing to Settings class. * StrictParseMode -> creating binaries and repositories * RelaxedParseMode -> running the installer/updater itself Introduced parse modes to be able to use old settings (existing ones on user systems) with new binaries. Add and adjust autotest. Change-Id: I3f7c7357325661a1197400d8d8dc2a5ca8bed184 Reviewed-by: Karsten Heimrich --- src/libs/installer/packagemanagercoredata.cpp | 2 +- src/libs/installer/settings.cpp | 99 +++++++++++++--------- src/libs/installer/settings.h | 8 +- src/libs/installer/updatesettings.cpp | 2 +- .../settings/data/unknown_element_config.xml | 1 + tests/auto/installer/settings/tst_settings.cpp | 18 +++- 6 files changed, 87 insertions(+), 43 deletions(-) diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp index 660a72922..7dbdf4e1a 100644 --- a/src/libs/installer/packagemanagercoredata.cpp +++ b/src/libs/installer/packagemanagercoredata.cpp @@ -73,7 +73,7 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash &va try { m_settings = Settings::fromFileAndPrefix(QLatin1String(":/metadata/installer-config/config.xml"), - QLatin1String(":/metadata/installer-config/")); + QLatin1String(":/metadata/installer-config/"), Settings::RelaxedParseMode); } catch (const Error &e) { // TODO: try better error handling qCritical("Could not parse Config: %s", qPrintable(e.message())); diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp index 79eee652f..0a2abaa9a 100644 --- a/src/libs/installer/settings.cpp +++ b/src/libs/installer/settings.cpp @@ -79,38 +79,57 @@ static QSet variantListToSet(const QVariantList &list) return set; } -static QSet readRepositories(QXmlStreamReader &reader, bool isDefault) +static void raiseError(QXmlStreamReader &reader, const QString &error, Settings::ParseMode parseMode) +{ + if (parseMode == Settings::StrictParseMode) { + reader.raiseError(error); + } else { + QFile *xmlFile = qobject_cast(reader.device()); + if (xmlFile) { + qWarning() << QString::fromLatin1("Ignoring following settings reader error in %1, line %2, " + "column %3: %4").arg(xmlFile->fileName()).arg(reader.lineNumber()).arg(reader.columnNumber()) + .arg(reader.errorString()); + } else { + qWarning("Ignoring following settings reader error: %s", qPrintable(error)); + } + } +} + +static QSet readRepositories(QXmlStreamReader &reader, bool isDefault, Settings::ParseMode parseMode) { QSet set; while (reader.readNextStartElement()) { if (reader.name() == QLatin1String("Repository")) { Repository repo(QString(), isDefault); while (reader.readNextStartElement()) { - if (reader.name() == QLatin1String("Url")) + if (reader.name() == QLatin1String("Url")) { repo.setUrl(reader.readElementText()); - else if (reader.name() == QLatin1String("Username")) + } else if (reader.name() == QLatin1String("Username")) { repo.setUsername(reader.readElementText()); - else if (reader.name() == QLatin1String("Password")) + } else if (reader.name() == QLatin1String("Password")) { repo.setPassword(reader.readElementText()); - else if (reader.name() == QLatin1String("Enabled")) + } else if (reader.name() == QLatin1String("Enabled")) { repo.setEnabled(bool(reader.readElementText().toInt())); - else - reader.raiseError(QString::fromLatin1("Unexpected element '%1'.").arg( - reader.name().toString())); + } else { + raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(reader.name() + .toString()), parseMode); + } - if (!reader.attributes().isEmpty()) - reader.raiseError(QString::fromLatin1("Unexpected attribute for element '%1'.").arg( - reader.name().toString())); + if (!reader.attributes().isEmpty()) { + raiseError(reader, QString::fromLatin1("Unexpected attribute for element '%1'.") + .arg(reader.name().toString()), parseMode); + } } set.insert(repo); } else { - reader.raiseError(QString::fromLatin1("Unexpected element '%1'.").arg( - reader.name().toString())); + raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(reader.name().toString()), + parseMode); } - if (!reader.attributes().isEmpty()) - reader.raiseError(QString::fromLatin1("Unexpected attribute for element '%1'.").arg( - reader.name().toString())); + if (!reader.attributes().isEmpty()) { + raiseError(reader, QString::fromLatin1("Unexpected attribute for element '%1'.").arg(reader + .name().toString()), parseMode); + } } return set; } @@ -123,33 +142,33 @@ static QVariantHash readTitles(QXmlStreamReader &reader) return hash; } -static QHash readPages(QXmlStreamReader &reader) +static QHash readPages(QXmlStreamReader &reader, Settings::ParseMode parseMode) { QHash hash; while (reader.readNextStartElement()) { if (reader.name() == QLatin1String("Page")) { QVariantHash pageElements; const QString pageName = reader.attributes().value(QLatin1String("name")).toString(); - if (pageName.isEmpty()) - reader.raiseError(QLatin1String("Expected non-empty attribute 'name' for element 'Page'.")); - + if (pageName.isEmpty()) { + raiseError(reader, QLatin1String("Expected non-empty attribute 'name' for element 'Page'."), + parseMode); + } while (reader.readNextStartElement()) { const QString name = reader.name().toString(); - if (name == QLatin1String("Title") || name == QLatin1String("SubTitle")) { + if (name == QLatin1String("Title") || name == QLatin1String("SubTitle")) pageElements.insert(name, readTitles(reader)); - } else { + else pageElements.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements)); - } } hash.insert(pageName, pageElements); } else { - reader.raiseError(QString::fromLatin1("Unexpected element '%1'.").arg(reader.name().toString())); + raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(reader.name().toString()), + parseMode); } } return hash; } - // -- Settings::Private class Settings::Private : public QSharedData @@ -195,7 +214,7 @@ Settings& Settings::operator=(const Settings &other) } /* static */ -Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix) +Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix, ParseMode parseMode) { QFile file(path); QFile overrideConfig(QLatin1String(":/overrideconfig.xml")); @@ -208,9 +227,10 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix) QXmlStreamReader reader(&file); if (reader.readNextStartElement()) { - if (reader.name() != QLatin1String("Installer")) - reader.raiseError(QString::fromLatin1("Unexpected element '%1' as root element.").arg( - reader.name().toString())); + if (reader.name() != QLatin1String("Installer")) { + raiseError(reader, QString::fromLatin1("Unexpected element '%1' as root element.").arg(reader + .name().toString()), parseMode); + } } QStringList elementList; elementList << scName << scVersion << scTitle << scPublisher << scProductUrl @@ -230,34 +250,37 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix) s.d->m_data.insert(scPrefix, prefix); while (reader.readNextStartElement()) { const QString name = reader.name().toString(); - if (!elementList.contains(name)) - reader.raiseError(QString::fromLatin1("Unexpected element '%1'.").arg(name)); + raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(name), parseMode); - if (!reader.attributes().isEmpty()) - reader.raiseError(QString::fromLatin1("Unexpected attribute for element '%1'.").arg(name)); + if (!reader.attributes().isEmpty()) { + raiseError(reader, QString::fromLatin1("Unexpected attribute for element '%1'.").arg(name), + parseMode); + } if (blackList.contains(name)) { if (name == scRemoteRepositories) - s.addDefaultRepositories(readRepositories(reader, true)); + s.addDefaultRepositories(readRepositories(reader, true, parseMode)); if (name == scPages) { qWarning() << "Deprecated element 'Pages'."; - QHash pages = readPages(reader); + QHash pages = readPages(reader, parseMode); const QStringList &keys = pages.keys(); foreach (const QString &key, keys) s.d->m_data.insert(key, pages.value(key)); } } else { - if (s.d->m_data.contains(name)) + if (s.d->m_data.contains(name)) { + // instead of raising parse mode based error, raise a real error reader.raiseError(QString::fromLatin1("Element '%1' has been defined before.").arg(name)); + } s.d->m_data.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements)); } } if (reader.error() != QXmlStreamReader::NoError) { - throw Error(QString::fromLatin1("Error in %1, line %2, column %3: %4") - .arg(path).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.errorString())); + throw Error(QString::fromLatin1("Error in %1, line %2, column %3: %4").arg(path).arg(reader + .lineNumber()).arg(reader.columnNumber()).arg(reader.errorString())); } if (s.d->m_data.value(scName).isNull()) diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h index 8ffbfc004..fcea7cb55 100644 --- a/src/libs/installer/settings.h +++ b/src/libs/installer/settings.h @@ -74,13 +74,19 @@ public: UserDefinedProxy }; + enum ParseMode { + StrictParseMode, + RelaxedParseMode + }; + explicit Settings(); ~Settings(); Settings(const Settings &other); Settings &operator=(const Settings &other); - static Settings fromFileAndPrefix(const QString &path, const QString &prefix); + static Settings fromFileAndPrefix(const QString &path, const QString &prefix, + ParseMode parseMode = StrictParseMode); QString logo() const; QString title() const; diff --git a/src/libs/installer/updatesettings.cpp b/src/libs/installer/updatesettings.cpp index da6ab9319..2e876839f 100644 --- a/src/libs/installer/updatesettings.cpp +++ b/src/libs/installer/updatesettings.cpp @@ -153,7 +153,7 @@ QSet UpdateSettings::repositories() const try { if(result.isEmpty()) { result = Settings::fromFileAndPrefix(QLatin1String(":/metadata/installer-config/config.xml"), - QLatin1String(":/metadata/installer-config/")).userRepositories(); + QLatin1String(":/metadata/installer-config/"), Settings::RelaxedParseMode).userRepositories(); } } catch (const Error &error) { qDebug("Could not parse config: %s", qPrintable(error.message())); diff --git a/tests/auto/installer/settings/data/unknown_element_config.xml b/tests/auto/installer/settings/data/unknown_element_config.xml index 0d97564e6..ee9e0ef1a 100644 --- a/tests/auto/installer/settings/data/unknown_element_config.xml +++ b/tests/auto/installer/settings/data/unknown_element_config.xml @@ -3,4 +3,5 @@ Your application 1.2.3 + Your application Installer diff --git a/tests/auto/installer/settings/tst_settings.cpp b/tests/auto/installer/settings/tst_settings.cpp index 1cc0fef00..be2643ec2 100644 --- a/tests/auto/installer/settings/tst_settings.cpp +++ b/tests/auto/installer/settings/tst_settings.cpp @@ -17,7 +17,8 @@ private slots: void loadEmptyConfig(); void loadNotExistingConfig(); void loadMalformedConfig(); - void loadUnknownElementConfig(); + void loadUnknownElementConfigInStrictParseMode(); + void loadUnknownElementConfigInRelaxedParseMode(); }; void tst_Settings::loadTutorialConfig() @@ -119,7 +120,7 @@ void tst_Settings::loadMalformedConfig() QFAIL("No exception thrown"); } -void tst_Settings::loadUnknownElementConfig() +void tst_Settings::loadUnknownElementConfigInStrictParseMode() { QTest::ignoreMessage(QtDebugMsg, "create Error-Exception: \"Error in :/data/unknown_element_config.xml, line 5, " "column 13: Unexpected element 'unknown'.\" "); @@ -133,6 +134,19 @@ void tst_Settings::loadUnknownElementConfig() QFAIL("No exception thrown"); } +void tst_Settings::loadUnknownElementConfigInRelaxedParseMode() +{ + QTest::ignoreMessage(QtWarningMsg, "\"Ignoring following settings reader error in " + ":/data/unknown_element_config.xml, line 5, column 13: \" "); + try { + Settings settings = Settings::fromFileAndPrefix(":/data/unknown_element_config.xml", ":/data", + Settings::RelaxedParseMode); + QCOMPARE(settings.title(), QLatin1String("Your application Installer")); + } catch (const Error &error) { + QFAIL(qPrintable(QString::fromLatin1("Got an exception in FaultTolerantParseMode: %1").arg(error.message()))); + } +} + QTEST_MAIN(tst_Settings) #include "tst_settings.moc" -- cgit v1.2.3 From 38f9a989339e26f8ffc382c37561c1c4304246d4 Mon Sep 17 00:00:00 2001 From: kh1 Date: Tue, 26 Mar 2013 14:19:11 +0100 Subject: For some reason QString include is now required to compile. Change-Id: I6717e985d1f3ba5559df3e250297373be9f9b7d5 Reviewed-by: Tim Jenssen --- .../tst_fakestopprocessforupdateoperation.cpp | 1 + tests/auto/installer/repository/tst_repository.cpp | 1 + tests/auto/installer/settings/tst_settings.cpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/auto/installer/fakestopprocessforupdateoperation/tst_fakestopprocessforupdateoperation.cpp b/tests/auto/installer/fakestopprocessforupdateoperation/tst_fakestopprocessforupdateoperation.cpp index 1d23e1970..c8b314657 100644 --- a/tests/auto/installer/fakestopprocessforupdateoperation/tst_fakestopprocessforupdateoperation.cpp +++ b/tests/auto/installer/fakestopprocessforupdateoperation/tst_fakestopprocessforupdateoperation.cpp @@ -2,6 +2,7 @@ #include "packagemanagercore.h" #include +#include #include using namespace KDUpdater; diff --git a/tests/auto/installer/repository/tst_repository.cpp b/tests/auto/installer/repository/tst_repository.cpp index e3b7b74a6..380d9a9a2 100644 --- a/tests/auto/installer/repository/tst_repository.cpp +++ b/tests/auto/installer/repository/tst_repository.cpp @@ -1,5 +1,6 @@ #include "repository.h" +#include #include using namespace QInstaller; diff --git a/tests/auto/installer/settings/tst_settings.cpp b/tests/auto/installer/settings/tst_settings.cpp index be2643ec2..947e772d3 100644 --- a/tests/auto/installer/settings/tst_settings.cpp +++ b/tests/auto/installer/settings/tst_settings.cpp @@ -1,9 +1,10 @@ -#include #include "settings.h" #include "errors.h" #include "repository.h" #include +#include +#include using namespace QInstaller; -- cgit v1.2.3 From eedf73fac0b2e9af0623ef7df7e142ab30ee45af Mon Sep 17 00:00:00 2001 From: kh1 Date: Tue, 26 Mar 2013 14:19:18 +0100 Subject: Cleanup. Change-Id: I36406e3e32b04f7817ce049f9fa37910070688ce Reviewed-by: Niels Weber --- tests/auto/installer/settings/tst_settings.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/auto/installer/settings/tst_settings.cpp b/tests/auto/installer/settings/tst_settings.cpp index 947e772d3..dff789d2b 100644 --- a/tests/auto/installer/settings/tst_settings.cpp +++ b/tests/auto/installer/settings/tst_settings.cpp @@ -24,8 +24,7 @@ private slots: void tst_Settings::loadTutorialConfig() { - Settings settings = - Settings::fromFileAndPrefix(":///data/tutorial_config.xml", ":///data"); + Settings settings = Settings::fromFileAndPrefix(":///data/tutorial_config.xml", ":///data"); // specified values QCOMPARE(settings.applicationName(), QLatin1String("Your application")); @@ -74,8 +73,7 @@ void tst_Settings::loadTutorialConfig() void tst_Settings::loadFullConfig() { QTest::ignoreMessage(QtWarningMsg, "Deprecated element 'Pages'. "); - Settings settings = - Settings::fromFileAndPrefix(":///data/full_config.xml", ":///data"); + Settings settings = Settings::fromFileAndPrefix(":///data/full_config.xml", ":///data"); } void tst_Settings::loadEmptyConfig() @@ -123,8 +121,8 @@ void tst_Settings::loadMalformedConfig() void tst_Settings::loadUnknownElementConfigInStrictParseMode() { - QTest::ignoreMessage(QtDebugMsg, "create Error-Exception: \"Error in :/data/unknown_element_config.xml, line 5, " - "column 13: Unexpected element 'unknown'.\" "); + QTest::ignoreMessage(QtDebugMsg, "create Error-Exception: \"Error in :/data/unknown_element_config.xml, " + "line 5, column 13: Unexpected element 'unknown'.\" "); try { Settings::fromFileAndPrefix(":/data/unknown_element_config.xml", ":/data"); } catch (const Error &error) { @@ -144,7 +142,7 @@ void tst_Settings::loadUnknownElementConfigInRelaxedParseMode() Settings::RelaxedParseMode); QCOMPARE(settings.title(), QLatin1String("Your application Installer")); } catch (const Error &error) { - QFAIL(qPrintable(QString::fromLatin1("Got an exception in FaultTolerantParseMode: %1").arg(error.message()))); + QFAIL(qPrintable(QString::fromLatin1("Got an exception in TolerantParseMode: %1").arg(error.message()))); } } -- cgit v1.2.3 From 1dd7a59333c9adfd770d93d6415e695b20c86495 Mon Sep 17 00:00:00 2001 From: Niels Weber Date: Wed, 27 Mar 2013 09:25:12 +0100 Subject: Bump version to 1.3.0 Preparation for release. Change-Id: I953b959b23e80f99ec489db0707f74ee63d66d04 Reviewed-by: Kai Koehne --- installerfw.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installerfw.pri b/installerfw.pri index ec7b88fb4..a808539cd 100644 --- a/installerfw.pri +++ b/installerfw.pri @@ -3,7 +3,7 @@ } IFW_PRI_INCLUDED = 1 -IFW_VERSION = 1.2.81 +IFW_VERSION = 1.3.0 IFW_REPOSITORY_FORMAT_VERSION = 1.0.0 -- cgit v1.2.3 From f7143ad5a81b95f6cdfe1520b20d3b893a7deeab Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Wed, 27 Mar 2013 14:20:06 +0100 Subject: hide the StartMenuSelection page At the moment it would be only the readme file and the unsinstaller and that isn't worse enough. Change-Id: I1d48a0d6deb4e3e42a9f57c50b3cf791cd1edf86 Reviewed-by: Kai Koehne --- dist/packages/org.qtproject.ifw/meta/installscript.qs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dist/packages/org.qtproject.ifw/meta/installscript.qs b/dist/packages/org.qtproject.ifw/meta/installscript.qs index 0019255e1..8a12a6804 100644 --- a/dist/packages/org.qtproject.ifw/meta/installscript.qs +++ b/dist/packages/org.qtproject.ifw/meta/installscript.qs @@ -9,4 +9,6 @@ function Component() // do not show component selection page installer.setDefaultPageVisible(QInstaller.ComponentSelection, false); + // no startmenu entry so no need to ask where to create it + installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false); } -- cgit v1.2.3 From 630829ca00f8400048335f98d4e89805408aecc6 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 27 Mar 2013 16:12:50 +0100 Subject: Bump version Change-Id: If4f563eb47e011309bd16b69d4a0adb8209f568a Reviewed-by: Niels Weber --- installerfw.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installerfw.pri b/installerfw.pri index a808539cd..f8ba0efb8 100644 --- a/installerfw.pri +++ b/installerfw.pri @@ -3,7 +3,7 @@ } IFW_PRI_INCLUDED = 1 -IFW_VERSION = 1.3.0 +IFW_VERSION = 1.3.1 IFW_REPOSITORY_FORMAT_VERSION = 1.0.0 -- cgit v1.2.3 From 59204c3a70b2067f8df39a57bb70a3dfb944a4b7 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 27 Mar 2013 12:32:52 +0100 Subject: Add qt_menu.nib to ifw.app Change-Id: I8d0de3413bf5df0b5b5ef5c839ab63ebd109c6f7 Reviewed-by: Tim Jenssen --- tools/build_installer.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/build_installer.py b/tools/build_installer.py index 44fa0c106..a301c6f48 100644 --- a/tools/build_installer.py +++ b/tools/build_installer.py @@ -24,6 +24,8 @@ def parse_arguments(): parser.add_argument('--doc-qmake', dest='doc_qmake', required=True, help='path to qmake that will be used to generate the documentation') parser.add_argument('--make', dest='make', required=True, help='make command') parser.add_argument('--targetdir', dest='target_dir', required=True, help='directory the generated installer will be placed in') + if sys.platform == 'darwin': + parser.add_argument('--qt_menu_nib', dest='menu_nib', required=True, help='location of qt_menu.nib (usually src/gui/mac/qt_menu.nib)') args = parser.parse_args() @@ -97,6 +99,8 @@ def package(): package_dir = os.path.join(src_dir, 'dist', 'packages') installer_path = os.path.join(src_dir, 'dist', 'packages') run((binary_creator, '--offline-only', '-c', config_file, '-p', package_dir, target_path)) + if sys.platform == 'darwin': + shutil.copytree(args.menu_nib, target_path + '.app/Contents/Resources/qt_menu.nib') parse_arguments() -- cgit v1.2.3