##################################################################### */
/*}}}*/
// Include Files /*{{{*/
+#include<config.h>
+
#include <apt-pkg/packagemanager.h>
#include <apt-pkg/orderlist.h>
#include <apt-pkg/depcache.h>
#include <apt-pkg/algorithms.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/sptr.h>
-
-#include <apti18n.h>
+
+#include <apti18n.h>
#include <iostream>
-#include <fcntl.h>
+#include <fcntl.h>
/*}}}*/
using namespace std;
if (List->IsNow(Pkg) == false)
continue;
- if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == true)
- continue;
-
new pkgAcqArchive(Owner,Sources,Recs,Cache[Pkg].InstVerIter(Cache),
FileNames[Pkg->ID]);
}
{
PkgIterator Pkg(Cache,*I);
- if (ConfigurePkgs == true &&
- pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false &&
- Configure(Pkg) == false)
+ if (ConfigurePkgs == true && Configure(Pkg) == false)
return false;
List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
{
PkgIterator Pkg(Cache,*I);
- if (ConfigurePkgs == true &&
- pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false &&
- Configure(Pkg) == false)
+ if (ConfigurePkgs == true && Configure(Pkg) == false)
return false;
List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
}
+ if ((Cache[Pkg].InstVerIter(Cache)->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
+ for (PkgIterator P = Pkg.Group().PackageList();
+ P.end() == false; P = Pkg.Group().NextPkg(P))
+ {
+ if (Pkg == P || List->IsFlag(P,pkgOrderList::Configured) == true ||
+ Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
+ (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
+ continue;
+ SmartConfigure(P);
+ }
+
// Sanity Check
if (List->IsFlag(Pkg,pkgOrderList::Configured) == false)
return _error->Error(_("Could not perform immediate configuration on '%s'. "
List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
- if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false)
- return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
- else
- return SmartRemove(Pkg.Group().FindPkg("all"));
+ return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
return true;
}
/*}}}*/
// ---------------------------------------------------------------------
/* This performs the task of handling pre-depends. */
bool pkgPackageManager::SmartUnPack(PkgIterator Pkg)
+{
+ return SmartUnPack(Pkg, true);
+}
+bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
{
// Check if it is already unpacked
if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure &&
Cache[Pkg].Keep() == true)
{
List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
- if (List->IsFlag(Pkg,pkgOrderList::Immediate) == true)
+ if (Immediate == true &&
+ List->IsFlag(Pkg,pkgOrderList::Immediate) == true)
if (SmartConfigure(Pkg) == false)
return _error->Error(_("Could not perform immediate configuration on already unpacked '%s'. "
"Please see man 5 apt.conf under APT::Immediate-Configure for details."),Pkg.Name());
return true;
}
+ VerIterator const instVer = Cache[Pkg].InstVerIter(Cache);
+
/* See if this packages install version has any predependencies
that are not met by 'now' packages. */
- for (DepIterator D = Cache[Pkg].InstVerIter(Cache).DependsList();
+ for (DepIterator D = instVer.DependsList();
D.end() == false; )
{
// Compute a single dependency element (glob or)
// Check for reverse conflicts.
if (CheckRConflicts(Pkg,Pkg.RevDependsList(),
- Cache[Pkg].InstVerIter(Cache).VerStr()) == false)
+ instVer.VerStr()) == false)
return false;
- for (PrvIterator P = Cache[Pkg].InstVerIter(Cache).ProvidesList();
+ for (PrvIterator P = instVer.ProvidesList();
P.end() == false; P++)
CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
- if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false)
- {
- if(Install(Pkg,FileNames[Pkg->ID]) == false)
- return false;
- } else {
- // Pseudo packages will not be unpacked - instead we will do this
- // for the "real" package, but only once and if it is already
- // configured we don't need to unpack it again…
- PkgIterator const P = Pkg.Group().FindPkg("all");
- if (List->IsFlag(P,pkgOrderList::UnPacked) != true &&
- List->IsFlag(P,pkgOrderList::Configured) != true &&
- P.State() != pkgCache::PkgIterator::NeedsNothing) {
- if (SmartUnPack(P) == false)
- return false;
- }
- }
List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
-
+
+ if ((instVer->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
+ for (PkgIterator P = Pkg.Group().PackageList();
+ P.end() == false; P = Pkg.Group().NextPkg(P))
+ {
+ if (Pkg == P || List->IsFlag(P,pkgOrderList::UnPacked) == true ||
+ Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
+ (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
+ continue;
+ SmartUnPack(P, false);
+ }
+
+ if(Install(Pkg,FileNames[Pkg->ID]) == false)
+ return false;
+
// Perform immedate configuration of the package.
- if (List->IsFlag(Pkg,pkgOrderList::Immediate) == true)
+ if (Immediate == true &&
+ List->IsFlag(Pkg,pkgOrderList::Immediate) == true)
if (SmartConfigure(Pkg) == false)
return _error->Error(_("Could not perform immediate configuration on '%s'. "
"Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),2);