summaryrefslogtreecommitdiff
path: root/apt-pkg/depcache.cc
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg/depcache.cc')
-rw-r--r--apt-pkg/depcache.cc91
1 files changed, 62 insertions, 29 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index 5da411e4d..552a45a16 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -20,7 +20,7 @@
#include <apt-pkg/fileutl.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/tagfile.h>
-
+#include <sstream>
#include <apti18n.h>
/*}}}*/
@@ -103,6 +103,66 @@ bool pkgDepCache::Init(OpProgress *Prog)
}
/*}}}*/
+bool pkgDepCache::readStateFile(OpProgress *Prog)
+{
+ FileFd state_file;
+ string state = _config->FindDir("Dir::State") + "pkgstates";
+ if(FileExists(state)) {
+ state_file.Open(state, FileFd::ReadOnly);
+ int file_size = state_file.Size();
+ Prog->OverallProgress(0, file_size, 1,
+ _("Reading extended state information"));
+
+ pkgTagFile tagfile(&state_file);
+ pkgTagSection section;
+ int amt=0;
+ while(tagfile.Step(section)) {
+ string pkgname = section.FindS("Package");
+ pkgCache::PkgIterator pkg=Cache->FindPkg(pkgname);
+ // Silently ignore unknown packages and packages with no actual
+ // version.
+ if(!pkg.end() && !pkg.VersionList().end()) {
+ short reason = section.FindI("Remove-Reason",
+ pkgCache::State::RemoveManual);
+ PkgState[pkg->ID].AutomaticRemove = reason;
+ //std::cout << "Set: " << pkgname << " to " << reason << std::endl;
+ amt+=section.size();
+ Prog->OverallProgress(amt, file_size, 1,
+ _("Reading extended state information"));
+ }
+ Prog->OverallProgress(file_size, file_size, 1,
+ _("Reading extended state information"));
+ }
+ }
+
+ return true;
+}
+
+bool pkgDepCache::writeStateFile(OpProgress *prog)
+{
+ // write the auto-mark list ----------------------------------
+
+ FileFd StateFile;
+ string state = _config->FindDir("Dir::State") + "pkgstates";
+
+ if(!StateFile.Open(state, FileFd::WriteEmpty))
+ return _error->Error(_("Failed to write StateFile %s"),
+ state.c_str());
+
+ std::ostringstream ostr;
+ for(pkgCache::PkgIterator pkg=Cache->PkgBegin(); !pkg.end();pkg++) {
+ if(PkgState[pkg->ID].AutomaticRemove != pkgCache::State::RemoveUnknown) {
+ ostr.str(string(""));
+ ostr << "Package: " << pkg.Name()
+ << "\nRemove-Reason: "
+ << (int)(PkgState[pkg->ID].AutomaticRemove) << "\n\n";
+ StateFile.Write(ostr.str().c_str(), ostr.str().size());
+ //std::cout << "Writing auto-mark: " << ostr.str() << endl;
+ }
+ }
+ return true;
+}
+
// DepCache::CheckDep - Checks a single dependency /*{{{*/
// ---------------------------------------------------------------------
/* This first checks the dependency against the main target package and
@@ -454,34 +514,7 @@ void pkgDepCache::Update(OpProgress *Prog)
AddStates(I);
}
- // read the state file ------------------------------
- FileFd state_file;
- string state = _config->FindDir("Dir::State") + "pkgstates";
- if(FileExists(state)) {
- state_file.Open(state, FileFd::ReadOnly);
- int file_size = state_file.Size();
- Prog->OverallProgress(0, file_size, 1, _("Reading extended state information"));
-
- pkgTagFile tagfile(&state_file);
- pkgTagSection section;
- int amt=0;
- while(tagfile.Step(section)) {
- string pkgname = section.FindS("Package");
- pkgCache::PkgIterator pkg=Cache->FindPkg(pkgname);
- // Silently ignore unknown packages and packages with no actual
- // version.
- if(!pkg.end() && !pkg.VersionList().end()) {
- short reason = section.FindI("Remove-Reason", pkgCache::State::RemoveManual);
- PkgState[pkg->ID].AutomaticRemove = reason;
- //std::cout << "Set: " << pkgname << " to " << reason << std::endl;
- amt+=section.size();
- Prog->OverallProgress(amt, file_size, 1, _("Reading extended state information"));
- }
- Prog->OverallProgress(file_size, file_size, 1, _("Reading extended state information"));
- }
- }
- //--------------------------------------
-
+ readStateFile(Prog);
if (Prog != 0)
Prog->Progress(Done);