diff options
54 files changed, 699 insertions, 50 deletions
diff --git a/doc/examples/package.xml b/doc/examples/package.xml index 81792416c..216ccadb9 100644 --- a/doc/examples/package.xml +++ b/doc/examples/package.xml @@ -42,5 +42,5 @@ <Argument>@TargetDir@/Folder2</Argument> </Operation> </Operations> - <TreeName>com.vendor.subcomponent</TreeName> + <TreeName moveChildren="true">com.vendor.subcomponent</TreeName> </Package> diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc index 14554f05a..043789722 100644 --- a/doc/installerfw.qdoc +++ b/doc/installerfw.qdoc @@ -976,6 +976,14 @@ location which is calculated from component name. Component names and tree names must be unique. Optional. + Specifying \c{moveChildren="true"} attribute will also change the location of any + child components this component has. Children will move to the overwritten tree name, + keeping the relative location to their parent component. + + One component branch in the install tree view can have multiple components + specifying a tree name. The order in which the location of components is changed + is from leaf to root components. + \endtable \section2 Component Dependencies diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp index 21cb39be1..1f5ad012f 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -287,7 +287,6 @@ void Component::loadDataFromPackage(const KDUpdater::LocalPackage &package) { setValue(scName, package.name); setValue(scDisplayName, package.title); - setValue(scTreeName, package.treeName); setValue(scDescription, package.description); setValue(scVersion, package.version); setValue(scInheritVersion, package.inheritVersionFrom); @@ -304,6 +303,9 @@ void Component::loadDataFromPackage(const KDUpdater::LocalPackage &package) setValue(scCheckable, package.checkable ? scTrue : scFalse); setValue(scExpandedByDefault, package.expandedByDefault ? scTrue : scFalse); setValue(scContentSha1, package.contentSha1); + + setValue(scTreeName, package.treeName.first); + d->m_treeNameMoveChildren = package.treeName.second; } /*! @@ -318,7 +320,6 @@ void Component::loadDataFromPackage(const Package &package) setValue(scName, package.data(scName).toString()); setValue(scDisplayName, package.data(scDisplayName).toString()); - setValue(scTreeName, package.data(scTreeName).toString()); setValue(scDescription, package.data(scDescription).toString()); setValue(scDefault, package.data(scDefault).toString()); setValue(scAutoDependOn, package.data(scAutoDependOn).toString()); @@ -349,6 +350,10 @@ void Component::loadDataFromPackage(const Package &package) setValue(scForcedInstallation, forced); setValue(scContentSha1, package.data(scContentSha1).toString()); + const auto treeNamePair = package.data(QLatin1String(scTreeName)).value<QPair<QString, bool>>(); + setValue(scTreeName, treeNamePair.first); + d->m_treeNameMoveChildren = treeNamePair.second; + if (d->m_core->isPackageViewer()) return; @@ -565,7 +570,18 @@ QString Component::displayName() const */ QString Component::treeName() const { - return d->m_vars.value(scTreeName, name()); + const QString defaultValue = d->m_vars.value(scAutoTreeName, name()); + return d->m_vars.value(scTreeName, defaultValue); +} + +/*! + Returns \c true if descendants of this component should have automatically + created tree names in relation to the parent component's modified location, + \c false otherwise. +*/ +bool Component::treeNameMoveChildren() const +{ + return d->m_treeNameMoveChildren; } /*! diff --git a/src/libs/installer/component.h b/src/libs/installer/component.h index d8588b2ca..6d2784616 100644 --- a/src/libs/installer/component.h +++ b/src/libs/installer/component.h @@ -161,6 +161,7 @@ public: QString name() const; QString displayName() const; QString treeName() const; + bool treeNameMoveChildren() const; quint64 updateUncompressedSize(); QUrl repositoryUrl() const; diff --git a/src/libs/installer/component_p.cpp b/src/libs/installer/component_p.cpp index 8533d8e4c..4030d266e 100644 --- a/src/libs/installer/component_p.cpp +++ b/src/libs/installer/component_p.cpp @@ -54,6 +54,7 @@ ComponentPrivate::ComponentPrivate(PackageManagerCore *core, Component *qq) , m_autoCreateOperations(true) , m_operationsCreatedSuccessfully(true) , m_updateIsAvailable(false) + , m_treeNameMoveChildren(false) { } diff --git a/src/libs/installer/component_p.h b/src/libs/installer/component_p.h index d673baec1..bdc67898d 100644 --- a/src/libs/installer/component_p.h +++ b/src/libs/installer/component_p.h @@ -63,6 +63,7 @@ public: bool m_autoCreateOperations; bool m_operationsCreatedSuccessfully; bool m_updateIsAvailable; + bool m_treeNameMoveChildren; QString m_componentName; QUrl m_repositoryUrl; diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h index 61efe98a8..1b7807e22 100644 --- a/src/libs/installer/constants.h +++ b/src/libs/installer/constants.h @@ -57,6 +57,7 @@ static const QLatin1String scReleaseDate("ReleaseDate"); static const QLatin1String scDescription("Description"); static const QLatin1String scDisplayName("DisplayName"); static const QLatin1String scTreeName("TreeName"); +static const QLatin1String scAutoTreeName("AutoTreeName"); static const QLatin1String scDependencies("Dependencies"); static const QLatin1String scAutoDependOn("AutoDependOn"); static const QLatin1String scNewComponent("NewComponent"); diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 8b670fc41..bb2eca6e6 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1416,11 +1416,12 @@ bool PackageManagerCore::fetchLocalPackagesTree() d->clearAllComponentLists(); QHash<QString, QInstaller::Component*> components; + QMap<QString, QString> treeNameComponents; std::function<void(QList<LocalPackage> *, bool)> loadLocalPackages; loadLocalPackages = [&](QList<LocalPackage> *treeNamePackages, bool firstRun) { foreach (auto &package, (firstRun ? installedPackages.values() : *treeNamePackages)) { - if (firstRun && !package.treeName.isEmpty()) { + if (firstRun && !package.treeName.first.isEmpty()) { // Package has a tree name, leave for later treeNamePackages->append(package); continue; @@ -1448,6 +1449,10 @@ bool PackageManagerCore::fetchLocalPackagesTree() d->m_pendingUnstableComponents.insert(component->name(), QPair<Component::UnstableError, QString>(Component::InvalidTreeName, errorString)); } + const QString treeName = component->value(scTreeName); + if (!treeName.isEmpty()) + treeNameComponents.insert(component->name(), treeName); + components.insert(name, component.take()); } // Second pass with leftover packages @@ -1463,6 +1468,8 @@ bool PackageManagerCore::fetchLocalPackagesTree() loadLocalPackages(&treeNamePackagesTmp, true); } + createAutoTreeNames(components, treeNameComponents); + if (!d->buildComponentTree(components, false)) return false; @@ -3692,7 +3699,7 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo // Check if we already added the component to the available components list. // Component treenames and names must be unique. const QString packageName = data.package->data(scName).toString(); - const QString packageTreeName = data.package->data(scTreeName).toString(); + const QString packageTreeName = data.package->data(scTreeName).value<QPair<QString, bool>>().first; QString name = packageTreeName.isEmpty() ? packageName : packageTreeName; if (data.components->contains(name)) { @@ -3837,13 +3844,14 @@ bool PackageManagerCore::fetchAllPackages(const PackagesList &remotes, const Loc emit startAllComponentsReset(); d->clearAllComponentLists(); - QHash<QString, QInstaller::Component*> components; + QHash<QString, QInstaller::Component*> allComponents; Data data; - data.components = &components; + data.components = &allComponents; data.installedPackages = &locals; - QMap<QString, QString> treeNameComponents; + QMap<QString, QString> remoteTreeNameComponents; + QMap<QString, QString> allTreeNameComponents; std::function<bool(PackagesList *, bool)> loadRemotePackages; loadRemotePackages = [&](PackagesList *treeNamePackages, bool firstRun) -> bool { @@ -3854,24 +3862,25 @@ bool PackageManagerCore::fetchAllPackages(const PackagesList &remotes, const Loc if (!ProductKeyCheck::instance()->isValidPackage(package->data(scName).toString())) continue; - if (firstRun && !package->data(scTreeName).toString().isEmpty()) { + if (firstRun && !package->data(scTreeName) + .value<QPair<QString, bool>>().first.isEmpty()) { // Package has a tree name, leave for later treeNamePackages->append(package); continue; } - QScopedPointer<QInstaller::Component> component(new QInstaller::Component(this)); + QScopedPointer<QInstaller::Component> remoteComponent(new QInstaller::Component(this)); data.package = package; - component->loadDataFromPackage(*package); - if (updateComponentData(data, component.data())) { + remoteComponent->loadDataFromPackage(*package); + if (updateComponentData(data, remoteComponent.data())) { // Create a list where is name and treename. Repo can contain a package with // a different treename of component which is already installed. We don't want // to move already installed local packages. - const QString treeName = component->value(scTreeName); + const QString treeName = remoteComponent->value(scTreeName); if (!treeName.isEmpty()) - treeNameComponents.insert(component->name(), treeName); - QString name = component->treeName(); - components.insert(name, component.take()); + remoteTreeNameComponents.insert(remoteComponent->name(), treeName); + const QString name = remoteComponent->treeName(); + allComponents.insert(name, remoteComponent.take()); } } // Second pass with leftover packages @@ -3886,36 +3895,41 @@ bool PackageManagerCore::fetchAllPackages(const PackagesList &remotes, const Loc if (!loadRemotePackages(&treeNamePackagesTmp, true)) return false; } + allTreeNameComponents = remoteTreeNameComponents; - foreach (const QString &key, locals.keys()) { - QScopedPointer<QInstaller::Component> component(new QInstaller::Component(this)); - component->loadDataFromPackage(locals.value(key)); - QString treeName = component->treeName(); - - // 1. Component has a treename in local but not in remote - if (!treeNameComponents.contains(component->name()) && !component->value(scTreeName).isEmpty()) { - Component *comp = components.take(component->name()); - delete comp; - components.insert(treeName, component.take()); + foreach (auto &package, locals) { + QScopedPointer<QInstaller::Component> localComponent(new QInstaller::Component(this)); + localComponent->loadDataFromPackage(package); + const QString name = localComponent->treeName(); + + // 1. Component has a treename in local but not in remote, add with local treename + if (!remoteTreeNameComponents.contains(localComponent->name()) && !localComponent->value(scTreeName).isEmpty()) { + delete allComponents.take(localComponent->name()); // 2. Component has different treename in local and remote, add with local treename - } else if (treeNameComponents.contains(component->name())) { - QString remoteTreeName = treeNameComponents.value(component->name()); - QString componentTreeName = component->value(scTreeName); - if (remoteTreeName != componentTreeName) { - Component *comp = components.take(treeNameComponents.value(component->name())); - delete comp; - components.insert(treeName, component.take()); - } + } else if (remoteTreeNameComponents.contains(localComponent->name())) { + const QString remoteTreeName = remoteTreeNameComponents.value(localComponent->name()); + const QString localTreeName = localComponent->value(scTreeName); + if (remoteTreeName != localTreeName) + delete allComponents.take(remoteTreeNameComponents.value(localComponent->name())); + else + continue; // 3. Component has same treename in local and remote, don't add the component again. - } else if (!components.contains(treeName)) { - components.insert(treeName, component.take()); + } else if (allComponents.contains(name)) { + continue; } + const QString treeName = localComponent->value(scTreeName); + if (!treeName.isEmpty()) + allTreeNameComponents.insert(localComponent->name(), treeName); + allComponents.insert(name, localComponent.take()); } // store all components that got a replacement - storeReplacedComponents(components, data, &treeNameComponents); + storeReplacedComponents(allComponents, data, &allTreeNameComponents); + + // Move children of treename components + createAutoTreeNames(allComponents, allTreeNameComponents); - if (!d->buildComponentTree(components, true)) + if (!d->buildComponentTree(allComponents, true)) return false; d->commitPendingUnstableComponents(); @@ -4082,6 +4096,75 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const return true; } +/*! + \internal + + Creates automatic tree names for \a components that have a parent declaring + an explicit tree name. The child components keep the relative location + to their parent component. + + The \a treeNameComponents is a map of original component names and new tree names. +*/ +void PackageManagerCore::createAutoTreeNames(QHash<QString, Component *> &components + , const QMap<QString, QString> &treeNameComponents) +{ + if (treeNameComponents.isEmpty()) + return; + + QHash<QString, Component *> componentsTemp = components; + for (auto *component : qAsConst(components)) { + if (component->treeName() != component->name()) // already handled + continue; + + QString newName; + // Check treename candidates, keep the name closest to a leaf component + for (auto &name : treeNameComponents.keys()) { + if (!component->name().startsWith(name)) + continue; + + const Component *parent = components.value(treeNameComponents.value(name)); + if (!(parent && parent->treeNameMoveChildren())) + continue; // TreeName only applied to parent + + if (newName.split(QLatin1Char('.'), QString::SkipEmptyParts).count() + > name.split(QLatin1Char('.'), QString::SkipEmptyParts).count()) { + continue; + } + newName = name; + } + if (newName.isEmpty()) // Nothing to do + continue; + + const QString treeName = component->name() + .replace(newName, treeNameComponents.value(newName)); + + if (components.contains(treeName) || treeNameComponents.contains(treeName)) { + // Can happen if the parent was moved to an existing identifier (which did not + // have a component) and contains child that has a conflicting name with a component + // in the existing branch. + qCritical() << "Cannot register component" << component->name() << "with automatic " + "tree name" << treeName << "! Component with identifier" << treeName << "already exists."; + + if (settings().allowUnstableComponents()) { + qCDebug(lcInstallerInstallLog) + << "Falling back to using the original indetifier:" << component->name(); + + const QString errorString = QLatin1String("Tree name conflicts with an existing indentifier"); + d->m_pendingUnstableComponents.insert(component->name(), + QPair<Component::UnstableError, QString>(Component::InvalidTreeName, errorString)); + } else { + componentsTemp.remove(componentsTemp.key(component)); + } + continue; + } + component->setValue(scAutoTreeName, treeName); + + componentsTemp.remove(componentsTemp.key(component)); + componentsTemp.insert(treeName, component); + } + components = componentsTemp; +} + void PackageManagerCore::restoreCheckState() { d->restoreCheckState(); diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 9114578fa..cf1916c48 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -414,6 +414,9 @@ private: bool fetchAllPackages(const PackagesList &remotePackages, const LocalPackagesHash &localPackages); bool fetchUpdaterPackages(const PackagesList &remotePackages, const LocalPackagesHash &localPackages); + void createAutoTreeNames(QHash<QString, Component *> &components, + const QMap<QString, QString> &treeNameComponents); + void updateDisplayVersions(const QString &displayKey); QString findDisplayVersion(const QString &componentName, const QHash<QString, QInstaller::Component*> &components, const QString& versionKey, QHash<QString, bool> &visited); diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 058418f8e..948093ad7 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -2244,7 +2244,8 @@ void PackageManagerCorePrivate::installComponent(Component *component, double pr m_localPackageHub->addPackage(component->name(), component->value(scVersion), component->value(scDisplayName), - component->value(scTreeName), + QPair<QString, bool>(component->value(scTreeName), + component->treeNameMoveChildren()), component->value(scDescription), component->dependencies(), component->autoDependencies(), diff --git a/src/libs/kdtools/localpackagehub.cpp b/src/libs/kdtools/localpackagehub.cpp index d709acb54..353d3f4dd 100644 --- a/src/libs/kdtools/localpackagehub.cpp +++ b/src/libs/kdtools/localpackagehub.cpp @@ -319,7 +319,7 @@ void LocalPackageHub::refresh() void LocalPackageHub::addPackage(const QString &name, const QString &version, const QString &title, - const QString &treeName, + const QPair<QString, bool> &treeName, const QString &description, const QStringList &dependencies, const QStringList &autoDependencies, @@ -404,7 +404,8 @@ void LocalPackageHub::writeToDisk() addTextChildHelper(&package, QLatin1String("Name"), info.name); addTextChildHelper(&package, QLatin1String("Title"), info.title); addTextChildHelper(&package, QLatin1String("Description"), info.description); - addTextChildHelper(&package, scTreeName, info.treeName); + addTextChildHelper(&package, scTreeName, info.treeName.first, QLatin1String("moveChildren"), + QVariant(info.treeName.second).toString()); if (info.inheritVersionFrom.isEmpty()) addTextChildHelper(&package, QLatin1String("Version"), info.version); else @@ -477,9 +478,10 @@ void LocalPackageHub::PackagesInfoData::addPackageFrom(const QDomElement &packag info.title = childNodeE.text(); else if (childNodeE.tagName() == QLatin1String("Description")) info.description = childNodeE.text(); - else if (childNodeE.tagName() == scTreeName) - info.treeName = childNodeE.text(); - else if (childNodeE.tagName() == QLatin1String("Version")) { + else if (childNodeE.tagName() == scTreeName) { + info.treeName.first = childNodeE.text(); + info.treeName.second = QVariant(childNodeE.attribute(QLatin1String("moveChildren"))).toBool(); + } else if (childNodeE.tagName() == QLatin1String("Version")) { info.version = childNodeE.text(); info.inheritVersionFrom = childNodeE.attribute(QLatin1String("inheritVersionFrom")); } diff --git a/src/libs/kdtools/localpackagehub.h b/src/libs/kdtools/localpackagehub.h index 648d6cf6e..b544ddfb6 100644 --- a/src/libs/kdtools/localpackagehub.h +++ b/src/libs/kdtools/localpackagehub.h @@ -43,7 +43,7 @@ struct KDTOOLS_EXPORT LocalPackage QString name; QString title; QString description; - QString treeName; + QPair<QString, bool> treeName; QString version; QString inheritVersionFrom; QStringList dependencies; @@ -100,7 +100,7 @@ public: void addPackage(const QString &pkgName, const QString &version, // mandatory const QString &title, - const QString &treeName, + const QPair<QString, bool> &treeName, const QString &description, const QStringList &dependencies, const QStringList &autoDependencies, diff --git a/src/libs/kdtools/updatesinfo.cpp b/src/libs/kdtools/updatesinfo.cpp index eaa9b039e..545931a55 100644 --- a/src/libs/kdtools/updatesinfo.cpp +++ b/src/libs/kdtools/updatesinfo.cpp @@ -140,6 +140,10 @@ bool UpdatesInfoData::parsePackageUpdateElement(const QDomElement &updateE) } if (!licenseHash.isEmpty()) info.data.insert(QLatin1String("Licenses"), licenseHash); + } else if (childE.tagName() == QLatin1String("TreeName")) { + const bool moveChildren = QVariant(childE.attribute(QLatin1String("moveChildren"))).toBool(); + const QPair<QString, bool> treeNamePair(childE.text(), moveChildren); + info.data.insert(QLatin1String("TreeName"), QVariant::fromValue(treeNamePair)); } else if (childE.tagName() == QLatin1String("Version")) { info.data.insert(QLatin1String("inheritVersionFrom"), childE.attribute(QLatin1String("inheritVersionFrom"))); diff --git a/tests/auto/installer/componentmodel/tst_componentmodel.cpp b/tests/auto/installer/componentmodel/tst_componentmodel.cpp index 0672a03ec..3aef34fe4 100644 --- a/tests/auto/installer/componentmodel/tst_componentmodel.cpp +++ b/tests/auto/installer/componentmodel/tst_componentmodel.cpp @@ -521,7 +521,7 @@ private: // we need at least these to be able to test the model component->setValue("Name", info.data.value("Name").toString()); - component->setValue("TreeName", info.data.value("TreeName").toString()); + component->setValue("TreeName", info.data.value("TreeName").value<QPair<QString, bool>>().first); QString isDefault = info.data.value("Default").toString(); if (m_core.noDefaultInstallation()) isDefault = scFalse; diff --git a/tests/auto/installer/treename/data/invalid_repository/Updates.xml b/tests/auto/installer/treename/data/invalid_repository/Updates.xml index 282e3a43f..b329bb223 100644 --- a/tests/auto/installer/treename/data/invalid_repository/Updates.xml +++ b/tests/auto/installer/treename/data/invalid_repository/Updates.xml @@ -27,4 +27,29 @@ <SortingPriority>40</SortingPriority> <TreeName>componentA.sub1</TreeName> </PackageUpdate> + <PackageUpdate> + <Name>componentC.sub1</Name> + <DisplayName>Component C subcomponent1</DisplayName> + <Description>Component</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>40</SortingPriority> + </PackageUpdate> + <PackageUpdate> + <Name>componentD</Name> + <DisplayName>Component D</DisplayName> + <Description>Component</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>40</SortingPriority> + <TreeName moveChildren="true">componentC</TreeName> + </PackageUpdate> + <PackageUpdate> + <Name>componentD.sub1</Name> + <DisplayName>Component D subcomponent 1</DisplayName> + <Description>Component</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>40</SortingPriority> + </PackageUpdate> </Updates> diff --git a/tests/auto/installer/treename/data/repository_children/Updates.xml b/tests/auto/installer/treename/data/repository_children/Updates.xml new file mode 100644 index 000000000..a17f481d6 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/Updates.xml @@ -0,0 +1,229 @@ +<Updates> + <ApplicationName>{AnyApplication}</ApplicationName> + <ApplicationVersion>1.0.0</ApplicationVersion> + <Checksum>false</Checksum> + <PackageUpdate> + <Name>componentA</Name> + <DisplayName>Component A</DisplayName> + <Description>This component does not depend on any other component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>100</SortingPriority> + <TreeName moveChildren="true">componentANew</TreeName> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>8148a84c9a52eb989525f4807482f42c49c743a4</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentA.subcomponent1</Name> + <DisplayName>Subcomponent 1</DisplayName> + <Description>This component does not have leaf components.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>100</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>c0c5d273b9c413db07fbd1ffee58759f0059d668</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentB</Name> + <DisplayName>Component B (automatic dependency to componentA.subcomponent1)</DisplayName> + <Description>This component has an automatic dependency, If the dependency is marked for installation, this component is also installed.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>90</SortingPriority> + <AutoDependOn>componentA.subcomponent1</AutoDependOn> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>c517b08c40ef5c5984f6bf34a626060dcbab6ba5</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentE</Name> + <DisplayName>Component E</DisplayName> + <Description>This is a component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>60</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>2833ea6d508925e64f00fb6b699532992b923ab2</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF</Name> + <DisplayName>Component F</DisplayName> + <Description>This component contains 2 subcomponents.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>40</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>21ca242b83ce32dfe066348cbb453080b5967e30</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF.subcomponent1</Name> + <DisplayName>Subcomponent 1</DisplayName> + <Description>This component contains 2 leaf components.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>100</SortingPriority> + <TreeName moveChildren="true">FSub1ToRoot</TreeName> + <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>e2745196bceaae476cac330f0af0ce6e564d2d3d</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF.subcomponent1.subsubcomponent1</Name> + <DisplayName>Subsubcomponent 1</DisplayName> + <Description>This component does not depend on any other component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>100</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>8af98107adadb1fda37c1c086c53ed289cc77661</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF.subcomponent1.subsubcomponent2</Name> + <DisplayName>Subsubcomponent 2</DisplayName> + <Description>This component does not depend on any other component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>50</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>69458b616989a44e52b480dd9133721bc52b1558</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF.subcomponent2</Name> + <DisplayName>Subcomponent 2</DisplayName> + <Description>This component contains 2 leaf components.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>50</SortingPriority> + <TreeName moveChildren="true">componentE.sub1</TreeName> + <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>9d985ee35442e6e621f8ec24dc41be9f6cab9dad</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF.subcomponent2.subsubcomponent1</Name> + <DisplayName>Subsubcomponent 1</DisplayName> + <Description>This component does not depend on any other component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>100</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>43223427efd8c2a428ead343a79709cd1bfc5618</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentF.subcomponent2.subsubcomponent2</Name> + <DisplayName>Subsubcomponent 2</DisplayName> + <Description>This component does not depend on any other component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>50</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>d76690fb2f41aab262d7d8621c46fa464f35a550</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentH</Name> + <DisplayName>Component H</DisplayName> + <Description>An example component without dependencies.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>30</SortingPriority> + <TreeName moveChildren="true">componentI</TreeName> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>04426aec311900e8d74ae42cc6fe49282d314841</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentH.subcomponent1</Name> + <DisplayName>Subcomponent 1</DisplayName> + <Description>This component does not contain leaf components.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>100</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>065a901fd86d4e7fd86200da47079c97070178c7</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentI.subcomponent2</Name> + <DisplayName>Subcomponent 1</DisplayName> + <Description>Subcomponent without original parent.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>30</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>3d2d928ed10455fe884cab96498a3fc826505406</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentJ</Name> + <DisplayName>Component J</DisplayName> + <Description>An example component without dependencies.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>30</SortingPriority> + <TreeName moveChildren="true">componentJNew</TreeName> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>1a46e58cd1824b2c0a4a93d6b27050eb0f6feb29</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentJ.subcomponent1</Name> + <DisplayName>Subcomponent 1</DisplayName> + <Description>Subcomponent with parent.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>30</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>dd1cfaa8f6cd14f81635e8917f348006ca7ffdce</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentK</Name> + <DisplayName>Component K (depends on componentJ.subcomponent1)</DisplayName> + <Description>This component depends on Component J subcomponent.</Description> + <Dependencies>componentJ.subcomponent1</Dependencies> + <Version>1.0.0</Version> + <ReleaseDate>2014-08-25</ReleaseDate> + <SortingPriority>80</SortingPriority> + <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>98253c1ab872c9baa64d2fe3525f86a65e73d1f2</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>componentL</Name> + <DisplayName>Component L</DisplayName> + <Description>Component with tree name, is replaced by other component.</Description> + <Version>1.0.0</Version> + <ReleaseDate>2022-01-01</ReleaseDate> + <TreeName moveChildren="true">LToNewRoot</TreeName> + </PackageUpdate> + <PackageUpdate> + <Name>componentL.sub1</Name> + <DisplayName>Component L subcomponent 1</DisplayName> + <Description>Child of component L</Description> + <Version>1.0.0</Version> + <ReleaseDate>2022-01-01</ReleaseDate> + </PackageUpdate> + <PackageUpdate> + <Name>componentL.sub2</Name> + <DisplayName>Component L subcomponent 2</DisplayName> + <Description>Child of component L</Description> + <Version>1.0.0</Version> + <ReleaseDate>2022-01-01</ReleaseDate> + </PackageUpdate> + <PackageUpdate> + <Name>componentM</Name> + <DisplayName>Component M</DisplayName> + <Description>Component that replaces other component</Description> + <Version>1.0.0</Version> + <ReleaseDate>2022-01-01</ReleaseDate> + <Replaces>componentL</Replaces> + </PackageUpdate> +</Updates> diff --git a/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..095fd7e30 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..5dcce5d73 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..21d62e629 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..094ae8806 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..2cb5dfee9 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..d3ed0961e --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..cfdef213e --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..466926547 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..3e9297acc --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..7adec9a82 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..b715e5587 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..69406b1b2 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..f2d2141d7 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..1f5c58d2d --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..5307b3de4 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..1b44385ab --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..7e83e996e --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..c89ac2b7b --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..9c97e4a99 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..258b3905f --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..12c4c1248 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..88ec39233 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..4b2747235 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..ab120d4c3 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..767f789ff --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..e5c9b47c9 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..2000479c9 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..8ecfeaca8 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..09a8e921a --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..acaccd042 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..25247bad4 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..c45a63b41 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..aa3354b8c --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..14b41bdfe --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..e28bb9ea7 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z diff --git a/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..9112f88c3 --- /dev/null +++ b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z diff --git a/tests/auto/installer/treename/settings.qrc b/tests/auto/installer/treename/settings.qrc index 3837d4440..eab771bee 100644 --- a/tests/auto/installer/treename/settings.qrc +++ b/tests/auto/installer/treename/settings.qrc @@ -21,6 +21,43 @@ <file>data/repository/componentC/1.0.0content.7z</file> <file>data/repository/componentD/1.0.0meta.7z</file> <file>data/repository/componentD/1.0.0content.7z</file> + <file>data/invalid_repository/Updates.xml</file> + + <file>data/repository_children/componentA/1.0.0content.7z</file> + <file>data/repository_children/componentA/1.0.0meta.7z</file> + <file>data/repository_children/componentA.subcomponent1/1.0.0content.7z</file> + <file>data/repository_children/componentA.subcomponent1/1.0.0meta.7z</file> + <file>data/repository_children/componentB/1.0.0content.7z</file> + <file>data/repository_children/componentB/1.0.0meta.7z</file> + <file>data/repository_children/componentE/1.0.0content.7z</file> + <file>data/repository_children/componentE/1.0.0meta.7z</file> + <file>data/repository_children/componentF/1.0.0content.7z</file> + <file>data/repository_children/componentF/1.0.0meta.7z</file> + <file>data/repository_children/componentF.subcomponent1/1.0.0content.7z</file> + <file>data/repository_children/componentF.subcomponent1/1.0.0meta.7z</file> + <file>data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z</file> + <file>data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z</file> + <file>data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z</file> + <file>data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z</file> + <file>data/repository_children/componentF.subcomponent2/1.0.0content.7z</file> + <file>data/repository_children/componentF.subcomponent2/1.0.0meta.7z</file> + <file>data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z</file> + <file>data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z</file> + <file>data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z</file> + <file>data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z</file> + <file>data/repository_children/componentH/1.0.0content.7z</file> + <file>data/repository_children/componentH/1.0.0meta.7z</file> + <file>data/repository_children/componentH.subcomponent1/1.0.0content.7z</file> + <file>data/repository_children/componentH.subcomponent1/1.0.0meta.7z</file> + <file>data/repository_children/componentI.subcomponent2/1.0.0content.7z</file> + <file>data/repository_children/componentI.subcomponent2/1.0.0meta.7z</file> + <file>data/repository_children/componentJ/1.0.0content.7z</file> + <file>data/repository_children/componentJ/1.0.0meta.7z</file> + <file>data/repository_children/componentJ.subcomponent1/1.0.0content.7z</file> + <file>data/repository_children/componentJ.subcomponent1/1.0.0meta.7z</file> + <file>data/repository_children/componentK/1.0.0content.7z</file> + <file>data/repository_children/componentK/1.0.0meta.7z</file> + <file>data/repository_children/Updates.xml</file> </qresource> </RCC> diff --git a/tests/auto/installer/treename/tst_treename.cpp b/tests/auto/installer/treename/tst_treename.cpp index 2945d499a..974bc08cc 100644 --- a/tests/auto/installer/treename/tst_treename.cpp +++ b/tests/auto/installer/treename/tst_treename.cpp @@ -44,10 +44,20 @@ private slots: void moveToSubItem(); void dependencyToMovedItem(); void autodependOnMovedItem(); - void moveToExistingItemAllowUnstableComponents(); + + void moveToExistingAllowUnstableComponents(); void moveToExistingItemNoUnstableComponents(); + void moveWithChildrenChildConflictsAllowUnstable(); + void moveWithChildrenChildConflictsNoUnstable(); + + void moveToRootWithChildren(); + void moveToSubItemWithChildren(); + void moveToAvailableParentItemWithChilren(); + void dependencyToMovedSubItem(); + void autoDependOnMovedSubItem(); void replaceComponentWithTreeName(); + void replaceComponentWithTreeNameMoveChildren(); void init(); void cleanup(); @@ -114,7 +124,7 @@ void tst_TreeName::autodependOnMovedItem() << "componentASub2.txt" << "componentD.txt"); } -void tst_TreeName::moveToExistingItemAllowUnstableComponents() +void tst_TreeName::moveToExistingAllowUnstableComponents() { QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit (m_installDir, ":///data/invalid_repository")); @@ -144,6 +154,233 @@ void tst_TreeName::replaceComponentWithTreeName() QVERIFY(!core->componentByName("componentE")); } +void tst_TreeName::replaceComponentWithTreeNameMoveChildren() +{ + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository_children")); + + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentM")); + QVERIFY(core->componentByName("componentM")->value(scTreeName).isEmpty()); + QVERIFY(!core->componentByName("componentL")); + + Component *component1 = core->componentByName("componentL.sub1"); + QCOMPARE(component1->treeName(), component1->name()); + + Component *component2 = core->componentByName("componentL.sub2"); + QCOMPARE(component2->treeName(), component2->name()); +} + +void tst_TreeName::moveWithChildrenChildConflictsAllowUnstable() +{ + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/invalid_repository")); + core->settings().setAllowUnstableComponents(true); + + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentD")); + Component *const component = core->componentByName("componentD.sub1"); + QVERIFY(component && component->isUnstable() && !component->isInstalled()); +} + +void tst_TreeName::moveWithChildrenChildConflictsNoUnstable() +{ + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/invalid_repository")); + core->settings().setAllowUnstableComponents(false); + + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentD")); + QVERIFY(!core->componentByName("componentD.sub1")); +} + +void tst_TreeName::moveToRootWithChildren() +{ + // componentF.subcomponent1 moved from sub item to root (FSub1ToRoot) + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository_children")); + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently( + QStringList() << "componentF.subcomponent1")); + const QList<Component*> installedComponents = core->orderedComponentsToInstall(); + + QCOMPARE(installedComponents.count(), 3); + + Component const *parent = installedComponents.at(0); + QCOMPARE(parent->name(), "componentF.subcomponent1"); + QCOMPARE(parent->treeName(), "FSub1ToRoot"); + QVERIFY(parent->value(scAutoTreeName).isEmpty()); + + Component const *child1 = installedComponents.at(1); + QCOMPARE(child1->name(), "componentF.subcomponent1.subsubcomponent1"); + QCOMPARE(child1->treeName(), "FSub1ToRoot.subsubcomponent1"); + QCOMPARE(child1->treeName(), child1->value(scAutoTreeName)); + + Component const *child2 = installedComponents.at(2); + QCOMPARE(child2->name(), "componentF.subcomponent1.subsubcomponent2"); + QCOMPARE(child2->treeName(), "FSub1ToRoot.subsubcomponent2"); + QCOMPARE(child2->treeName(), child2->value(scAutoTreeName)); + + QVERIFY(core->componentByName("componentF.subcomponent1")); + QVERIFY(!core->componentByName("FSub1ToRoot")); + QVERIFY(core->componentByName("componentF.subcomponent1.subsubcomponent1")); + QVERIFY(!core->componentByName("FSub1ToRoot.subsubcomponent1")); + QVERIFY(core->componentByName("componentF.subcomponent1.subsubcomponent2")); + QVERIFY(!core->componentByName("FSub1ToRoot.subsubcomponent2")); + + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentF.subcomponent1", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentF.subcomponent1.subsubcomponent1", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentF.subcomponent1.subsubcomponent2", "1.0.0content.txt"); + VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml" + << "installcontentF_1.txt" << "installcontentF_1_1.txt" << "installcontentF_1_2.txt"); +} + +void tst_TreeName::moveToSubItemWithChildren() +{ + // componentF.subcomponent2 moved under componentE (componentE.sub1) + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository_children")); + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently( + QStringList() << "componentF.subcomponent2")); + const QList<Component*> installedComponents = core->orderedComponentsToInstall(); + + QCOMPARE(installedComponents.count(), 4); + + Component const *parent = installedComponents.at(1); + QCOMPARE(parent->name(), "componentF.subcomponent2"); + QCOMPARE(parent->treeName(), "componentE.sub1"); + QVERIFY(parent->value(scAutoTreeName).isEmpty()); + + Component const *child1 = installedComponents.at(2); + QCOMPARE(child1->name(), "componentF.subcomponent2.subsubcomponent1"); + QCOMPARE(child1->treeName(), "componentE.sub1.subsubcomponent1"); + QCOMPARE(child1->treeName(), child1->value(scAutoTreeName)); + + Component const *child2 = installedComponents.at(3); + QCOMPARE(child2->name(), "componentF.subcomponent2.subsubcomponent2"); + QCOMPARE(child2->treeName(), "componentE.sub1.subsubcomponent2"); + QCOMPARE(child2->treeName(), child2->value(scAutoTreeName)); + + QVERIFY(core->componentByName("componentF.subcomponent2")); + QVERIFY(!core->componentByName("componentE.sub1")); + QVERIFY(core->componentByName("componentF.subcomponent2.subsubcomponent1")); + QVERIFY(!core->componentByName("componentE.sub1.subsubcomponent1")); + QVERIFY(core->componentByName("componentF.subcomponent2.subsubcomponent2")); + QVERIFY(!core->componentByName("componentE.sub1.subsubcomponent2")); + + VerifyInstaller::verifyInstallerResources(m_installDir, "componentE", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentF.subcomponent2", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentF.subcomponent2.subsubcomponent1", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentF.subcomponent2.subsubcomponent2", "1.0.0content.txt"); + VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml" + << "installcontentE.txt" << "installcontentF_2.txt" << "installcontentF_2_1.txt" + << "installcontentF_2_2.txt"); +} + +void tst_TreeName::moveToAvailableParentItemWithChilren() +{ + // componentH moved to componentI + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository_children")); + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently( + QStringList() << "componentH")); + const QList<Component*> installedComponents = core->orderedComponentsToInstall(); + + QCOMPARE(installedComponents.count(), 3); + + Component const *parent = installedComponents.at(0); + QCOMPARE(parent->name(), "componentH"); + QCOMPARE(parent->treeName(), "componentI"); + QVERIFY(parent->value(scAutoTreeName).isEmpty()); + + Component const *child1 = installedComponents.at(1); + QCOMPARE(child1->name(), "componentH.subcomponent1"); + QCOMPARE(child1->treeName(), "componentI.subcomponent1"); + QCOMPARE(child1->treeName(), child1->value(scAutoTreeName)); + + Component const *child2 = installedComponents.at(2); + QCOMPARE(child2->name(), "componentI.subcomponent2"); + QCOMPARE(child2->treeName(), child2->name()); + QVERIFY(child2->value(scAutoTreeName).isEmpty()); + + QVERIFY(core->componentByName("componentH")); + QVERIFY(!core->componentByName("componentI")); + QVERIFY(core->componentByName("componentH.subcomponent1")); + QVERIFY(!core->componentByName("componentI.subcomponent1")); + QVERIFY(core->componentByName("componentI.subcomponent2")); + + VerifyInstaller::verifyInstallerResources(m_installDir, "componentH", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentH.subcomponent1", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentI.subcomponent2", "1.0.0content.txt"); + VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml" + << "installcontentH.txt" << "installcontentH_1.txt" << "installcontentI_2.txt"); +} + +void tst_TreeName::dependencyToMovedSubItem() +{ + // componentK has dependency to componentJ.subcomponent1, which has a parent with treename + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository_children")); + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently( + QStringList() << "componentK")); + const QList<Component*> installedComponents = core->orderedComponentsToInstall(); + + QCOMPARE(installedComponents.count(), 2); + + Component const *component1 = installedComponents.at(0); + QCOMPARE(component1->name(), "componentJ.subcomponent1"); + QCOMPARE(component1->treeName(), "componentJNew.subcomponent1"); + QCOMPARE(component1->treeName(), component1->value(scAutoTreeName)); + + Component const *component2 = installedComponents.at(1); + QCOMPARE(component2->name(), "componentK"); + QCOMPARE(component2->treeName(), component2->name()); + QVERIFY(component2->value(scAutoTreeName).isEmpty()); + + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentJ.subcomponent1", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, "componentK", "1.0.0content.txt"); + VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml" + << "installcontentJ_1.txt" << "installcontentK.txt"); +} + +void tst_TreeName::autoDependOnMovedSubItem() +{ + // componentB auto-depends on componentA.subcomponent1, which has a parent with treename + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository_children")); + QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently( + QStringList() << "componentA.subcomponent1")); + const QList<Component*> installedComponents = core->orderedComponentsToInstall(); + + QCOMPARE(installedComponents.count(), 3); + + Component const *component1 = installedComponents.at(0); + QCOMPARE(component1->name(), "componentA"); + QCOMPARE(component1->treeName(), "componentANew"); + QVERIFY(component1->value(scAutoTreeName).isEmpty()); + + Component const *component2 = installedComponents.at(1); + QCOMPARE(component2->name(), "componentA.subcomponent1"); + QCOMPARE(component2->treeName(), "componentANew.subcomponent1"); + QCOMPARE(component2->treeName(), component2->value(scAutoTreeName)); + + Component const *component3 = installedComponents.at(2); + QCOMPARE(component3->name(), "componentB"); + QCOMPARE(component3->treeName(), component3->name()); + + VerifyInstaller::verifyInstallerResources(m_installDir, "componentA", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, + "componentA.subcomponent1", "1.0.0content.txt"); + VerifyInstaller::verifyInstallerResources(m_installDir, "componentB", "1.0.0content.txt"); + VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml" + << "installcontentA.txt" << "installcontentA_1.txt" << "installcontentB.txt"); +} + void tst_TreeName::init() { m_installDir = QInstaller::generateTemporaryFileName(); |