1 #ifndef APT_PRIVATE_INSTALL_H
2 #define APT_PRIVATE_INSTALL_H
4 #include <apt-pkg/cacheset.h>
5 #include <apt-pkg/cmndline.h>
6 #include <apt-pkg/strutl.h>
8 #include "private-cachefile.h"
9 #include "private-output.h"
13 #define RAMFS_MAGIC 0x858458f6
15 bool DoInstall(CommandLine
&Cmd
);
18 bool InstallPackages(CacheFile
&Cache
,bool ShwKept
,bool Ask
= true,
22 // TryToInstall - Mark a package for installation /*{{{*/
25 pkgProblemResolver
* Fix
;
27 unsigned long AutoMarkChanged
;
28 APT::PackageSet doAutoInstallLater
;
30 TryToInstall(pkgCacheFile
&Cache
, pkgProblemResolver
*PM
, bool const FixBroken
) : Cache(&Cache
), Fix(PM
),
31 FixBroken(FixBroken
), AutoMarkChanged(0) {};
33 void operator() (pkgCache::VerIterator
const &Ver
) {
34 pkgCache::PkgIterator Pkg
= Ver
.ParentPkg();
36 Cache
->GetDepCache()->SetCandidateVersion(Ver
);
37 pkgDepCache::StateCache
&State
= (*Cache
)[Pkg
];
39 // Handle the no-upgrade case
40 if (_config
->FindB("APT::Get::upgrade",true) == false && Pkg
->CurrentVer
!= 0)
41 ioprintf(c1out
,_("Skipping %s, it is already installed and upgrade is not set.\n"),
42 Pkg
.FullName(true).c_str());
43 // Ignore request for install if package would be new
44 else if (_config
->FindB("APT::Get::Only-Upgrade", false) == true && Pkg
->CurrentVer
== 0)
45 ioprintf(c1out
,_("Skipping %s, it is not installed and only upgrades are requested.\n"),
46 Pkg
.FullName(true).c_str());
52 Cache
->GetDepCache()->MarkInstall(Pkg
,false);
54 if (State
.Install() == false) {
55 if (_config
->FindB("APT::Get::ReInstall",false) == true) {
56 if (Pkg
->CurrentVer
== 0 || Pkg
.CurrentVer().Downloadable() == false)
57 ioprintf(c1out
,_("Reinstallation of %s is not possible, it cannot be downloaded.\n"),
58 Pkg
.FullName(true).c_str());
60 Cache
->GetDepCache()->SetReInstall(Pkg
, true);
62 ioprintf(c1out
,_("%s is already the newest version.\n"),
63 Pkg
.FullName(true).c_str());
66 // Install it with autoinstalling enabled (if we not respect the minial
67 // required deps or the policy)
68 if (FixBroken
== false)
69 doAutoInstallLater
.insert(Pkg
);
72 // see if we need to fix the auto-mark flag
73 // e.g. apt-get install foo
74 // where foo is marked automatic
75 if (State
.Install() == false &&
76 (State
.Flags
& pkgCache::Flag::Auto
) &&
77 _config
->FindB("APT::Get::ReInstall",false) == false &&
78 _config
->FindB("APT::Get::Only-Upgrade",false) == false &&
79 _config
->FindB("APT::Get::Download-Only",false) == false)
81 ioprintf(c1out
,_("%s set to manually installed.\n"),
82 Pkg
.FullName(true).c_str());
83 Cache
->GetDepCache()->MarkAuto(Pkg
,false);
88 bool propergateReleaseCandiateSwitching(std::list
<std::pair
<pkgCache::VerIterator
, std::string
> > start
, std::ostream
&out
)
90 for (std::list
<std::pair
<pkgCache::VerIterator
, std::string
> >::const_iterator s
= start
.begin();
91 s
!= start
.end(); ++s
)
92 Cache
->GetDepCache()->SetCandidateVersion(s
->first
);
95 std::list
<std::pair
<pkgCache::VerIterator
, pkgCache::VerIterator
> > Changed
;
96 for (std::list
<std::pair
<pkgCache::VerIterator
, std::string
> >::const_iterator s
= start
.begin();
97 s
!= start
.end(); ++s
)
99 Changed
.push_back(std::make_pair(s
->first
, pkgCache::VerIterator(*Cache
)));
100 // We continue here even if it failed to enhance the ShowBroken output
101 Success
&= Cache
->GetDepCache()->SetCandidateRelease(s
->first
, s
->second
, Changed
);
103 for (std::list
<std::pair
<pkgCache::VerIterator
, pkgCache::VerIterator
> >::const_iterator c
= Changed
.begin();
104 c
!= Changed
.end(); ++c
)
106 if (c
->second
.end() == true)
107 ioprintf(out
, _("Selected version '%s' (%s) for '%s'\n"),
108 c
->first
.VerStr(), c
->first
.RelStr().c_str(), c
->first
.ParentPkg().FullName(true).c_str());
109 else if (c
->first
.ParentPkg()->Group
!= c
->second
.ParentPkg()->Group
)
111 pkgCache::VerIterator V
= (*Cache
)[c
->first
.ParentPkg()].CandidateVerIter(*Cache
);
112 ioprintf(out
, _("Selected version '%s' (%s) for '%s' because of '%s'\n"), V
.VerStr(),
113 V
.RelStr().c_str(), V
.ParentPkg().FullName(true).c_str(), c
->second
.ParentPkg().FullName(true).c_str());
119 void doAutoInstall() {
120 for (APT::PackageSet::const_iterator P
= doAutoInstallLater
.begin();
121 P
!= doAutoInstallLater
.end(); ++P
) {
122 pkgDepCache::StateCache
&State
= (*Cache
)[P
];
123 if (State
.InstBroken() == false && State
.InstPolicyBroken() == false)
125 Cache
->GetDepCache()->MarkInstall(P
, true);
127 doAutoInstallLater
.clear();
131 // TryToRemove - Mark a package for removal /*{{{*/
134 pkgProblemResolver
* Fix
;
137 TryToRemove(pkgCacheFile
&Cache
, pkgProblemResolver
*PM
) : Cache(&Cache
), Fix(PM
),
138 PurgePkgs(_config
->FindB("APT::Get::Purge", false)) {};
140 void operator() (pkgCache::VerIterator
const &Ver
)
142 pkgCache::PkgIterator Pkg
= Ver
.ParentPkg();
151 if ((Pkg
->CurrentVer
== 0 && PurgePkgs
== false) ||
152 (PurgePkgs
== true && Pkg
->CurrentState
== pkgCache::State::NotInstalled
))
154 pkgCache::GrpIterator Grp
= Pkg
.Group();
155 pkgCache::PkgIterator P
= Grp
.PackageList();
156 for (; P
.end() != true; P
= Grp
.NextPkg(P
))
160 if (P
->CurrentVer
!= 0 || (PurgePkgs
== true && P
->CurrentState
!= pkgCache::State::NotInstalled
))
162 // TRANSLATORS: Note, this is not an interactive question
163 ioprintf(c1out
,_("Package '%s' is not installed, so not removed. Did you mean '%s'?\n"),
164 Pkg
.FullName(true).c_str(), P
.FullName(true).c_str());
169 ioprintf(c1out
,_("Package '%s' is not installed, so not removed\n"),Pkg
.FullName(true).c_str());
171 // MarkInstall refuses to install packages on hold
172 Pkg
->SelectedState
= pkgCache::State::Hold
;
175 Cache
->GetDepCache()->MarkDelete(Pkg
, PurgePkgs
);