diff options
-rw-r--r-- | src/generic/apt/aptcache.cc | 14 | ||||
-rw-r--r-- | src/generic/apt/aptcache.h | 7 |
2 files changed, 16 insertions, 5 deletions
diff --git a/src/generic/apt/aptcache.cc b/src/generic/apt/aptcache.cc index 913084dd..cba35e27 100644 --- a/src/generic/apt/aptcache.cc +++ b/src/generic/apt/aptcache.cc @@ -1,6 +1,6 @@ // aptcache.cc // -// Copyright 1999-2009 Daniel Burrows +// Copyright 1999-2009, 2011 Daniel Burrows // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -640,7 +640,7 @@ void aptitudeDepCache::mark_all_upgradable(bool with_autoinst, pre_package_state_changed(); dirty = true; - MarkInstall(*it, do_autoinstall); + internal_mark_install(*it, do_autoinstall, false); } } } @@ -1108,6 +1108,10 @@ void aptitudeDepCache::internal_mark_install(const PkgIterator &Pkg, MarkAuto(Pkg, false); + // MarkInstall and friends like to modify the auto flag, so save it + // here and restore it afterwards: + bool previously_auto = ((*this)[Pkg].Flags & Flag::Auto) != 0; + if(!ReInstall) { pkgDepCache::MarkInstall(Pkg, AutoInst); @@ -1117,6 +1121,8 @@ void aptitudeDepCache::internal_mark_install(const PkgIterator &Pkg, pkgDepCache::SetReInstall(Pkg, ReInstall); + MarkAuto(Pkg, previously_auto); + get_ext_state(Pkg).selection_state=pkgCache::State::Install; get_ext_state(Pkg).reinstall=ReInstall; get_ext_state(Pkg).forbidver=""; @@ -1334,7 +1340,7 @@ void aptitudeDepCache::mark_single_install(const PkgIterator &Pkg, undo_group *u if(set_to_manual) MarkAuto(Pkg, false); - pkgDepCache::MarkInstall(Pkg, true); + internal_mark_install(Pkg, true, false); } void aptitudeDepCache::mark_auto_installed(const PkgIterator &Pkg, @@ -1539,7 +1545,7 @@ bool aptitudeDepCache::try_fix_broken(undo_group *undo) { pkgDepCache::StateCache &state=(*this)[i]; if(state.InstBroken() || state.NowBroken()) - MarkInstall(i,true); + internal_mark_install(i, true, false); else if(state.Delete()) fixer.Remove(i); } diff --git a/src/generic/apt/aptcache.h b/src/generic/apt/aptcache.h index 20bcba56..3cbca962 100644 --- a/src/generic/apt/aptcache.h +++ b/src/generic/apt/aptcache.h @@ -1,6 +1,6 @@ // aptcache.h -*-c++-*- // -// Copyright 1999-2005, 2007-2009 Daniel Burrows +// Copyright 1999-2005, 2007-2009, 2011 Daniel Burrows // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -320,6 +320,11 @@ private: // The following methods just perform the core part of the named // action, without creating a new action group or running // mark&sweep. + + /** + * Use this instead of pkgDepCache::MarkInstall; it ensures that the + * package's auto flag is set properly. + */ void internal_mark_install(const PkgIterator &Pkg, bool AutoInst, bool ReInstall); void internal_mark_delete(const PkgIterator &Pkg, bool Purge, bool unused_delete); void internal_mark_keep(const PkgIterator &Pkg, bool Automatic, bool SetHold); |