void PackageManager::InitInstalledRepository(InstalledRepository& repository) { const char* name = repository.InitialName(); BRepositoryBuilder repositoryBuilder(repository, name); if (Volume* volume = fRoot->GetVolume(repository.Location())) { for (PackageFileNameHashTable::Iterator it = volume->PackagesByFileNameIterator(); it.HasNext();) { Package* package = it.Next(); if (package->IsActive()) { BSolverPackage* solverPackage; repositoryBuilder.AddPackage(package->Info(), NULL, &solverPackage); fSolverPackages[package] = solverPackage; } } } }
void PackageManager::HandleUserChanges() { const PackageSet& packagesToActivate = fVolume->PackagesToBeActivated(); const PackageSet& packagesToDeactivate = fVolume->PackagesToBeDeactivated(); if (packagesToActivate.empty() && packagesToDeactivate.empty()) return; if (packagesToActivate.empty()) { // only packages removed -- use uninstall mode Init(B_ADD_INSTALLED_REPOSITORIES); BSolverPackageSpecifierList packagesToUninstall; for (PackageSet::const_iterator it = packagesToDeactivate.begin(); it != packagesToDeactivate.end(); ++it) { BSolverPackage* solverPackage = _SolverPackageFor(*it); if (solverPackage == NULL) continue; if (!packagesToUninstall.AppendSpecifier(solverPackage)) throw std::bad_alloc(); fPackagesRemovedByUser.insert(solverPackage); } if (fPackagesRemovedByUser.empty()) return; Uninstall(packagesToUninstall); } else { // packages added and (possibly) remove -- manually add/remove those // from the repository and use verify mode Init(B_ADD_INSTALLED_REPOSITORIES | B_ADD_REMOTE_REPOSITORIES | B_REFRESH_REPOSITORIES); // disable and remove uninstalled packages InstalledRepository& repository = InstallationRepository(); for (PackageSet::const_iterator it = packagesToDeactivate.begin(); it != packagesToDeactivate.end(); ++it) { BSolverPackage* solverPackage = _SolverPackageFor(*it); if (solverPackage == NULL) continue; repository.DisablePackage(solverPackage); if (!repository.PackagesToDeactivate().AddItem(solverPackage)) throw std::bad_alloc(); fPackagesRemovedByUser.insert(solverPackage); } // add new packages BRepositoryBuilder repositoryBuilder(repository); for (PackageSet::const_iterator it = packagesToActivate.begin(); it != packagesToActivate.end(); ++it) { Package* package = *it; BSolverPackage* solverPackage; repositoryBuilder.AddPackage(package->Info(), NULL, &solverPackage); fSolverPackages[package] = solverPackage; if (!repository.PackagesToActivate().AddItem(solverPackage)) throw std::bad_alloc(); fPackagesAddedByUser.insert(solverPackage); } if (fPackagesRemovedByUser.empty() && fPackagesAddedByUser.empty()) return; // TODO: When packages are moved out of the packages directory, we can't create // a complete "old-state" directory. VerifyInstallation(); } }