HaikuDepot: Wrap dependency resolution in try/catch block.
- Ensure that any exceptions thrown by the package kit are caught and handled.
This commit is contained in:
@@ -528,71 +528,83 @@ MainWindow::_RefreshPackageList()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// compute the OS package dependencies
|
// compute the OS package dependencies
|
||||||
// create the solver
|
try {
|
||||||
BSolver* solver;
|
// create the solver
|
||||||
status_t error = BSolver::Create(solver);
|
BSolver* solver;
|
||||||
if (error != B_OK) {
|
status_t error = BSolver::Create(solver);
|
||||||
printf("failed to create solver: %s\n", strerror(error));
|
if (error != B_OK)
|
||||||
return;
|
throw BFatalErrorException(error, "Failed to create solver.");
|
||||||
}
|
|
||||||
|
|
||||||
ObjectDeleter<BSolver> solverDeleter(solver);
|
ObjectDeleter<BSolver> solverDeleter(solver);
|
||||||
BPath systemPath;
|
BPath systemPath;
|
||||||
error = find_directory(B_SYSTEM_PACKAGES_DIRECTORY, &systemPath);
|
error = find_directory(B_SYSTEM_PACKAGES_DIRECTORY, &systemPath);
|
||||||
if (error != B_OK) {
|
if (error != B_OK) {
|
||||||
printf("Unable to retrieve system packages directory: %s\n", strerror(error));
|
throw BFatalErrorException(error, "Unable to retrieve system "
|
||||||
return;
|
"packages directory.");
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
// add the "installed" repository with the given packages
|
||||||
BSolverRepository systemRepository;
|
BSolverRepository installedRepository;
|
||||||
{
|
{
|
||||||
BRepositoryBuilder systemRepositoryBuilder(systemRepository,
|
BRepositoryBuilder installedRepositoryBuilder(installedRepository,
|
||||||
"system");
|
"installed");
|
||||||
for (PackageInfoMap::iterator it = systemInstalledPackages.begin();
|
for (int32 i = 0; i < systemFlaggedPackages.CountStrings(); i++) {
|
||||||
it != systemInstalledPackages.end(); ++it) {
|
BPath packagePath(systemPath);
|
||||||
BPath packagePath(systemPath);
|
packagePath.Append(systemFlaggedPackages.StringAt(i));
|
||||||
packagePath.Append(it->first);
|
installedRepositoryBuilder.AddPackage(packagePath.Path());
|
||||||
systemRepositoryBuilder.AddPackage(packagePath.Path());
|
}
|
||||||
|
installedRepositoryBuilder.AddToSolver(solver, true);
|
||||||
}
|
}
|
||||||
systemRepositoryBuilder.AddToSolver(solver, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// solve
|
// add system repository
|
||||||
error = solver->VerifyInstallation();
|
BSolverRepository systemRepository;
|
||||||
if (error != B_OK) {
|
{
|
||||||
printf("failed to compute packages to install: %s\n", strerror(error));
|
BRepositoryBuilder systemRepositoryBuilder(systemRepository,
|
||||||
return;
|
"system");
|
||||||
}
|
for (PackageInfoMap::iterator it = systemInstalledPackages.begin();
|
||||||
|
it != systemInstalledPackages.end(); ++it) {
|
||||||
BSolverResult solverResult;
|
BPath packagePath(systemPath);
|
||||||
error = solver->GetResult(solverResult);
|
packagePath.Append(it->first);
|
||||||
if (error != B_OK) {
|
systemRepositoryBuilder.AddPackage(packagePath.Path());
|
||||||
printf("failed to get packages to install: %s\n", strerror(error));
|
}
|
||||||
return;
|
systemRepositoryBuilder.AddToSolver(solver, false);
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// solve
|
||||||
|
error = solver->VerifyInstallation();
|
||||||
|
if (error != B_OK) {
|
||||||
|
throw BFatalErrorException(error, "Failed to compute packages to "
|
||||||
|
"install.");
|
||||||
|
}
|
||||||
|
|
||||||
|
BSolverResult solverResult;
|
||||||
|
error = solver->GetResult(solverResult);
|
||||||
|
if (error != B_OK) {
|
||||||
|
throw BFatalErrorException(error, "Failed to retrieve system "
|
||||||
|
"package dependency list.");
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (BFatalErrorException ex) {
|
||||||
|
printf("Fatal exception occurred while resolving system dependencies: "
|
||||||
|
"%s, details: %s\n", strerror(ex.Error()), ex.Details().String());
|
||||||
|
} catch (BNothingToDoException) {
|
||||||
|
// do nothing
|
||||||
|
} catch (BException ex) {
|
||||||
|
printf("Exception occurred while resolving system dependencies: %s\n",
|
||||||
|
ex.Message().String());
|
||||||
|
} catch (...) {
|
||||||
|
printf("Unknown exception occurred while resolving system "
|
||||||
|
"dependencies.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user