void PackageManager::_PrintResult(InstalledRepository& installationRepository) { if (!installationRepository.HasChanges()) return; printf(" in %s:\n", installationRepository.Name().String()); PackageList& packagesToActivate = installationRepository.PackagesToActivate(); PackageList& packagesToDeactivate = installationRepository.PackagesToDeactivate(); for (int32 i = 0; BSolverPackage* package = packagesToActivate.ItemAt(i); i++) { printf(" install package %s from repository %s\n", package->Info().FileName().String(), package->Repository()->Name().String()); } for (int32 i = 0; BSolverPackage* package = packagesToDeactivate.ItemAt(i); i++) { printf(" uninstall package %s\n", package->VersionedName().String()); } // TODO: Print file/download sizes. Unfortunately our package infos don't // contain the file size. Which is probably correct. The file size (and possibly // other information) should, however, be provided by the repository cache in // some way. Extend BPackageInfo? Create a BPackageFileInfo? }
void PackageManager::_PrintResult(InstalledRepository& installationRepository) { if (!installationRepository.HasChanges()) return; printf(" in %s:\n", installationRepository.Name().String()); PackageList& packagesToActivate = installationRepository.PackagesToActivate(); PackageList& packagesToDeactivate = installationRepository.PackagesToDeactivate(); BStringList upgradedPackages; for (int32 i = 0; BSolverPackage* installPackage = packagesToActivate.ItemAt(i); i++) { for (int32 j = 0; BSolverPackage* uninstallPackage = packagesToDeactivate.ItemAt(j); j++) { if (installPackage->Info().Name() == uninstallPackage->Info().Name()) { upgradedPackages.Add(installPackage->Info().Name()); break; } } } for (int32 i = 0; BSolverPackage* package = packagesToActivate.ItemAt(i); i++) { BString repository; if (dynamic_cast<MiscLocalRepository*>(package->Repository()) != NULL) repository = "local file"; else repository.SetToFormat("repository %s", package->Repository()->Name().String()); if (upgradedPackages.HasString(package->Info().Name())) { printf(" upgrade package %s to %s from %s\n", package->Info().Name().String(), package->Info().Version().ToString().String(), repository.String()); } else { printf(" install package %s-%s from %s\n", package->Info().Name().String(), package->Info().Version().ToString().String(), repository.String()); } } for (int32 i = 0; BSolverPackage* package = packagesToDeactivate.ItemAt(i); i++) { if (upgradedPackages.HasString(package->Info().Name())) continue; printf(" uninstall package %s\n", package->VersionedName().String()); } // TODO: Print file/download sizes. Unfortunately our package infos don't // contain the file size. Which is probably correct. The file size (and possibly // other information) should, however, be provided by the repository cache in // some way. Extend BPackageInfo? Create a BPackageFileInfo? }
bool PackageManager::_AddResults(InstalledRepository& repository, ResultWindow* window) { if (!repository.HasChanges()) return false; return window->AddLocationChanges(repository.Name(), repository.PackagesToActivate(), fPackagesAddedByUser, repository.PackagesToDeactivate(), fPackagesRemovedByUser); }
bool PackageManager::_AddResults(InstalledRepository& repository, ResultWindow* window) { if (!repository.HasChanges()) return false; ProblemWindow::SolverPackageSet installPackages; ProblemWindow::SolverPackageSet uninstallPackages; if (fCurrentInstallPackage != NULL) installPackages.insert(fCurrentInstallPackage); if (fCurrentUninstallPackage != NULL) uninstallPackages.insert(fCurrentUninstallPackage); return window->AddLocationChanges(repository.Name(), repository.PackagesToActivate(), installPackages, repository.PackagesToDeactivate(), uninstallPackages); }
void BPackageManager::_PreparePackageChanges( InstalledRepository& installationRepository) { if (!installationRepository.HasChanges()) return; PackageList& packagesToActivate = installationRepository.PackagesToActivate(); PackageList& packagesToDeactivate = installationRepository.PackagesToDeactivate(); // create the transaction Transaction* transaction = new Transaction(installationRepository); if (!fTransactions.AddItem(transaction)) { delete transaction; throw std::bad_alloc(); } status_t error = fInstallationInterface->PrepareTransaction(*transaction); if (error != B_OK) DIE(error, "failed to create transaction"); // download the new packages and prepare the transaction for (int32 i = 0; BSolverPackage* package = packagesToActivate.ItemAt(i); i++) { // get package URL and target entry BString fileName(package->Info().FileName()); if (fileName.IsEmpty()) throw std::bad_alloc(); BEntry entry; error = entry.SetTo(&transaction->TransactionDirectory(), fileName); if (error != B_OK) DIE(error, "failed to create package entry"); RemoteRepository* remoteRepository = dynamic_cast<RemoteRepository*>(package->Repository()); if (remoteRepository != NULL) { // download the package BString url = remoteRepository->Config().PackagesURL(); url << '/' << fileName; status_t error = DownloadPackage(url, entry, package->Info().Checksum()); if (error != B_OK) DIE(error, "failed to download package"); } else if (package->Repository() != &installationRepository) { // clone the existing package LocalRepository* localRepository = dynamic_cast<LocalRepository*>(package->Repository()); if (localRepository == NULL) { DIE("internal error: repository %s is not a local repository", package->Repository()->Name().String()); } _ClonePackageFile(localRepository, package, entry); } // add package to transaction if (!transaction->ActivationTransaction().AddPackageToActivate( fileName)) { throw std::bad_alloc(); } } for (int32 i = 0; BSolverPackage* package = packagesToDeactivate.ItemAt(i); i++) { // add package to transaction if (!transaction->ActivationTransaction().AddPackageToDeactivate( package->Info().FileName())) { throw std::bad_alloc(); } } }