summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2021-11-23 17:23:26 +0200
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-01-06 11:26:29 +0200
commit403e610e6b867dc840c4e78a344cac52bbe751c2 (patch)
tree746f263da474c1603ce14820d164cd37c97e95bc
parent8985801a4e61fad34914ed04480d0240ece53c15 (diff)
Add support for moving child components with <TreeName>
Add new optional "moveChildren" attribute to <TreeName> element. Children of components declaring "moveChildren=true" attribute are calculated a value for an automatic tree name element. Multiple components in a single tree branch can declare a tree name, the order which the relocation happens is from leaf components to root components. Components may be moved under another tree name target. Components may be moved to an existing identifier part that does not have a component, for example in the following repository structure: rootA.childA rootB rootB.childB the "rootB" component can legally declare a "rootA" tree name. The tree names of components become static after installed. If a repository declares a new tree name for a component that is installed, it is only applied after updating in maintenance tool. Child components, which have an automatic tree name, are moved if the parent component is updated with a new tree name, however. Task-number: QTIFW-2380 Change-Id: I9c44a114d3c1248b7e2dd4f0b5cda0739af102f3 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--doc/examples/package.xml2
-rw-r--r--doc/installerfw.qdoc8
-rw-r--r--src/libs/installer/component.cpp22
-rw-r--r--src/libs/installer/component.h1
-rw-r--r--src/libs/installer/component_p.cpp1
-rw-r--r--src/libs/installer/component_p.h1
-rw-r--r--src/libs/installer/constants.h1
-rw-r--r--src/libs/installer/packagemanagercore.cpp153
-rw-r--r--src/libs/installer/packagemanagercore.h3
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp3
-rw-r--r--src/libs/kdtools/localpackagehub.cpp12
-rw-r--r--src/libs/kdtools/localpackagehub.h4
-rw-r--r--src/libs/kdtools/updatesinfo.cpp4
-rw-r--r--tests/auto/installer/componentmodel/tst_componentmodel.cpp2
-rw-r--r--tests/auto/installer/treename/data/invalid_repository/Updates.xml25
-rw-r--r--tests/auto/installer/treename/data/repository_children/Updates.xml229
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/settings.qrc37
-rw-r--r--tests/auto/installer/treename/tst_treename.cpp241
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
new file mode 100644
index 000000000..095fd7e30
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..5dcce5d73
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..21d62e629
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..094ae8806
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..2cb5dfee9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..d3ed0961e
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..cfdef213e
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..466926547
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..3e9297acc
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..7adec9a82
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..b715e5587
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..69406b1b2
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..f2d2141d7
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..1f5c58d2d
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..5307b3de4
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..1b44385ab
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..7e83e996e
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..c89ac2b7b
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..9c97e4a99
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..258b3905f
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..12c4c1248
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..88ec39233
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..4b2747235
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..ab120d4c3
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..767f789ff
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..e5c9b47c9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..2000479c9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..8ecfeaca8
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..09a8e921a
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..acaccd042
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..25247bad4
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..c45a63b41
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..aa3354b8c
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..14b41bdfe
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z
Binary files differ
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
new file mode 100644
index 000000000..e28bb9ea7
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z
Binary files differ
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
new file mode 100644
index 000000000..9112f88c3
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z
Binary files differ
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();