HaikuDepot: Resolve system dependencies.
- While building the installed package list, resolve the dependencies of the OS packages. Flag the resulting list as protected so as to disallow uninstallation of them in addition to the OS packages.
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013, Stephan Aßmus <[email protected]>.
|
* Copyright 2013, Stephan Aßmus <[email protected]>.
|
||||||
* Copyright 2013, Rene Gollent, [email protected].
|
* Copyright 2013, Rene Gollent, [email protected].
|
||||||
|
* Copyright 2013, Ingo Weinhold, [email protected].
|
||||||
* All rights reserved. Distributed under the terms of the MIT License.
|
* All rights reserved. Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -8,6 +9,8 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <Alert.h>
|
#include <Alert.h>
|
||||||
#include <Autolock.h>
|
#include <Autolock.h>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
@@ -23,10 +26,15 @@
|
|||||||
|
|
||||||
#include <package/Context.h>
|
#include <package/Context.h>
|
||||||
#include <package/manager/Exceptions.h>
|
#include <package/manager/Exceptions.h>
|
||||||
|
#include <package/manager/RepositoryBuilder.h>
|
||||||
#include <package/RefreshRepositoryRequest.h>
|
#include <package/RefreshRepositoryRequest.h>
|
||||||
#include <package/PackageRoster.h>
|
#include <package/PackageRoster.h>
|
||||||
#include "package/RepositoryCache.h"
|
#include "package/RepositoryCache.h"
|
||||||
#include <package/solver/SolverPackage.h>
|
#include <package/solver/SolverPackage.h>
|
||||||
|
#include <package/solver/SolverProblem.h>
|
||||||
|
#include <package/solver/SolverProblemSolution.h>
|
||||||
|
#include <package/solver/SolverRepository.h>
|
||||||
|
#include <package/solver/SolverResult.h>
|
||||||
|
|
||||||
#include "AutoDeleter.h"
|
#include "AutoDeleter.h"
|
||||||
#include "AutoLocker.h"
|
#include "AutoLocker.h"
|
||||||
@@ -50,8 +58,7 @@ enum {
|
|||||||
|
|
||||||
|
|
||||||
using namespace BPackageKit;
|
using namespace BPackageKit;
|
||||||
using BManager::BPrivate::BException;
|
using namespace BPackageKit::BManager::BPrivate;
|
||||||
using BManager::BPrivate::BFatalErrorException;
|
|
||||||
|
|
||||||
|
|
||||||
typedef std::map<BString, PackageInfoRef> PackageInfoMap;
|
typedef std::map<BString, PackageInfoRef> PackageInfoMap;
|
||||||
@@ -426,9 +433,14 @@ MainWindow::_RefreshPackageList()
|
|||||||
// installation only, as those must be handled a bit differently
|
// installation only, as those must be handled a bit differently
|
||||||
// upon uninstallation, since we'd no longer be able to pull them
|
// upon uninstallation, since we'd no longer be able to pull them
|
||||||
// down remotely.
|
// down remotely.
|
||||||
PackageInfoMap systemPackages;
|
BStringList systemFlaggedPackages;
|
||||||
// any packages flagged as a system package are added to this map.
|
// any packages flagged as a system package are added to this list.
|
||||||
// such packages cannot be uninstalled, nor can any of their deps.
|
// such packages cannot be uninstalled, nor can any of their deps.
|
||||||
|
PackageInfoMap systemInstalledPackages;
|
||||||
|
// any packages installed in system are added to this list.
|
||||||
|
// This is later used for dependency resolution of the actual
|
||||||
|
// system packages in order to compute the list of protected
|
||||||
|
// dependencies indicated above.
|
||||||
|
|
||||||
for (int32 i = 0; i < packages.CountItems(); i++) {
|
for (int32 i = 0; i < packages.CountItems(); i++) {
|
||||||
BSolverPackage* package = packages.ItemAt(i);
|
BSolverPackage* package = packages.ItemAt(i);
|
||||||
@@ -473,6 +485,10 @@ MainWindow::_RefreshPackageList()
|
|||||||
manager.SystemRepository())) {
|
manager.SystemRepository())) {
|
||||||
modelInfo->AddInstallationLocation(
|
modelInfo->AddInstallationLocation(
|
||||||
B_PACKAGE_INSTALLATION_LOCATION_SYSTEM);
|
B_PACKAGE_INSTALLATION_LOCATION_SYSTEM);
|
||||||
|
if (!modelInfo->IsSystemPackage()) {
|
||||||
|
systemInstalledPackages[repoPackageInfo.FileName()]
|
||||||
|
= modelInfo;
|
||||||
|
}
|
||||||
} else if (repository == static_cast<const BSolverRepository*>(
|
} else if (repository == static_cast<const BSolverRepository*>(
|
||||||
manager.HomeRepository())) {
|
manager.HomeRepository())) {
|
||||||
modelInfo->AddInstallationLocation(
|
modelInfo->AddInstallationLocation(
|
||||||
@@ -481,7 +497,7 @@ MainWindow::_RefreshPackageList()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (modelInfo->IsSystemPackage())
|
if (modelInfo->IsSystemPackage())
|
||||||
systemPackages[modelInfo->Title()] = modelInfo;
|
systemFlaggedPackages.Add(repoPackageInfo.FileName());
|
||||||
}
|
}
|
||||||
|
|
||||||
BAutolock lock(fModel.Lock());
|
BAutolock lock(fModel.Lock());
|
||||||
@@ -511,11 +527,72 @@ MainWindow::_RefreshPackageList()
|
|||||||
fModel.AddDepot(it->second);
|
fModel.AddDepot(it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PackageInfoMap::iterator it = systemPackages.begin();
|
// compute the OS package dependencies
|
||||||
it != systemPackages.end(); ++it) {
|
// create the solver
|
||||||
// TODO: need to resolve deps on all of these and correspondingly
|
BSolver* solver;
|
||||||
// mark all of those as system packages as well, so we know
|
status_t error = BSolver::Create(solver);
|
||||||
// not to show uninstallation as an option.
|
if (error != B_OK) {
|
||||||
|
printf("failed to create solver: %s\n", strerror(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectDeleter<BSolver> solverDeleter(solver);
|
||||||
|
BPath systemPath;
|
||||||
|
error = find_directory(B_SYSTEM_PACKAGES_DIRECTORY, &systemPath);
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("Unable to retrieve system packages directory: %s\n", strerror(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the "installed" repository with the given packages
|
||||||
|
BSolverRepository installedRepository;
|
||||||
|
{
|
||||||
|
BRepositoryBuilder installedRepositoryBuilder(installedRepository,
|
||||||
|
"installed");
|
||||||
|
for (int32 i = 0; i < systemFlaggedPackages.CountStrings(); i++) {
|
||||||
|
BPath packagePath(systemPath);
|
||||||
|
packagePath.Append(systemFlaggedPackages.StringAt(i));
|
||||||
|
installedRepositoryBuilder.AddPackage(packagePath.Path());
|
||||||
|
}
|
||||||
|
installedRepositoryBuilder.AddToSolver(solver, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add system repository
|
||||||
|
BSolverRepository systemRepository;
|
||||||
|
{
|
||||||
|
BRepositoryBuilder systemRepositoryBuilder(systemRepository,
|
||||||
|
"system");
|
||||||
|
for (PackageInfoMap::iterator it = systemInstalledPackages.begin();
|
||||||
|
it != systemInstalledPackages.end(); ++it) {
|
||||||
|
BPath packagePath(systemPath);
|
||||||
|
packagePath.Append(it->first);
|
||||||
|
systemRepositoryBuilder.AddPackage(packagePath.Path());
|
||||||
|
}
|
||||||
|
systemRepositoryBuilder.AddToSolver(solver, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// solve
|
||||||
|
error = solver->VerifyInstallation();
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("failed to compute packages to install: %s\n", strerror(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BSolverResult solverResult;
|
||||||
|
error = solver->GetResult(solverResult);
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("failed to get packages to install: %s\n", strerror(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32 i = 0; const BSolverResultElement* element
|
||||||
|
= solverResult.ElementAt(i); i++) {
|
||||||
|
BSolverPackage* package = element->Package();
|
||||||
|
if (element->Type() == BSolverResultElement::B_TYPE_INSTALL) {
|
||||||
|
PackageInfoMap::iterator it = systemInstalledPackages.find(package->Info().FileName());
|
||||||
|
if (it != systemInstalledPackages.end())
|
||||||
|
it->second->SetSystemDependency(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user