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 // the Changed list contains:
99 // first: "new version"
100 // second: "what-caused the change"
101 std::list
<std::pair
<pkgCache::VerIterator
, pkgCache::VerIterator
> > Changed
;
102 for (std::list
<std::pair
<pkgCache::VerIterator
, std::string
> >::const_iterator s
= start
.begin();
103 s
!= start
.end(); ++s
)
105 Changed
.push_back(std::make_pair(s
->first
, pkgCache::VerIterator(*Cache
)));
106 // We continue here even if it failed to enhance the ShowBroken output
107 Success
&= Cache
->GetDepCache()->SetCandidateRelease(s
->first
, s
->second
, Changed
);
109 for (std::list
<std::pair
<pkgCache::VerIterator
, pkgCache::VerIterator
> >::const_iterator c
= Changed
.begin();
110 c
!= Changed
.end(); ++c
)
112 if (c
->second
.end() == true)
113 ioprintf(out
, _("Selected version '%s' (%s) for '%s'\n"),
114 c
->first
.VerStr(), c
->first
.RelStr().c_str(), c
->first
.ParentPkg().FullName(true).c_str());
115 else if (c
->first
.ParentPkg()->Group
!= c
->second
.ParentPkg()->Group
)
117 pkgCache::VerIterator V
= (*Cache
)[c
->first
.ParentPkg()].CandidateVerIter(*Cache
);
118 ioprintf(out
, _("Selected version '%s' (%s) for '%s' because of '%s'\n"), V
.VerStr(),
119 V
.RelStr().c_str(), V
.ParentPkg().FullName(true).c_str(), c
->second
.ParentPkg().FullName(true).c_str());
125 void doAutoInstall() {
126 for (APT::PackageSet::const_iterator P
= doAutoInstallLater
.begin();
127 P
!= doAutoInstallLater
.end(); ++P
) {
128 pkgDepCache::StateCache
&State
= (*Cache
)[P
];
129 if (State
.InstBroken() == false && State
.InstPolicyBroken() == false)
131 Cache
->GetDepCache()->MarkInstall(P
, true);
133 doAutoInstallLater
.clear();
137 // TryToRemove - Mark a package for removal /*{{{*/
140 pkgProblemResolver
* Fix
;
143 TryToRemove(pkgCacheFile
&Cache
, pkgProblemResolver
*PM
) : Cache(&Cache
), Fix(PM
),
144 PurgePkgs(_config
->FindB("APT::Get::Purge", false)) {};
146 void operator() (pkgCache::VerIterator
const &Ver
)
148 pkgCache::PkgIterator Pkg
= Ver
.ParentPkg();
157 if ((Pkg
->CurrentVer
== 0 && PurgePkgs
== false) ||
158 (PurgePkgs
== true && Pkg
->CurrentState
== pkgCache::State::NotInstalled
))
160 pkgCache::GrpIterator Grp
= Pkg
.Group();
161 pkgCache::PkgIterator P
= Grp
.PackageList();
162 for (; P
.end() != true; P
= Grp
.NextPkg(P
))
166 if (P
->CurrentVer
!= 0 || (PurgePkgs
== true && P
->CurrentState
!= pkgCache::State::NotInstalled
))
168 // TRANSLATORS: Note, this is not an interactive question
169 ioprintf(c1out
,_("Package '%s' is not installed, so not removed. Did you mean '%s'?\n"),
170 Pkg
.FullName(true).c_str(), P
.FullName(true).c_str());
175 ioprintf(c1out
,_("Package '%s' is not installed, so not removed\n"),Pkg
.FullName(true).c_str());
177 // MarkInstall refuses to install packages on hold
178 Pkg
->SelectedState
= pkgCache::State::Hold
;
181 Cache
->GetDepCache()->MarkDelete(Pkg
, PurgePkgs
);