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
);
17 bool DoCacheManipulationFromCommandLine(CommandLine
&CmdL
, CacheFile
&Cache
,
18 std::map
<unsigned short, APT::VersionSet
> &verset
);
19 bool DoCacheManipulationFromCommandLine(CommandLine
&CmdL
, CacheFile
&Cache
);
21 bool InstallPackages(CacheFile
&Cache
,bool ShwKept
,bool Ask
= true,
25 // TryToInstall - Mark a package for installation /*{{{*/
28 pkgProblemResolver
* Fix
;
30 unsigned long AutoMarkChanged
;
31 APT::PackageSet doAutoInstallLater
;
33 TryToInstall(pkgCacheFile
&Cache
, pkgProblemResolver
*PM
, bool const FixBroken
) : Cache(&Cache
), Fix(PM
),
34 FixBroken(FixBroken
), AutoMarkChanged(0) {};
36 void operator() (pkgCache::VerIterator
const &Ver
) {
37 pkgCache::PkgIterator Pkg
= Ver
.ParentPkg();
39 Cache
->GetDepCache()->SetCandidateVersion(Ver
);
40 pkgDepCache::StateCache
&State
= (*Cache
)[Pkg
];
42 // Handle the no-upgrade case
43 if (_config
->FindB("APT::Get::upgrade",true) == false && Pkg
->CurrentVer
!= 0)
44 ioprintf(c1out
,_("Skipping %s, it is already installed and upgrade is not set.\n"),
45 Pkg
.FullName(true).c_str());
46 // Ignore request for install if package would be new
47 else if (_config
->FindB("APT::Get::Only-Upgrade", false) == true && Pkg
->CurrentVer
== 0)
48 ioprintf(c1out
,_("Skipping %s, it is not installed and only upgrades are requested.\n"),
49 Pkg
.FullName(true).c_str());
55 Cache
->GetDepCache()->MarkInstall(Pkg
,false);
57 if (State
.Install() == false) {
58 if (_config
->FindB("APT::Get::ReInstall",false) == true) {
59 if (Pkg
->CurrentVer
== 0 || Pkg
.CurrentVer().Downloadable() == false)
60 ioprintf(c1out
,_("Reinstallation of %s is not possible, it cannot be downloaded.\n"),
61 Pkg
.FullName(true).c_str());
63 Cache
->GetDepCache()->SetReInstall(Pkg
, true);
65 ioprintf(c1out
,_("%s is already the newest version.\n"),
66 Pkg
.FullName(true).c_str());
69 // Install it with autoinstalling enabled (if we not respect the minial
70 // required deps or the policy)
71 if (FixBroken
== false)
72 doAutoInstallLater
.insert(Pkg
);
75 // see if we need to fix the auto-mark flag
76 // e.g. apt-get install foo
77 // where foo is marked automatic
78 if (State
.Install() == false &&
79 (State
.Flags
& pkgCache::Flag::Auto
) &&
80 _config
->FindB("APT::Get::ReInstall",false) == false &&
81 _config
->FindB("APT::Get::Only-Upgrade",false) == false &&
82 _config
->FindB("APT::Get::Download-Only",false) == false)
84 ioprintf(c1out
,_("%s set to manually installed.\n"),
85 Pkg
.FullName(true).c_str());
86 Cache
->GetDepCache()->MarkAuto(Pkg
,false);
91 bool propergateReleaseCandiateSwitching(std::list
<std::pair
<pkgCache::VerIterator
, std::string
> > start
, std::ostream
&out
)
93 for (std::list
<std::pair
<pkgCache::VerIterator
, std::string
> >::const_iterator s
= start
.begin();
94 s
!= start
.end(); ++s
)
95 Cache
->GetDepCache()->SetCandidateVersion(s
->first
);
98 std::list
<std::pair
<pkgCache::VerIterator
, pkgCache::VerIterator
> > Changed
;
99 for (std::list
<std::pair
<pkgCache::VerIterator
, std::string
> >::const_iterator s
= start
.begin();
100 s
!= start
.end(); ++s
)
102 Changed
.push_back(std::make_pair(s
->first
, pkgCache::VerIterator(*Cache
)));
103 // We continue here even if it failed to enhance the ShowBroken output
104 Success
&= Cache
->GetDepCache()->SetCandidateRelease(s
->first
, s
->second
, Changed
);
106 for (std::list
<std::pair
<pkgCache::VerIterator
, pkgCache::VerIterator
> >::const_iterator c
= Changed
.begin();
107 c
!= Changed
.end(); ++c
)
109 if (c
->second
.end() == true)
110 ioprintf(out
, _("Selected version '%s' (%s) for '%s'\n"),
111 c
->first
.VerStr(), c
->first
.RelStr().c_str(), c
->first
.ParentPkg().FullName(true).c_str());
112 else if (c
->first
.ParentPkg()->Group
!= c
->second
.ParentPkg()->Group
)
114 pkgCache::VerIterator V
= (*Cache
)[c
->first
.ParentPkg()].CandidateVerIter(*Cache
);
115 ioprintf(out
, _("Selected version '%s' (%s) for '%s' because of '%s'\n"), V
.VerStr(),
116 V
.RelStr().c_str(), V
.ParentPkg().FullName(true).c_str(), c
->second
.ParentPkg().FullName(true).c_str());
122 void doAutoInstall() {
123 for (APT::PackageSet::const_iterator P
= doAutoInstallLater
.begin();
124 P
!= doAutoInstallLater
.end(); ++P
) {
125 pkgDepCache::StateCache
&State
= (*Cache
)[P
];
126 if (State
.InstBroken() == false && State
.InstPolicyBroken() == false)
128 Cache
->GetDepCache()->MarkInstall(P
, true);
130 doAutoInstallLater
.clear();
134 // TryToRemove - Mark a package for removal /*{{{*/
137 pkgProblemResolver
* Fix
;
140 TryToRemove(pkgCacheFile
&Cache
, pkgProblemResolver
*PM
) : Cache(&Cache
), Fix(PM
),
141 PurgePkgs(_config
->FindB("APT::Get::Purge", false)) {};
143 void operator() (pkgCache::VerIterator
const &Ver
)
145 pkgCache::PkgIterator Pkg
= Ver
.ParentPkg();
154 if ((Pkg
->CurrentVer
== 0 && PurgePkgs
== false) ||
155 (PurgePkgs
== true && Pkg
->CurrentState
== pkgCache::State::NotInstalled
))
157 pkgCache::GrpIterator Grp
= Pkg
.Group();
158 pkgCache::PkgIterator P
= Grp
.PackageList();
159 for (; P
.end() != true; P
= Grp
.NextPkg(P
))
163 if (P
->CurrentVer
!= 0 || (PurgePkgs
== true && P
->CurrentState
!= pkgCache::State::NotInstalled
))
165 // TRANSLATORS: Note, this is not an interactive question
166 ioprintf(c1out
,_("Package '%s' is not installed, so not removed. Did you mean '%s'?\n"),
167 Pkg
.FullName(true).c_str(), P
.FullName(true).c_str());
172 ioprintf(c1out
,_("Package '%s' is not installed, so not removed\n"),Pkg
.FullName(true).c_str());
174 // MarkInstall refuses to install packages on hold
175 Pkg
->SelectedState
= pkgCache::State::Hold
;
178 Cache
->GetDepCache()->MarkDelete(Pkg
, PurgePkgs
);