1 // -*- mode: cpp; mode: fold -*-
3 // $Id: depcache.cc,v 1.25 2001/05/27 05:36:04 jgg Exp $
4 /* ######################################################################
6 Dependency Cache - Caches Dependency information.
8 ##################################################################### */
10 // Include Files /*{{{*/
11 #include <apt-pkg/depcache.h>
12 #include <apt-pkg/version.h>
13 #include <apt-pkg/error.h>
14 #include <apt-pkg/sptr.h>
15 #include <apt-pkg/algorithms.h>
17 #include <apt-pkg/fileutl.h>
18 #include <apt-pkg/strutl.h>
19 #include <apt-pkg/configuration.h>
20 #include <apt-pkg/pkgsystem.h>
21 #include <apt-pkg/tagfile.h>
31 // helper for Install-Recommends-Sections and Never-MarkAuto-Sections /*{{{*/
33 ConfigValueInSubTree(const char* SubTree
, const char *needle
)
35 Configuration::Item
const *Opts
;
36 Opts
= _config
->Tree(SubTree
);
37 if (Opts
!= 0 && Opts
->Child
!= 0)
40 for (; Opts
!= 0; Opts
= Opts
->Next
)
42 if (Opts
->Value
.empty() == true)
44 if (strcmp(needle
, Opts
->Value
.c_str()) == 0)
51 pkgDepCache::ActionGroup::ActionGroup(pkgDepCache
&cache
) : /*{{{*/
52 cache(cache
), released(false)
57 void pkgDepCache::ActionGroup::release()
61 if(cache
.group_level
== 0)
62 std::cerr
<< "W: Unbalanced action groups, expect badness" << std::endl
;
67 if(cache
.group_level
== 0)
75 pkgDepCache::ActionGroup::~ActionGroup()
80 // DepCache::pkgDepCache - Constructors /*{{{*/
81 // ---------------------------------------------------------------------
83 static bool DebugMarker
;
84 static bool DebugAutoInstall
;
86 pkgDepCache::pkgDepCache(pkgCache
*pCache
,Policy
*Plcy
) :
87 group_level(0), Cache(pCache
), PkgState(0), DepState(0)
89 DebugMarker
= _config
->FindB("Debug::pkgDepCache::Marker", false);
90 DebugAutoInstall
= _config
->FindB("Debug::pkgDepCache::AutoInstall", false);
94 delLocalPolicy
= LocalPolicy
= new Policy
;
97 // DepCache::~pkgDepCache - Destructor /*{{{*/
98 // ---------------------------------------------------------------------
100 pkgDepCache::~pkgDepCache()
104 delete delLocalPolicy
;
107 // DepCache::Init - Generate the initial extra structures. /*{{{*/
108 // ---------------------------------------------------------------------
109 /* This allocats the extension buffers and initializes them. */
110 bool pkgDepCache::Init(OpProgress
*Prog
)
112 // Suppress mark updates during this operation (just in case) and
113 // run a mark operation when Init terminates.
114 ActionGroup
actions(*this);
118 PkgState
= new StateCache
[Head().PackageCount
];
119 DepState
= new unsigned char[Head().DependsCount
];
120 memset(PkgState
,0,sizeof(*PkgState
)*Head().PackageCount
);
121 memset(DepState
,0,sizeof(*DepState
)*Head().DependsCount
);
125 Prog
->OverallProgress(0,2*Head().PackageCount
,Head().PackageCount
,
126 _("Building dependency tree"));
127 Prog
->SubProgress(Head().PackageCount
,_("Candidate versions"));
130 /* Set the current state of everything. In this state all of the
131 packages are kept exactly as is. See AllUpgrade */
133 for (PkgIterator I
= PkgBegin(); I
.end() != true; I
++,Done
++)
135 if (Prog
!= 0 && Done%20
== 0)
136 Prog
->Progress(Done
);
138 // Find the proper cache slot
139 StateCache
&State
= PkgState
[I
->ID
];
142 // Figure out the install version
143 State
.CandidateVer
= GetCandidateVer(I
);
144 State
.InstallVer
= I
.CurrentVer();
145 State
.Mode
= ModeKeep
;
147 State
.Update(I
,*this);
153 Prog
->OverallProgress(Head().PackageCount
,2*Head().PackageCount
,
155 _("Building dependency tree"));
156 Prog
->SubProgress(Head().PackageCount
,_("Dependency generation"));
167 bool pkgDepCache::readStateFile(OpProgress
*Prog
) /*{{{*/
170 string state
= _config
->FindDir("Dir::State") + "extended_states";
171 if(FileExists(state
)) {
172 state_file
.Open(state
, FileFd::ReadOnly
);
173 int file_size
= state_file
.Size();
175 Prog
->OverallProgress(0, file_size
, 1,
176 _("Reading state information"));
178 pkgTagFile
tagfile(&state_file
);
179 pkgTagSection section
;
181 bool debug_autoremove
=_config
->FindB("Debug::pkgAutoRemove",false);
182 while(tagfile
.Step(section
)) {
183 string pkgname
= section
.FindS("Package");
184 pkgCache::PkgIterator pkg
=Cache
->FindPkg(pkgname
);
185 // Silently ignore unknown packages and packages with no actual
187 if(!pkg
.end() && !pkg
.VersionList().end()) {
188 short reason
= section
.FindI("Auto-Installed", 0);
190 PkgState
[pkg
->ID
].Flags
|= Flag::Auto
;
192 std::cout
<< "Auto-Installed : " << pkgname
<< std::endl
;
195 Prog
->OverallProgress(amt
, file_size
, 1,
196 _("Reading state information"));
199 Prog
->OverallProgress(file_size
, file_size
, 1,
200 _("Reading state information"));
207 bool pkgDepCache::writeStateFile(OpProgress
*prog
, bool InstalledOnly
) /*{{{*/
209 bool debug_autoremove
= _config
->FindB("Debug::pkgAutoRemove",false);
212 std::clog
<< "pkgDepCache::writeStateFile()" << std::endl
;
215 string state
= _config
->FindDir("Dir::State") + "extended_states";
217 // if it does not exist, create a empty one
218 if(!FileExists(state
))
220 StateFile
.Open(state
, FileFd::WriteEmpty
);
225 if(!StateFile
.Open(state
, FileFd::ReadOnly
))
226 return _error
->Error(_("Failed to open StateFile %s"),
230 string outfile
= state
+ ".tmp";
231 if((OutFile
= fopen(outfile
.c_str(),"w")) == NULL
)
232 return _error
->Error(_("Failed to write temporary StateFile %s"),
235 // first merge with the existing sections
236 pkgTagFile
tagfile(&StateFile
);
237 pkgTagSection section
;
238 std::set
<string
> pkgs_seen
;
239 const char *nullreorderlist
[] = {0};
240 while(tagfile
.Step(section
)) {
241 string pkgname
= section
.FindS("Package");
242 // Silently ignore unknown packages and packages with no actual
244 pkgCache::PkgIterator pkg
=Cache
->FindPkg(pkgname
);
245 if(pkg
.end() || pkg
.VersionList().end())
247 bool newAuto
= (PkgState
[pkg
->ID
].Flags
& Flag::Auto
);
248 if(_config
->FindB("Debug::pkgAutoRemove",false))
249 std::clog
<< "Update existing AutoInstall info: "
250 << pkg
.Name() << std::endl
;
251 TFRewriteData rewrite
[2];
252 rewrite
[0].Tag
= "Auto-Installed";
253 rewrite
[0].Rewrite
= newAuto
? "1" : "0";
254 rewrite
[0].NewTag
= 0;
256 TFRewrite(OutFile
, section
, nullreorderlist
, rewrite
);
257 fprintf(OutFile
,"\n");
258 pkgs_seen
.insert(pkgname
);
261 // then write the ones we have not seen yet
262 std::ostringstream ostr
;
263 for(pkgCache::PkgIterator pkg
=Cache
->PkgBegin(); !pkg
.end(); pkg
++) {
264 if(PkgState
[pkg
->ID
].Flags
& Flag::Auto
) {
265 if (pkgs_seen
.find(pkg
.Name()) != pkgs_seen
.end()) {
267 std::clog
<< "Skipping already written " << pkg
.Name() << std::endl
;
270 // skip not installed ones if requested
271 if(InstalledOnly
&& pkg
->CurrentVer
== 0)
274 std::clog
<< "Writing new AutoInstall: "
275 << pkg
.Name() << std::endl
;
276 ostr
.str(string(""));
277 ostr
<< "Package: " << pkg
.Name()
278 << "\nAuto-Installed: 1\n\n";
279 fprintf(OutFile
,"%s",ostr
.str().c_str());
280 fprintf(OutFile
,"\n");
285 // move the outfile over the real file and set permissions
286 rename(outfile
.c_str(), state
.c_str());
287 chmod(state
.c_str(), 0644);
292 // DepCache::CheckDep - Checks a single dependency /*{{{*/
293 // ---------------------------------------------------------------------
294 /* This first checks the dependency against the main target package and
295 then walks along the package provides list and checks if each provides
296 will be installed then checks the provides against the dep. Res will be
297 set to the package which was used to satisfy the dep. */
298 bool pkgDepCache::CheckDep(DepIterator Dep
,int Type
,PkgIterator
&Res
)
300 Res
= Dep
.TargetPkg();
302 /* Check simple depends. A depends -should- never self match but
303 we allow it anyhow because dpkg does. Technically it is a packaging
304 bug. Conflicts may never self match */
305 if (Dep
.TargetPkg() != Dep
.ParentPkg() ||
306 (Dep
->Type
!= Dep::Conflicts
&& Dep
->Type
!= Dep::DpkgBreaks
&& Dep
->Type
!= Dep::Obsoletes
))
308 PkgIterator Pkg
= Dep
.TargetPkg();
309 // Check the base package
310 if (Type
== NowVersion
&& Pkg
->CurrentVer
!= 0)
311 if (VS().CheckDep(Pkg
.CurrentVer().VerStr(),Dep
->CompareOp
,
312 Dep
.TargetVer()) == true)
315 if (Type
== InstallVersion
&& PkgState
[Pkg
->ID
].InstallVer
!= 0)
316 if (VS().CheckDep(PkgState
[Pkg
->ID
].InstVerIter(*this).VerStr(),
317 Dep
->CompareOp
,Dep
.TargetVer()) == true)
320 if (Type
== CandidateVersion
&& PkgState
[Pkg
->ID
].CandidateVer
!= 0)
321 if (VS().CheckDep(PkgState
[Pkg
->ID
].CandidateVerIter(*this).VerStr(),
322 Dep
->CompareOp
,Dep
.TargetVer()) == true)
326 if (Dep
->Type
== Dep::Obsoletes
)
329 // Check the providing packages
330 PrvIterator P
= Dep
.TargetPkg().ProvidesList();
331 PkgIterator Pkg
= Dep
.ParentPkg();
332 for (; P
.end() != true; P
++)
334 /* Provides may never be applied against the same package if it is
335 a conflicts. See the comment above. */
336 if (P
.OwnerPkg() == Pkg
&&
337 (Dep
->Type
== Dep::Conflicts
|| Dep
->Type
== Dep::DpkgBreaks
))
340 // Check if the provides is a hit
341 if (Type
== NowVersion
)
343 if (P
.OwnerPkg().CurrentVer() != P
.OwnerVer())
347 if (Type
== InstallVersion
)
349 StateCache
&State
= PkgState
[P
.OwnerPkg()->ID
];
350 if (State
.InstallVer
!= (Version
*)P
.OwnerVer())
354 if (Type
== CandidateVersion
)
356 StateCache
&State
= PkgState
[P
.OwnerPkg()->ID
];
357 if (State
.CandidateVer
!= (Version
*)P
.OwnerVer())
361 // Compare the versions.
362 if (VS().CheckDep(P
.ProvideVersion(),Dep
->CompareOp
,Dep
.TargetVer()) == true)
372 // DepCache::AddSizes - Add the packages sizes to the counters /*{{{*/
373 // ---------------------------------------------------------------------
374 /* Call with Mult = -1 to preform the inverse opration */
375 void pkgDepCache::AddSizes(const PkgIterator
&Pkg
,signed long Mult
)
377 StateCache
&P
= PkgState
[Pkg
->ID
];
379 if (Pkg
->VersionList
== 0)
382 if (Pkg
.State() == pkgCache::PkgIterator::NeedsConfigure
&&
386 // Compute the size data
387 if (P
.NewInstall() == true)
389 iUsrSize
+= (signed)(Mult
*P
.InstVerIter(*this)->InstalledSize
);
390 iDownloadSize
+= (signed)(Mult
*P
.InstVerIter(*this)->Size
);
395 if (Pkg
->CurrentVer
!= 0 &&
396 (P
.InstallVer
!= (Version
*)Pkg
.CurrentVer() ||
397 (P
.iFlags
& ReInstall
) == ReInstall
) && P
.InstallVer
!= 0)
399 iUsrSize
+= (signed)(Mult
*((signed)P
.InstVerIter(*this)->InstalledSize
-
400 (signed)Pkg
.CurrentVer()->InstalledSize
));
401 iDownloadSize
+= (signed)(Mult
*P
.InstVerIter(*this)->Size
);
406 if (Pkg
.State() == pkgCache::PkgIterator::NeedsUnpack
&&
409 iDownloadSize
+= (signed)(Mult
*P
.InstVerIter(*this)->Size
);
414 if (Pkg
->CurrentVer
!= 0 && P
.InstallVer
== 0)
416 iUsrSize
-= (signed)(Mult
*Pkg
.CurrentVer()->InstalledSize
);
421 // DepCache::AddStates - Add the package to the state counter /*{{{*/
422 // ---------------------------------------------------------------------
423 /* This routine is tricky to use, you must make sure that it is never
424 called twice for the same package. This means the Remove/Add section
425 should be as short as possible and not encompass any code that will
426 calld Remove/Add itself. Remember, dependencies can be circular so
427 while processing a dep for Pkg it is possible that Add/Remove
428 will be called on Pkg */
429 void pkgDepCache::AddStates(const PkgIterator
&Pkg
,int Add
)
431 StateCache
&State
= PkgState
[Pkg
->ID
];
433 // The Package is broken (either minimal dep or policy dep)
434 if ((State
.DepState
& DepInstMin
) != DepInstMin
)
436 if ((State
.DepState
& DepInstPolicy
) != DepInstPolicy
)
437 iPolicyBrokenCount
+= Add
;
440 if (Pkg
.State() != PkgIterator::NeedsNothing
)
444 if (Pkg
->CurrentVer
== 0)
446 if (State
.Mode
== ModeDelete
&&
447 (State
.iFlags
| Purge
) == Purge
&& Pkg
.Purge() == false)
450 if (State
.Mode
== ModeInstall
)
455 // Installed, no upgrade
456 if (State
.Status
== 0)
458 if (State
.Mode
== ModeDelete
)
461 if ((State
.iFlags
& ReInstall
) == ReInstall
)
467 // Alll 3 are possible
468 if (State
.Mode
== ModeDelete
)
470 if (State
.Mode
== ModeKeep
)
472 if (State
.Mode
== ModeInstall
)
476 // DepCache::BuildGroupOrs - Generate the Or group dep data /*{{{*/
477 // ---------------------------------------------------------------------
478 /* The or group results are stored in the last item of the or group. This
479 allows easy detection of the state of a whole or'd group. */
480 void pkgDepCache::BuildGroupOrs(VerIterator
const &V
)
482 unsigned char Group
= 0;
484 for (DepIterator D
= V
.DependsList(); D
.end() != true; D
++)
486 // Build the dependency state.
487 unsigned char &State
= DepState
[D
->ID
];
489 /* Invert for Conflicts. We have to do this twice to get the
490 right sense for a conflicts group */
491 if (D
->Type
== Dep::Conflicts
||
492 D
->Type
== Dep::DpkgBreaks
||
493 D
->Type
== Dep::Obsoletes
)
496 // Add to the group if we are within an or..
500 if ((D
->CompareOp
& Dep::Or
) != Dep::Or
)
503 // Invert for Conflicts
504 if (D
->Type
== Dep::Conflicts
||
505 D
->Type
== Dep::DpkgBreaks
||
506 D
->Type
== Dep::Obsoletes
)
511 // DepCache::VersionState - Perform a pass over a dependency list /*{{{*/
512 // ---------------------------------------------------------------------
513 /* This is used to run over a dependency list and determine the dep
514 state of the list, filtering it through both a Min check and a Policy
515 check. The return result will have SetMin/SetPolicy low if a check
516 fails. It uses the DepState cache for it's computations. */
517 unsigned char pkgDepCache::VersionState(DepIterator D
,unsigned char Check
,
518 unsigned char SetMin
,
519 unsigned char SetPolicy
)
521 unsigned char Dep
= 0xFF;
523 while (D
.end() != true)
525 // Compute a single dependency element (glob or)
526 DepIterator Start
= D
;
527 unsigned char State
= 0;
528 for (bool LastOR
= true; D
.end() == false && LastOR
== true; D
++)
530 State
|= DepState
[D
->ID
];
531 LastOR
= (D
->CompareOp
& Dep::Or
) == Dep::Or
;
534 // Minimum deps that must be satisfied to have a working package
535 if (Start
.IsCritical() == true)
536 if ((State
& Check
) != Check
)
539 // Policy deps that must be satisfied to install the package
540 if (IsImportantDep(Start
) == true &&
541 (State
& Check
) != Check
)
548 // DepCache::DependencyState - Compute the 3 results for a dep /*{{{*/
549 // ---------------------------------------------------------------------
550 /* This is the main dependency computation bit. It computes the 3 main
551 results for a dependencys, Now, Install and Candidate. Callers must
552 invert the result if dealing with conflicts. */
553 unsigned char pkgDepCache::DependencyState(DepIterator
&D
)
555 unsigned char State
= 0;
557 if (CheckDep(D
,NowVersion
) == true)
559 if (CheckDep(D
,InstallVersion
) == true)
561 if (CheckDep(D
,CandidateVersion
) == true)
567 // DepCache::UpdateVerState - Compute the Dep member of the state /*{{{*/
568 // ---------------------------------------------------------------------
569 /* This determines the combined dependency representation of a package
570 for its two states now and install. This is done by using the pre-generated
571 dependency information. */
572 void pkgDepCache::UpdateVerState(PkgIterator Pkg
)
574 // Empty deps are always true
575 StateCache
&State
= PkgState
[Pkg
->ID
];
576 State
.DepState
= 0xFF;
578 // Check the Current state
579 if (Pkg
->CurrentVer
!= 0)
581 DepIterator D
= Pkg
.CurrentVer().DependsList();
582 State
.DepState
&= VersionState(D
,DepNow
,DepNowMin
,DepNowPolicy
);
585 /* Check the candidate state. We do not compare against the whole as
586 a candidate state but check the candidate version against the
588 if (State
.CandidateVer
!= 0)
590 DepIterator D
= State
.CandidateVerIter(*this).DependsList();
591 State
.DepState
&= VersionState(D
,DepInstall
,DepCandMin
,DepCandPolicy
);
594 // Check target state which can only be current or installed
595 if (State
.InstallVer
!= 0)
597 DepIterator D
= State
.InstVerIter(*this).DependsList();
598 State
.DepState
&= VersionState(D
,DepInstall
,DepInstMin
,DepInstPolicy
);
602 // DepCache::Update - Figure out all the state information /*{{{*/
603 // ---------------------------------------------------------------------
604 /* This will figure out the state of all the packages and all the
605 dependencies based on the current policy. */
606 void pkgDepCache::Update(OpProgress
*Prog
)
616 // Perform the depends pass
618 for (PkgIterator I
= PkgBegin(); I
.end() != true; I
++,Done
++)
620 if (Prog
!= 0 && Done%20
== 0)
621 Prog
->Progress(Done
);
622 for (VerIterator V
= I
.VersionList(); V
.end() != true; V
++)
624 unsigned char Group
= 0;
626 for (DepIterator D
= V
.DependsList(); D
.end() != true; D
++)
628 // Build the dependency state.
629 unsigned char &State
= DepState
[D
->ID
];
630 State
= DependencyState(D
);
632 // Add to the group if we are within an or..
635 if ((D
->CompareOp
& Dep::Or
) != Dep::Or
)
638 // Invert for Conflicts
639 if (D
->Type
== Dep::Conflicts
||
640 D
->Type
== Dep::DpkgBreaks
||
641 D
->Type
== Dep::Obsoletes
)
646 // Compute the pacakge dependency state and size additions
653 Prog
->Progress(Done
);
658 // DepCache::Update - Update the deps list of a package /*{{{*/
659 // ---------------------------------------------------------------------
660 /* This is a helper for update that only does the dep portion of the scan.
661 It is mainly meant to scan reverse dependencies. */
662 void pkgDepCache::Update(DepIterator D
)
664 // Update the reverse deps
665 for (;D
.end() != true; D
++)
667 unsigned char &State
= DepState
[D
->ID
];
668 State
= DependencyState(D
);
670 // Invert for Conflicts
671 if (D
->Type
== Dep::Conflicts
||
672 D
->Type
== Dep::DpkgBreaks
||
673 D
->Type
== Dep::Obsoletes
)
676 RemoveStates(D
.ParentPkg());
677 BuildGroupOrs(D
.ParentVer());
678 UpdateVerState(D
.ParentPkg());
679 AddStates(D
.ParentPkg());
683 // DepCache::Update - Update the related deps of a package /*{{{*/
684 // ---------------------------------------------------------------------
685 /* This is called whenever the state of a package changes. It updates
686 all cached dependencies related to this package. */
687 void pkgDepCache::Update(PkgIterator
const &Pkg
)
689 // Recompute the dep of the package
694 // Update the reverse deps
695 Update(Pkg
.RevDependsList());
697 // Update the provides map for the current ver
698 if (Pkg
->CurrentVer
!= 0)
699 for (PrvIterator P
= Pkg
.CurrentVer().ProvidesList();
700 P
.end() != true; P
++)
701 Update(P
.ParentPkg().RevDependsList());
703 // Update the provides map for the candidate ver
704 if (PkgState
[Pkg
->ID
].CandidateVer
!= 0)
705 for (PrvIterator P
= PkgState
[Pkg
->ID
].CandidateVerIter(*this).ProvidesList();
706 P
.end() != true; P
++)
707 Update(P
.ParentPkg().RevDependsList());
710 // DepCache::MarkKeep - Put the package in the keep state /*{{{*/
711 // ---------------------------------------------------------------------
713 void pkgDepCache::MarkKeep(PkgIterator
const &Pkg
, bool Soft
, bool FromUser
) {
714 MarkKeep(Pkg
, Soft
, FromUser
, 0);
717 void pkgDepCache::MarkKeep(PkgIterator
const &Pkg
, bool Soft
, bool FromUser
,
720 // Simplifies other routines.
721 if (Pkg
.end() == true)
724 /* Reject an attempt to keep a non-source broken installed package, those
726 if (Pkg
.State() == PkgIterator::NeedsUnpack
&&
727 Pkg
.CurrentVer().Downloadable() == false)
730 /** \todo Can this be moved later in the method? */
731 ActionGroup
group(*this);
733 /* We changed the soft state all the time so the UI is a bit nicer
735 StateCache
&P
= PkgState
[Pkg
->ID
];
737 P
.iFlags
|= AutoKept
;
739 P
.iFlags
&= ~AutoKept
;
741 // Check that it is not already kept
742 if (P
.Mode
== ModeKeep
)
745 // We dont even try to keep virtual packages..
746 if (Pkg
->VersionList
== 0)
748 #if 0 // reseting the autoflag here means we lose the
749 // auto-mark information if a user selects a package for removal
750 // but changes his mind then and sets it for keep again
751 // - this makes sense as default when all Garbage dependencies
752 // are automatically marked for removal (as aptitude does).
753 // setting a package for keep then makes it no longer autoinstalled
754 // for all other use-case this action is rather suprising
755 if(FromUser
&& !P
.Marked
)
756 P
.Flags
&= ~Flag::Auto
;
759 if (DebugMarker
== true)
760 std::clog
<< OutputInDepth(Depth
) << "MarkKeep " << Pkg
<< " FU=" << FromUser
<< std::endl
;
766 if (Pkg
->CurrentVer
== 0)
769 P
.InstallVer
= Pkg
.CurrentVer();
778 // DepCache::MarkDelete - Put the package in the delete state /*{{{*/
779 // ---------------------------------------------------------------------
781 void pkgDepCache::MarkDelete(PkgIterator
const &Pkg
, bool Purge
) {
782 MarkDelete(Pkg
, Purge
, 0);
785 void pkgDepCache::MarkDelete(PkgIterator
const &Pkg
, bool rPurge
,
786 unsigned long Depth
, bool FromUser
)
788 // Simplifies other routines.
789 if (Pkg
.end() == true)
792 ActionGroup
group(*this);
794 // Check that it is not already marked for delete
795 StateCache
&P
= PkgState
[Pkg
->ID
];
796 P
.iFlags
&= ~(AutoKept
| Purge
);
800 if ((P
.Mode
== ModeDelete
|| P
.InstallVer
== 0) &&
801 (Pkg
.Purge() == true || rPurge
== false))
804 // We dont even try to delete virtual packages..
805 if (Pkg
->VersionList
== 0)
808 // check if we are allowed to install the package
809 if (IsDeleteOk(Pkg
,rPurge
,Depth
,FromUser
) == false)
812 if (DebugMarker
== true)
813 std::clog
<< OutputInDepth(Depth
) << "MarkDelete " << Pkg
<< " FU=" << FromUser
<< std::endl
;
818 if (Pkg
->CurrentVer
== 0 && (Pkg
.Purge() == true || rPurge
== false))
829 // DepCache::IsDeleteOk - check if it is ok to remove this package /*{{{*/
830 // ---------------------------------------------------------------------
831 /* The default implementation just honors dpkg hold
832 But an application using this library can override this method
833 to control the MarkDelete behaviour */
834 bool pkgDepCache::IsDeleteOk(PkgIterator
const &Pkg
,bool rPurge
,
835 unsigned long Depth
, bool FromUser
)
837 if (FromUser
== false && Pkg
->SelectedState
== pkgCache::State::Hold
&& _config
->FindB("APT::Ignore-Hold",false) == false)
839 if (DebugMarker
== true)
840 std::clog
<< OutputInDepth(Depth
) << "Hold prevents MarkDelete of " << Pkg
<< " FU=" << FromUser
<< std::endl
;
846 // DepCache::MarkInstall - Put the package in the install state /*{{{*/
847 // ---------------------------------------------------------------------
849 void pkgDepCache::MarkInstall(PkgIterator
const &Pkg
,bool AutoInst
,
850 unsigned long Depth
, bool FromUser
,
851 bool ForceImportantDeps
)
856 // Simplifies other routines.
857 if (Pkg
.end() == true)
860 ActionGroup
group(*this);
862 /* Check that it is not already marked for install and that it can be
864 StateCache
&P
= PkgState
[Pkg
->ID
];
865 P
.iFlags
&= ~AutoKept
;
866 if ((P
.InstPolicyBroken() == false && P
.InstBroken() == false) &&
867 (P
.Mode
== ModeInstall
||
868 P
.CandidateVer
== (Version
*)Pkg
.CurrentVer()))
870 if (P
.CandidateVer
== (Version
*)Pkg
.CurrentVer() && P
.InstallVer
== 0)
871 MarkKeep(Pkg
, false, FromUser
, Depth
+1);
875 // See if there is even any possible instalation candidate
876 if (P
.CandidateVer
== 0)
878 // We dont even try to install virtual packages..
879 if (Pkg
->VersionList
== 0)
882 // check if we are allowed to install the package
883 if (IsInstallOk(Pkg
,AutoInst
,Depth
,FromUser
) == false)
886 /* Target the candidate version and remove the autoflag. We reset the
887 autoflag below if this was called recursively. Otherwise the user
888 should have the ability to de-auto a package by changing its state */
892 P
.Mode
= ModeInstall
;
893 P
.InstallVer
= P
.CandidateVer
;
897 // Set it to manual if it's a new install or cancelling the
898 // removal of a garbage package.
899 if(P
.Status
== 2 || (!Pkg
.CurrentVer().end() && !P
.Marked
))
900 P
.Flags
&= ~Flag::Auto
;
904 // Set it to auto if this is a new install.
906 P
.Flags
|= Flag::Auto
;
908 if (P
.CandidateVer
== (Version
*)Pkg
.CurrentVer())
915 if (AutoInst
== false)
918 if (DebugMarker
== true)
919 std::clog
<< OutputInDepth(Depth
) << "MarkInstall " << Pkg
<< " FU=" << FromUser
<< std::endl
;
921 DepIterator Dep
= P
.InstVerIter(*this).DependsList();
922 for (; Dep
.end() != true;)
925 DepIterator Start
= Dep
;
928 for (bool LastOR
= true; Dep
.end() == false && LastOR
== true; Dep
++,Ors
++)
930 LastOR
= (Dep
->CompareOp
& Dep::Or
) == Dep::Or
;
932 if ((DepState
[Dep
->ID
] & DepInstall
) == DepInstall
)
936 // Dep is satisfied okay.
940 /* Check if this dep should be consider for install. If it is a user
941 defined important dep and we are installed a new package then
942 it will be installed. Otherwise we only check for important
943 deps that have changed from the installed version
945 if (IsImportantDep(Start
) == false)
948 /* Check if any ImportantDep() (but not Critical) were added
949 * since we installed the package. Also check for deps that
950 * were satisfied in the past: for instance, if a version
951 * restriction in a Recommends was tightened, upgrading the
952 * package should follow that Recommends rather than causing the
953 * dependency to be removed. (bug #470115)
955 bool isNewImportantDep
= false;
956 bool isPreviouslySatisfiedImportantDep
= false;
957 if(!ForceImportantDeps
&& !Start
.IsCritical())
960 VerIterator instVer
= Pkg
.CurrentVer();
963 for (DepIterator D
= instVer
.DependsList(); D
.end() != true; D
++)
965 //FIXME: deal better with or-groups(?)
966 DepIterator LocalStart
= D
;
968 if(IsImportantDep(D
) && !D
.IsCritical() &&
969 Start
.TargetPkg() == D
.TargetPkg())
971 if(!isPreviouslySatisfiedImportantDep
)
974 while((D2
->CompareOp
& Dep::Or
) != 0)
977 isPreviouslySatisfiedImportantDep
=
978 (((*this)[D2
] & DepGNow
) != 0);
984 // this is a new dep if it was not found to be already
985 // a important dep of the installed pacakge
986 isNewImportantDep
= !found
;
989 if(isNewImportantDep
)
990 if(DebugAutoInstall
== true)
991 std::clog
<< OutputInDepth(Depth
) << "new important dependency: "
992 << Start
.TargetPkg().Name() << std::endl
;
993 if(isPreviouslySatisfiedImportantDep
)
994 if(DebugAutoInstall
== true)
995 std::clog
<< OutputInDepth(Depth
) << "previously satisfied important dependency on "
996 << Start
.TargetPkg().Name() << std::endl
;
998 // skip important deps if the package is already installed
999 if (Pkg
->CurrentVer
!= 0 && Start
.IsCritical() == false
1000 && !isNewImportantDep
&& !isPreviouslySatisfiedImportantDep
1001 && !ForceImportantDeps
)
1004 /* If we are in an or group locate the first or that can
1005 succeed. We have already cached this.. */
1006 for (; Ors
> 1 && (DepState
[Start
->ID
] & DepCVer
) != DepCVer
; Ors
--)
1009 /* This bit is for processing the possibilty of an install/upgrade
1010 fixing the problem */
1011 SPtrArray
<Version
*> List
= Start
.AllTargets();
1012 if (Start
->Type
!= Dep::DpkgBreaks
&&
1013 (DepState
[Start
->ID
] & DepCVer
) == DepCVer
)
1015 // Right, find the best version to install..
1016 Version
**Cur
= List
;
1017 PkgIterator P
= Start
.TargetPkg();
1018 PkgIterator
InstPkg(*Cache
,0);
1020 // See if there are direct matches (at the start of the list)
1021 for (; *Cur
!= 0 && (*Cur
)->ParentPkg
== P
.Index(); Cur
++)
1023 PkgIterator
Pkg(*Cache
,Cache
->PkgP
+ (*Cur
)->ParentPkg
);
1024 if (PkgState
[Pkg
->ID
].CandidateVer
!= *Cur
)
1030 // Select the highest priority providing package
1031 if (InstPkg
.end() == true)
1033 pkgPrioSortList(*Cache
,Cur
);
1034 for (; *Cur
!= 0; Cur
++)
1036 PkgIterator
Pkg(*Cache
,Cache
->PkgP
+ (*Cur
)->ParentPkg
);
1037 if (PkgState
[Pkg
->ID
].CandidateVer
!= *Cur
)
1044 if (InstPkg
.end() == false)
1046 if(DebugAutoInstall
== true)
1047 std::clog
<< OutputInDepth(Depth
) << "Installing " << InstPkg
.Name()
1048 << " as " << Start
.DepType() << " of " << Pkg
.Name()
1050 // now check if we should consider it a automatic dependency or not
1051 if(Pkg
.Section() && ConfigValueInSubTree("APT::Never-MarkAuto-Sections", Pkg
.Section()))
1053 if(DebugAutoInstall
== true)
1054 std::clog
<< OutputInDepth(Depth
) << "Setting NOT as auto-installed (direct "
1055 << Start
.DepType() << " of pkg in APT::Never-MarkAuto-Sections)" << std::endl
;
1056 MarkInstall(InstPkg
,true,Depth
+ 1, true);
1060 // mark automatic dependency
1061 MarkInstall(InstPkg
,true,Depth
+ 1, false, ForceImportantDeps
);
1062 // Set the autoflag, after MarkInstall because MarkInstall unsets it
1063 if (P
->CurrentVer
== 0)
1064 PkgState
[InstPkg
->ID
].Flags
|= Flag::Auto
;
1070 /* For conflicts we just de-install the package and mark as auto,
1071 Conflicts may not have or groups. For dpkg's Breaks we try to
1072 upgrade the package. */
1073 if (Start
->Type
== Dep::Conflicts
|| Start
->Type
== Dep::Obsoletes
||
1074 Start
->Type
== Dep::DpkgBreaks
)
1076 for (Version
**I
= List
; *I
!= 0; I
++)
1078 VerIterator
Ver(*this,*I
);
1079 PkgIterator Pkg
= Ver
.ParentPkg();
1081 if (Start
->Type
!= Dep::DpkgBreaks
)
1082 MarkDelete(Pkg
,false,Depth
+ 1, false);
1083 else if (PkgState
[Pkg
->ID
].CandidateVer
!= *I
)
1084 MarkInstall(Pkg
,true,Depth
+ 1, false, ForceImportantDeps
);
1091 // DepCache::IsInstallOk - check if it is ok to install this package /*{{{*/
1092 // ---------------------------------------------------------------------
1093 /* The default implementation just honors dpkg hold
1094 But an application using this library can override this method
1095 to control the MarkInstall behaviour */
1096 bool pkgDepCache::IsInstallOk(PkgIterator
const &Pkg
,bool AutoInst
,
1097 unsigned long Depth
, bool FromUser
)
1099 if (FromUser
== false && Pkg
->SelectedState
== pkgCache::State::Hold
&& _config
->FindB("APT::Ignore-Hold",false) == false)
1101 if (DebugMarker
== true)
1102 std::clog
<< OutputInDepth(Depth
) << "Hold prevents MarkInstall of " << Pkg
<< " FU=" << FromUser
<< std::endl
;
1108 // DepCache::SetReInstall - Set the reinstallation flag /*{{{*/
1109 // ---------------------------------------------------------------------
1111 void pkgDepCache::SetReInstall(PkgIterator
const &Pkg
,bool To
)
1113 ActionGroup
group(*this);
1118 StateCache
&P
= PkgState
[Pkg
->ID
];
1120 P
.iFlags
|= ReInstall
;
1122 P
.iFlags
&= ~ReInstall
;
1128 // DepCache::SetCandidateVersion - Change the candidate version /*{{{*/
1129 // ---------------------------------------------------------------------
1131 void pkgDepCache::SetCandidateVersion(VerIterator TargetVer
)
1133 ActionGroup
group(*this);
1135 pkgCache::PkgIterator Pkg
= TargetVer
.ParentPkg();
1136 StateCache
&P
= PkgState
[Pkg
->ID
];
1141 if (P
.CandidateVer
== P
.InstallVer
)
1142 P
.InstallVer
= (Version
*)TargetVer
;
1143 P
.CandidateVer
= (Version
*)TargetVer
;
1144 P
.Update(Pkg
,*this);
1151 void pkgDepCache::MarkAuto(const PkgIterator
&Pkg
, bool Auto
)
1153 StateCache
&state
= PkgState
[Pkg
->ID
];
1155 ActionGroup
group(*this);
1158 state
.Flags
|= Flag::Auto
;
1160 state
.Flags
&= ~Flag::Auto
;
1163 // StateCache::Update - Compute the various static display things /*{{{*/
1164 // ---------------------------------------------------------------------
1165 /* This is called whenever the Candidate version changes. */
1166 void pkgDepCache::StateCache::Update(PkgIterator Pkg
,pkgCache
&Cache
)
1169 VerIterator Ver
= CandidateVerIter(Cache
);
1171 // Use a null string or the version string
1172 if (Ver
.end() == true)
1175 CandVersion
= Ver
.VerStr();
1177 // Find the current version
1179 if (Pkg
->CurrentVer
!= 0)
1180 CurVersion
= Pkg
.CurrentVer().VerStr();
1182 // Strip off the epochs for display
1183 CurVersion
= StripEpoch(CurVersion
);
1184 CandVersion
= StripEpoch(CandVersion
);
1186 // Figure out if its up or down or equal
1187 Status
= Ver
.CompareVer(Pkg
.CurrentVer());
1188 if (Pkg
->CurrentVer
== 0 || Pkg
->VersionList
== 0 || CandidateVer
== 0)
1192 // StateCache::StripEpoch - Remove the epoch specifier from the version /*{{{*/
1193 // ---------------------------------------------------------------------
1195 const char *pkgDepCache::StateCache::StripEpoch(const char *Ver
)
1201 for (const char *I
= Ver
; *I
!= 0; I
++)
1207 // Policy::GetCandidateVer - Returns the Candidate install version /*{{{*/
1208 // ---------------------------------------------------------------------
1209 /* The default just returns the highest available version that is not
1210 a source and automatic. */
1211 pkgCache::VerIterator
pkgDepCache::Policy::GetCandidateVer(PkgIterator Pkg
)
1213 /* Not source/not automatic versions cannot be a candidate version
1214 unless they are already installed */
1215 VerIterator
Last(*(pkgCache
*)this,0);
1217 for (VerIterator I
= Pkg
.VersionList(); I
.end() == false; I
++)
1219 if (Pkg
.CurrentVer() == I
)
1222 for (VerFileIterator J
= I
.FileList(); J
.end() == false; J
++)
1224 if ((J
.File()->Flags
& Flag::NotSource
) != 0)
1227 /* Stash the highest version of a not-automatic source, we use it
1228 if there is nothing better */
1229 if ((J
.File()->Flags
& Flag::NotAutomatic
) != 0)
1231 if (Last
.end() == true)
1243 // Policy::IsImportantDep - True if the dependency is important /*{{{*/
1244 // ---------------------------------------------------------------------
1246 bool pkgDepCache::Policy::IsImportantDep(DepIterator Dep
)
1248 if(Dep
.IsCritical())
1250 else if(Dep
->Type
== pkgCache::Dep::Recommends
)
1252 if ( _config
->FindB("APT::Install-Recommends", false))
1254 // we suport a special mode to only install-recommends for certain
1256 // FIXME: this is a meant as a temporarly solution until the
1257 // recommends are cleaned up
1258 const char *sec
= Dep
.ParentVer().Section();
1259 if (sec
&& ConfigValueInSubTree("APT::Install-Recommends-Sections", sec
))
1262 else if(Dep
->Type
== pkgCache::Dep::Suggests
)
1263 return _config
->FindB("APT::Install-Suggests", false);
1268 pkgDepCache::DefaultRootSetFunc::DefaultRootSetFunc() /*{{{*/
1269 : constructedSuccessfully(false)
1271 Configuration::Item
const *Opts
;
1272 Opts
= _config
->Tree("APT::NeverAutoRemove");
1273 if (Opts
!= 0 && Opts
->Child
!= 0)
1276 for (; Opts
!= 0; Opts
= Opts
->Next
)
1278 if (Opts
->Value
.empty() == true)
1281 regex_t
*p
= new regex_t
;
1282 if(regcomp(p
,Opts
->Value
.c_str(),
1283 REG_EXTENDED
| REG_ICASE
| REG_NOSUB
) != 0)
1287 _error
->Error("Regex compilation error for APT::NeverAutoRemove");
1291 rootSetRegexp
.push_back(p
);
1295 constructedSuccessfully
= true;
1298 pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc() /*{{{*/
1300 for(unsigned int i
= 0; i
< rootSetRegexp
.size(); i
++)
1302 regfree(rootSetRegexp
[i
]);
1303 delete rootSetRegexp
[i
];
1307 bool pkgDepCache::DefaultRootSetFunc::InRootSet(const pkgCache::PkgIterator
&pkg
) /*{{{*/
1309 for(unsigned int i
= 0; i
< rootSetRegexp
.size(); i
++)
1310 if (regexec(rootSetRegexp
[i
], pkg
.Name(), 0, 0, 0) == 0)
1316 pkgDepCache::InRootSetFunc
*pkgDepCache::GetRootSetFunc() /*{{{*/
1318 DefaultRootSetFunc
*f
= new DefaultRootSetFunc
;
1319 if(f
->wasConstructedSuccessfully())
1328 bool pkgDepCache::MarkFollowsRecommends()
1330 return _config
->FindB("APT::AutoRemove::RecommendsImportant", true);
1333 bool pkgDepCache::MarkFollowsSuggests()
1335 return _config
->FindB("APT::AutoRemove::SuggestsImportant", false);
1338 // pkgDepCache::MarkRequired - the main mark algorithm /*{{{*/
1339 bool pkgDepCache::MarkRequired(InRootSetFunc
&userFunc
)
1341 bool follow_recommends
;
1342 bool follow_suggests
;
1343 bool debug_autoremove
= _config
->FindB("Debug::pkgAutoRemove",false);
1346 for(PkgIterator p
= PkgBegin(); !p
.end(); ++p
)
1348 PkgState
[p
->ID
].Marked
= false;
1349 PkgState
[p
->ID
].Garbage
= false;
1352 if(debug_autoremove
&& PkgState
[p
->ID
].Flags
& Flag::Auto
)
1353 std::clog
<< "AutoDep: " << p
.Name() << std::endl
;
1357 follow_recommends
= MarkFollowsRecommends();
1358 follow_suggests
= MarkFollowsSuggests();
1362 // do the mark part, this is the core bit of the algorithm
1363 for(PkgIterator p
= PkgBegin(); !p
.end(); ++p
)
1365 if(!(PkgState
[p
->ID
].Flags
& Flag::Auto
) ||
1366 (p
->Flags
& Flag::Essential
) ||
1367 userFunc
.InRootSet(p
))
1370 // the package is installed (and set to keep)
1371 if(PkgState
[p
->ID
].Keep() && !p
.CurrentVer().end())
1372 MarkPackage(p
, p
.CurrentVer(),
1373 follow_recommends
, follow_suggests
);
1374 // the package is to be installed
1375 else if(PkgState
[p
->ID
].Install())
1376 MarkPackage(p
, PkgState
[p
->ID
].InstVerIter(*this),
1377 follow_recommends
, follow_suggests
);
1384 // MarkPackage - mark a single package in Mark-and-Sweep /*{{{*/
1385 void pkgDepCache::MarkPackage(const pkgCache::PkgIterator
&pkg
,
1386 const pkgCache::VerIterator
&ver
,
1387 bool follow_recommends
,
1388 bool follow_suggests
)
1390 pkgDepCache::StateCache
&state
= PkgState
[pkg
->ID
];
1391 VerIterator currver
= pkg
.CurrentVer();
1392 VerIterator candver
= state
.CandidateVerIter(*this);
1393 VerIterator instver
= state
.InstVerIter(*this);
1396 // If a package was garbage-collected but is now being marked, we
1397 // should re-select it
1398 // For cases when a pkg is set to upgrade and this trigger the
1399 // removal of a no-longer used dependency. if the pkg is set to
1400 // keep again later it will result in broken deps
1401 if(state
.Delete() && state
.RemoveReason
= Unused
)
1404 mark_install(pkg
, false, false, NULL
);
1405 else if(ver
==pkg
.CurrentVer())
1406 MarkKeep(pkg
, false, false);
1408 instver
=state
.InstVerIter(*this);
1412 // For packages that are not going to be removed, ignore versions
1413 // other than the InstVer. For packages that are going to be
1414 // removed, ignore versions other than the current version.
1415 if(!(ver
== instver
&& !instver
.end()) &&
1416 !(ver
== currver
&& instver
.end() && !ver
.end()))
1419 // if we are marked already we are done
1423 bool debug_autoremove
= _config
->FindB("Debug::pkgAutoRemove", false);
1425 if(debug_autoremove
)
1427 std::clog
<< "Marking: " << pkg
.Name();
1429 std::clog
<< " " << ver
.VerStr();
1431 std::clog
<< ", Curr=" << currver
.VerStr();
1433 std::clog
<< ", Inst=" << instver
.VerStr();
1434 std::clog
<< std::endl
;
1441 for(DepIterator d
= ver
.DependsList(); !d
.end(); ++d
)
1443 if(d
->Type
== Dep::Depends
||
1444 d
->Type
== Dep::PreDepends
||
1445 (follow_recommends
&&
1446 d
->Type
== Dep::Recommends
) ||
1448 d
->Type
== Dep::Suggests
))
1450 // Try all versions of this package.
1451 for(VerIterator V
= d
.TargetPkg().VersionList();
1454 if(_system
->VS
->CheckDep(V
.VerStr(), d
->CompareOp
, d
.TargetVer()))
1456 if(debug_autoremove
)
1458 std::clog
<< "Following dep: " << d
.ParentPkg().Name()
1459 << " " << d
.ParentVer().VerStr() << " "
1460 << d
.DepType() << " "
1461 << d
.TargetPkg().Name();
1462 if((d
->CompareOp
& ~pkgCache::Dep::Or
) != pkgCache::Dep::NoOp
)
1464 std::clog
<< " (" << d
.CompType() << " "
1465 << d
.TargetVer() << ")";
1467 std::clog
<< std::endl
;
1469 MarkPackage(V
.ParentPkg(), V
,
1470 follow_recommends
, follow_suggests
);
1473 // Now try virtual packages
1474 for(PrvIterator prv
=d
.TargetPkg().ProvidesList();
1477 if(_system
->VS
->CheckDep(prv
.ProvideVersion(), d
->CompareOp
,
1480 if(debug_autoremove
)
1482 std::clog
<< "Following dep: " << d
.ParentPkg().Name()
1483 << " " << d
.ParentVer().VerStr() << " "
1484 << d
.DepType() << " "
1485 << d
.TargetPkg().Name();
1486 if((d
->CompareOp
& ~pkgCache::Dep::Or
) != pkgCache::Dep::NoOp
)
1488 std::clog
<< " (" << d
.CompType() << " "
1489 << d
.TargetVer() << ")";
1491 std::clog
<< ", provided by "
1492 << prv
.OwnerPkg().Name() << " "
1493 << prv
.OwnerVer().VerStr()
1497 MarkPackage(prv
.OwnerPkg(), prv
.OwnerVer(),
1498 follow_recommends
, follow_suggests
);
1506 bool pkgDepCache::Sweep() /*{{{*/
1508 bool debug_autoremove
= _config
->FindB("Debug::pkgAutoRemove",false);
1511 for(PkgIterator p
=PkgBegin(); !p
.end(); ++p
)
1513 StateCache
&state
=PkgState
[p
->ID
];
1515 // skip required packages
1516 if (!p
.CurrentVer().end() &&
1517 (p
.CurrentVer()->Priority
== pkgCache::State::Required
))
1520 // if it is not marked and it is installed, it's garbage
1521 if(!state
.Marked
&& (!p
.CurrentVer().end() || state
.Install()))
1524 if(debug_autoremove
)
1525 std::cout
<< "Garbage: " << p
.Name() << std::endl
;