Ejemplo n.º 1
0
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;
			}
		}
	}
}
Ejemplo n.º 2
0
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();
	}
}