summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/depcache.cc91
-rw-r--r--apt-pkg/depcache.h4
-rw-r--r--cmdline/apt-get.cc23
3 files changed, 69 insertions, 49 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);
diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h
index f974bfacf..e02ed72f0 100644
--- a/apt-pkg/depcache.h
+++ b/apt-pkg/depcache.h
@@ -198,6 +198,10 @@ class pkgDepCache : protected pkgCache::Namespace
// This is for debuging
void Update(OpProgress *Prog = 0);
+
+ // read persistent states
+ bool readStateFile(OpProgress *prog);
+ bool writeStateFile(OpProgress *prog);
// Size queries
inline double UsrSize() {return iUsrSize;};
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 31148a807..9f9ecd375 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -994,25 +994,8 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
return _error->Error(_("Aborting install."));
}
- // write the auto-mark list ----------------------------------
// -- we do it here because there is no libapt::Commit() :/
- FileFd state_file;
- string state = _config->FindDir("Dir::State") + "pkgstates";
-
-
- state_file.Open(state, FileFd::WriteEmpty);
- std::ostringstream ostr;
- for(pkgCache::PkgIterator p=Cache->PkgBegin(); !p.end();p++) {
- if(Cache[p].AutomaticRemove != pkgCache::State::RemoveUnknown) {
- ostr.str(string(""));
- ostr << "Package: " << p.Name()
- << "\nRemove-Reason: "
- << (int)(Cache[p].AutomaticRemove) << "\n\n";
- state_file.Write(ostr.str().c_str(), ostr.str().size());
- //std::cout << "Writing auto-mark: " << ostr.str() << endl;
- }
- }
- // ----------------------------------------------------------
+ Cache->writeStateFile(NULL);
_system->UnLock();
pkgPackageManager::OrderResult Res = PM->DoInstall();
@@ -1720,8 +1703,8 @@ bool DoInstall(CommandLine &CmdL)
if (*J == 0) {
List += string(I.Name()) + " ";
- //if (_config->FindB("APT::Get::AutomaticRemove"))
- Cache[I].AutomaticRemove = pkgCache::State::RemoveRequired;
+ // mark each pkg as auto-installed
+ Cache[I].AutomaticRemove = pkgCache::State::RemoveRequired;
VersionsList += string(Cache[I].CandVersion) + "\n";
}
}