]>
git.saurik.com Git - apt-legacy.git/blob - cmdline/apt-get.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: apt-get.cc,v 1.156 2004/08/28 01:05:16 mdz Exp $
4 /* ######################################################################
6 apt-get - Cover for dpkg
8 This is an allout cover for dpkg implementing a safer front end. It is
9 based largely on libapt-pkg.
11 The syntax is different,
12 apt-get [opt] command [things]
14 update - Resyncronize the package files from their sources
15 upgrade - Smart-Download the newest versions of all packages
16 dselect-upgrade - Follows dselect's changes to the Status: field
17 and installes new and removes old packages
18 dist-upgrade - Powerfull upgrader designed to handle the issues with
20 install - Download and install a given package (by name, not by .deb)
21 check - Update the package cache and check for broken packages
22 clean - Erase the .debs downloaded to /var/cache/apt/archives and
25 ##################################################################### */
27 // Include Files /*{{{*/
28 #include <apt-pkg/error.h>
29 #include <apt-pkg/cmndline.h>
30 #include <apt-pkg/init.h>
31 #include <apt-pkg/depcache.h>
32 #include <apt-pkg/sourcelist.h>
33 #include <apt-pkg/algorithms.h>
34 #include <apt-pkg/acquire-item.h>
35 #include <apt-pkg/strutl.h>
36 #include <apt-pkg/clean.h>
37 #include <apt-pkg/srcrecords.h>
38 #include <apt-pkg/version.h>
39 #include <apt-pkg/cachefile.h>
40 #include <apt-pkg/sptr.h>
41 #include <apt-pkg/md5.h>
42 #include <apt-pkg/versionmatch.h>
47 #include "acqprogress.h"
54 #include <sys/ioctl.h>
56 #include <sys/param.h>
57 #include <sys/mount.h>
58 #include <sys/statvfs.h>
68 #define RAMFS_MAGIC 0x858458f6
70 #define _trace() printf("_trace(%s:%d)\n", __FILE__, __LINE__)
77 unsigned int ScreenWidth
= 80 - 1; /* - 1 for the cursor */
79 // class CacheFile - Cover class for some dependency cache functions /*{{{*/
80 // ---------------------------------------------------------------------
82 class CacheFile
: public pkgCacheFile
84 static pkgCache
*SortCache
;
85 static int NameComp(const void *a
,const void *b
);
88 pkgCache::Package
**List
;
91 bool CheckDeps(bool AllowBroken
= false);
92 bool BuildCaches(bool WithLock
= true)
94 OpTextProgress
Prog(*_config
);
95 if (pkgCacheFile::BuildCaches(Prog
,WithLock
) == false)
99 bool Open(bool WithLock
= true)
101 OpTextProgress
Prog(*_config
);
102 if (pkgCacheFile::Open(Prog
,WithLock
) == false)
108 bool OpenForInstall()
110 if (_config
->FindB("APT::Get::Print-URIs") == true)
115 CacheFile() : List(0) {};
119 // YnPrompt - Yes No Prompt. /*{{{*/
120 // ---------------------------------------------------------------------
121 /* Returns true on a Yes.*/
122 bool YnPrompt(bool Default
=true)
124 if (_config
->FindB("APT::Get::Assume-Yes",false) == true)
126 c1out
<< _("Y") << endl
;
130 char response
[1024] = "";
131 cin
.getline(response
, sizeof(response
));
136 if (strlen(response
) == 0)
142 Res
= regcomp(&Pattern
, nl_langinfo(YESEXPR
),
143 REG_EXTENDED
|REG_ICASE
|REG_NOSUB
);
147 regerror(Res
,&Pattern
,Error
,sizeof(Error
));
148 return _error
->Error(_("Regex compilation error - %s"),Error
);
151 Res
= regexec(&Pattern
, response
, 0, NULL
, 0);
157 // AnalPrompt - Annoying Yes No Prompt. /*{{{*/
158 // ---------------------------------------------------------------------
159 /* Returns true on a Yes.*/
160 bool AnalPrompt(const char *Text
)
163 cin
.getline(Buf
,sizeof(Buf
));
164 if (strcmp(Buf
,Text
) == 0)
169 // ShowList - Show a list /*{{{*/
170 // ---------------------------------------------------------------------
171 /* This prints out a string of space separated words with a title and
172 a two space indent line wraped to the current screen width. */
173 bool ShowList(ostream
&out
,string Title
,string List
,string VersionsList
)
175 if (List
.empty() == true)
177 // trim trailing space
178 int NonSpace
= List
.find_last_not_of(' ');
181 List
= List
.erase(NonSpace
+ 1);
182 if (List
.empty() == true)
186 // Acount for the leading space
187 int ScreenWidth
= ::ScreenWidth
- 3;
189 out
<< Title
<< endl
;
190 string::size_type Start
= 0;
191 string::size_type VersionsStart
= 0;
192 while (Start
< List
.size())
194 if(_config
->FindB("APT::Get::Show-Versions",false) == true &&
195 VersionsList
.size() > 0) {
196 string::size_type End
;
197 string::size_type VersionsEnd
;
199 End
= List
.find(' ',Start
);
200 VersionsEnd
= VersionsList
.find('\n', VersionsStart
);
202 out
<< " " << string(List
,Start
,End
- Start
) << " (" <<
203 string(VersionsList
,VersionsStart
,VersionsEnd
- VersionsStart
) <<
206 if (End
== string::npos
|| End
< Start
)
207 End
= Start
+ ScreenWidth
;
210 VersionsStart
= VersionsEnd
+ 1;
212 string::size_type End
;
214 if (Start
+ ScreenWidth
>= List
.size())
217 End
= List
.rfind(' ',Start
+ScreenWidth
);
219 if (End
== string::npos
|| End
< Start
)
220 End
= Start
+ ScreenWidth
;
221 out
<< " " << string(List
,Start
,End
- Start
) << endl
;
229 // ShowBroken - Debugging aide /*{{{*/
230 // ---------------------------------------------------------------------
231 /* This prints out the names of all the packages that are broken along
232 with the name of each each broken dependency and a quite version
235 The output looks like:
236 The following packages have unmet dependencies:
237 exim: Depends: libc6 (>= 2.1.94) but 2.1.3-10 is to be installed
238 Depends: libldap2 (>= 2.0.2-2) but it is not going to be installed
239 Depends: libsasl7 but it is not going to be installed
241 void ShowBroken(ostream
&out
,CacheFile
&Cache
,bool Now
)
243 out
<< _("The following packages have unmet dependencies:") << endl
;
244 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
246 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
250 if (Cache
[I
].NowBroken() == false)
255 if (Cache
[I
].InstBroken() == false)
259 // Print out each package and the failed dependencies
260 out
<<" " << I
.Name() << ":";
261 unsigned Indent
= strlen(I
.Name()) + 3;
263 pkgCache::VerIterator Ver
;
266 Ver
= I
.CurrentVer();
268 Ver
= Cache
[I
].InstVerIter(Cache
);
270 if (Ver
.end() == true)
276 for (pkgCache::DepIterator D
= Ver
.DependsList(); D
.end() == false;)
278 // Compute a single dependency element (glob or)
279 pkgCache::DepIterator Start
;
280 pkgCache::DepIterator End
;
281 D
.GlobOr(Start
,End
); // advances D
283 if (Cache
->IsImportantDep(End
) == false)
288 if ((Cache
[End
] & pkgDepCache::DepGNow
) == pkgDepCache::DepGNow
)
293 if ((Cache
[End
] & pkgDepCache::DepGInstall
) == pkgDepCache::DepGInstall
)
301 for (unsigned J
= 0; J
!= Indent
; J
++)
305 if (FirstOr
== false)
307 for (unsigned J
= 0; J
!= strlen(End
.DepType()) + 3; J
++)
311 out
<< ' ' << End
.DepType() << ": ";
314 out
<< Start
.TargetPkg().Name();
316 // Show a quick summary of the version requirements
317 if (Start
.TargetVer() != 0)
318 out
<< " (" << Start
.CompType() << " " << Start
.TargetVer() << ")";
320 /* Show a summary of the target package if possible. In the case
321 of virtual packages we show nothing */
322 pkgCache::PkgIterator Targ
= Start
.TargetPkg();
323 if (Targ
->ProvidesList
== 0)
326 pkgCache::VerIterator Ver
= Cache
[Targ
].InstVerIter(Cache
);
328 Ver
= Targ
.CurrentVer();
330 if (Ver
.end() == false)
333 ioprintf(out
,_("but %s is installed"),Ver
.VerStr());
335 ioprintf(out
,_("but %s is to be installed"),Ver
.VerStr());
339 if (Cache
[Targ
].CandidateVerIter(Cache
).end() == true)
341 if (Targ
->ProvidesList
== 0)
342 out
<< _("but it is not installable");
344 out
<< _("but it is a virtual package");
347 out
<< (Now
?_("but it is not installed"):_("but it is not going to be installed"));
363 // ShowNew - Show packages to newly install /*{{{*/
364 // ---------------------------------------------------------------------
366 void ShowNew(ostream
&out
,CacheFile
&Cache
)
368 /* Print out a list of packages that are going to be installed extra
369 to what the user asked */
372 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
374 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
375 if (Cache
[I
].NewInstall() == true) {
376 List
+= string(I
.Name()) + " ";
377 VersionsList
+= string(Cache
[I
].CandVersion
) + "\n";
381 ShowList(out
,_("The following NEW packages will be installed:"),List
,VersionsList
);
384 // ShowDel - Show packages to delete /*{{{*/
385 // ---------------------------------------------------------------------
387 void ShowDel(ostream
&out
,CacheFile
&Cache
)
389 /* Print out a list of packages that are going to be removed extra
390 to what the user asked */
393 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
395 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
396 if (Cache
[I
].Delete() == true)
398 if ((Cache
[I
].iFlags
& pkgDepCache::Purge
) == pkgDepCache::Purge
)
399 List
+= string(I
.Name()) + "* ";
401 List
+= string(I
.Name()) + " ";
403 VersionsList
+= string(Cache
[I
].CandVersion
)+ "\n";
407 ShowList(out
,_("The following packages will be REMOVED:"),List
,VersionsList
);
410 // ShowKept - Show kept packages /*{{{*/
411 // ---------------------------------------------------------------------
413 void ShowKept(ostream
&out
,CacheFile
&Cache
)
417 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
419 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
422 if (Cache
[I
].Upgrade() == true || Cache
[I
].Upgradable() == false ||
423 I
->CurrentVer
== 0 || Cache
[I
].Delete() == true)
426 List
+= string(I
.Name()) + " ";
427 VersionsList
+= string(Cache
[I
].CurVersion
) + " => " + Cache
[I
].CandVersion
+ "\n";
429 ShowList(out
,_("The following packages have been kept back:"),List
,VersionsList
);
432 // ShowUpgraded - Show upgraded packages /*{{{*/
433 // ---------------------------------------------------------------------
435 void ShowUpgraded(ostream
&out
,CacheFile
&Cache
)
439 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
441 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
444 if (Cache
[I
].Upgrade() == false || Cache
[I
].NewInstall() == true)
447 List
+= string(I
.Name()) + " ";
448 VersionsList
+= string(Cache
[I
].CurVersion
) + " => " + Cache
[I
].CandVersion
+ "\n";
450 ShowList(out
,_("The following packages will be upgraded:"),List
,VersionsList
);
453 // ShowDowngraded - Show downgraded packages /*{{{*/
454 // ---------------------------------------------------------------------
456 bool ShowDowngraded(ostream
&out
,CacheFile
&Cache
)
460 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
462 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
465 if (Cache
[I
].Downgrade() == false || Cache
[I
].NewInstall() == true)
468 List
+= string(I
.Name()) + " ";
469 VersionsList
+= string(Cache
[I
].CurVersion
) + " => " + Cache
[I
].CandVersion
+ "\n";
471 return ShowList(out
,_("The following packages will be DOWNGRADED:"),List
,VersionsList
);
474 // ShowHold - Show held but changed packages /*{{{*/
475 // ---------------------------------------------------------------------
477 bool ShowHold(ostream
&out
,CacheFile
&Cache
)
481 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
483 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
484 if (Cache
[I
].InstallVer
!= (pkgCache::Version
*)I
.CurrentVer() &&
485 I
->SelectedState
== pkgCache::State::Hold
) {
486 List
+= string(I
.Name()) + " ";
487 VersionsList
+= string(Cache
[I
].CurVersion
) + " => " + Cache
[I
].CandVersion
+ "\n";
491 return ShowList(out
,_("The following held packages will be changed:"),List
,VersionsList
);
494 // ShowEssential - Show an essential package warning /*{{{*/
495 // ---------------------------------------------------------------------
496 /* This prints out a warning message that is not to be ignored. It shows
497 all essential packages and their dependents that are to be removed.
498 It is insanely risky to remove the dependents of an essential package! */
499 bool ShowEssential(ostream
&out
,CacheFile
&Cache
)
503 bool *Added
= new bool[Cache
->Head().PackageCount
];
504 for (unsigned int I
= 0; I
!= Cache
->Head().PackageCount
; I
++)
507 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
509 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
510 if ((I
->Flags
& pkgCache::Flag::Essential
) != pkgCache::Flag::Essential
&&
511 (I
->Flags
& pkgCache::Flag::Important
) != pkgCache::Flag::Important
)
514 // The essential package is being removed
515 if (Cache
[I
].Delete() == true)
517 if (Added
[I
->ID
] == false)
520 List
+= string(I
.Name()) + " ";
521 //VersionsList += string(Cache[I].CurVersion) + "\n"; ???
525 if (I
->CurrentVer
== 0)
528 // Print out any essential package depenendents that are to be removed
529 for (pkgCache::DepIterator D
= I
.CurrentVer().DependsList(); D
.end() == false; D
++)
531 // Skip everything but depends
532 if (D
->Type
!= pkgCache::Dep::PreDepends
&&
533 D
->Type
!= pkgCache::Dep::Depends
)
536 pkgCache::PkgIterator P
= D
.SmartTargetPkg();
537 if (Cache
[P
].Delete() == true)
539 if (Added
[P
->ID
] == true)
544 snprintf(S
,sizeof(S
),_("%s (due to %s) "),P
.Name(),I
.Name());
546 //VersionsList += "\n"; ???
552 return ShowList(out
,_("WARNING: The following essential packages will be removed.\n"
553 "This should NOT be done unless you know exactly what you are doing!"),List
,VersionsList
);
557 // Stats - Show some statistics /*{{{*/
558 // ---------------------------------------------------------------------
560 void Stats(ostream
&out
,pkgDepCache
&Dep
)
562 unsigned long Upgrade
= 0;
563 unsigned long Downgrade
= 0;
564 unsigned long Install
= 0;
565 unsigned long ReInstall
= 0;
566 for (pkgCache::PkgIterator I
= Dep
.PkgBegin(); I
.end() == false; I
++)
568 if (Dep
[I
].NewInstall() == true)
572 if (Dep
[I
].Upgrade() == true)
575 if (Dep
[I
].Downgrade() == true)
579 if (Dep
[I
].Delete() == false && (Dep
[I
].iFlags
& pkgDepCache::ReInstall
) == pkgDepCache::ReInstall
)
583 ioprintf(out
,_("%lu upgraded, %lu newly installed, "),
587 ioprintf(out
,_("%lu reinstalled, "),ReInstall
);
589 ioprintf(out
,_("%lu downgraded, "),Downgrade
);
591 ioprintf(out
,_("%lu to remove and %lu not upgraded.\n"),
592 Dep
.DelCount(),Dep
.KeepCount());
594 if (Dep
.BadCount() != 0)
595 ioprintf(out
,_("%lu not fully installed or removed.\n"),
600 // CacheFile::NameComp - QSort compare by name /*{{{*/
601 // ---------------------------------------------------------------------
603 pkgCache
*CacheFile::SortCache
= 0;
604 int CacheFile::NameComp(const void *a
,const void *b
)
606 if (*(pkgCache::Package
**)a
== 0 || *(pkgCache::Package
**)b
== 0)
607 return *(pkgCache::Package
**)a
- *(pkgCache::Package
**)b
;
609 const pkgCache::Package
&A
= **(pkgCache::Package
**)a
;
610 const pkgCache::Package
&B
= **(pkgCache::Package
**)b
;
612 return strcmp(SortCache
->StrP
+ A
.Name
,SortCache
->StrP
+ B
.Name
);
615 // CacheFile::Sort - Sort by name /*{{{*/
616 // ---------------------------------------------------------------------
618 void CacheFile::Sort()
621 List
= new pkgCache::Package
*[Cache
->Head().PackageCount
];
622 memset(List
,0,sizeof(*List
)*Cache
->Head().PackageCount
);
623 pkgCache::PkgIterator I
= Cache
->PkgBegin();
624 for (;I
.end() != true; I
++)
628 qsort(List
,Cache
->Head().PackageCount
,sizeof(*List
),NameComp
);
631 // CacheFile::CheckDeps - Open the cache file /*{{{*/
632 // ---------------------------------------------------------------------
633 /* This routine generates the caches and then opens the dependency cache
634 and verifies that the system is OK. */
635 bool CacheFile::CheckDeps(bool AllowBroken
)
637 bool FixBroken
= _config
->FindB("APT::Get::Fix-Broken",false);
639 if (_error
->PendingError() == true)
642 // Check that the system is OK
643 if (DCache
->DelCount() != 0 || DCache
->InstCount() != 0)
644 return _error
->Error("Internal error, non-zero counts");
646 // Apply corrections for half-installed packages
647 if (pkgApplyStatus(*DCache
) == false)
650 if (_config
->FindB("APT::Get::Fix-Policy-Broken",false) == true)
653 if ((DCache
->PolicyBrokenCount() > 0))
655 // upgrade all policy-broken packages with ForceImportantDeps=True
656 for (pkgCache::PkgIterator I
= Cache
->PkgBegin(); !I
.end(); I
++)
657 if ((*DCache
)[I
].NowPolicyBroken() == true)
658 DCache
->MarkInstall(I
,true,0, false, true);
663 if (DCache
->BrokenCount() == 0 || AllowBroken
== true)
666 // Attempt to fix broken things
667 if (FixBroken
== true)
669 c1out
<< _("Correcting dependencies...") << flush
;
670 if (pkgFixBroken(*DCache
) == false || DCache
->BrokenCount() != 0)
672 c1out
<< _(" failed.") << endl
;
673 ShowBroken(c1out
,*this,true);
675 return _error
->Error(_("Unable to correct dependencies"));
677 if (pkgMinimizeUpgrade(*DCache
) == false)
678 return _error
->Error(_("Unable to minimize the upgrade set"));
680 c1out
<< _(" Done") << endl
;
684 c1out
<< _("You might want to run `apt-get -f install' to correct these.") << endl
;
685 ShowBroken(c1out
,*this,true);
687 return _error
->Error(_("Unmet dependencies. Try using -f."));
693 static bool CheckAuth(pkgAcquire
& Fetcher
)
695 string UntrustedList
;
696 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin(); I
< Fetcher
.ItemsEnd(); ++I
)
698 if (!(*I
)->IsTrusted())
700 UntrustedList
+= string((*I
)->ShortDesc()) + " ";
704 if (UntrustedList
== "")
709 ShowList(c2out
,_("WARNING: The following packages cannot be authenticated!"),UntrustedList
,"");
711 if (_config
->FindB("APT::Get::AllowUnauthenticated",false) == true)
713 c2out
<< _("Authentication warning overridden.\n");
717 if (_config
->FindI("quiet",0) < 2
718 && _config
->FindB("APT::Get::Assume-Yes",false) == false)
720 c2out
<< _("Install these packages without verification [y/N]? ") << flush
;
721 if (!YnPrompt(false))
722 return _error
->Error(_("Some packages could not be authenticated"));
726 else if (_config
->FindB("APT::Get::Force-Yes",false) == true)
731 return _error
->Error(_("There are problems and -y was used without --force-yes"));
737 // InstallPackages - Actually download and install the packages /*{{{*/
738 // ---------------------------------------------------------------------
739 /* This displays the informative messages describing what is going to
740 happen and then calls the download routines */
741 bool InstallPackages(CacheFile
&Cache
,bool ShwKept
,bool Ask
= true,
744 if (_config
->FindB("APT::Get::Purge",false) == true)
746 pkgCache::PkgIterator I
= Cache
->PkgBegin();
747 for (; I
.end() == false; I
++)
749 if (I
.Purge() == false && Cache
[I
].Mode
== pkgDepCache::ModeDelete
)
750 Cache
->MarkDelete(I
,true);
755 bool Essential
= false;
757 // Show all the various warning indicators
758 ShowDel(c1out
,Cache
);
759 ShowNew(c1out
,Cache
);
761 ShowKept(c1out
,Cache
);
762 Fail
|= !ShowHold(c1out
,Cache
);
763 if (_config
->FindB("APT::Get::Show-Upgraded",true) == true)
764 ShowUpgraded(c1out
,Cache
);
765 Fail
|= !ShowDowngraded(c1out
,Cache
);
766 if (_config
->FindB("APT::Get::Download-Only",false) == false)
767 Essential
= !ShowEssential(c1out
,Cache
);
772 if (Cache
->BrokenCount() != 0)
774 ShowBroken(c1out
,Cache
,false);
775 return _error
->Error(_("Internal error, InstallPackages was called with broken packages!"));
778 if (Cache
->DelCount() == 0 && Cache
->InstCount() == 0 &&
779 Cache
->BadCount() == 0)
783 if (Cache
->DelCount() != 0 && _config
->FindB("APT::Get::Remove",true) == false)
784 return _error
->Error(_("Packages need to be removed but remove is disabled."));
786 // Run the simulator ..
787 if (_config
->FindB("APT::Get::Simulate") == true)
789 pkgSimulate
PM(Cache
);
790 int status_fd
= _config
->FindI("APT::Status-Fd",-1);
791 pkgPackageManager::OrderResult Res
= PM
.DoInstall(status_fd
);
792 if (Res
== pkgPackageManager::Failed
)
794 if (Res
!= pkgPackageManager::Completed
)
795 return _error
->Error(_("Internal error, Ordering didn't finish"));
799 // Create the text record parser
800 pkgRecords
Recs(Cache
);
801 if (_error
->PendingError() == true)
804 // Lock the archive directory
806 if (_config
->FindB("Debug::NoLocking",false) == false &&
807 _config
->FindB("APT::Get::Print-URIs") == false)
809 Lock
.Fd(GetLock(_config
->FindDir("Dir::Cache::Archives") + "lock"));
810 if (_error
->PendingError() == true)
811 return _error
->Error(_("Unable to lock the download directory"));
814 // Create the download object
815 AcqTextStatus
Stat(ScreenWidth
,_config
->FindI("quiet",0));
816 pkgAcquire
Fetcher(&Stat
);
818 // Read the source list
820 if (List
.ReadMainList() == false)
821 return _error
->Error(_("The list of sources could not be read."));
823 // Create the package manager and prepare to download
824 SPtr
<pkgPackageManager
> PM
= _system
->CreatePM(Cache
);
825 if (PM
->GetArchives(&Fetcher
,&List
,&Recs
) == false ||
826 _error
->PendingError() == true)
829 // Display statistics
830 double FetchBytes
= Fetcher
.FetchNeeded();
831 double FetchPBytes
= Fetcher
.PartialPresent();
832 double DebBytes
= Fetcher
.TotalNeeded();
833 if (DebBytes
!= Cache
->DebSize())
835 c0out
<< DebBytes
<< ',' << Cache
->DebSize() << endl
;
836 c0out
<< _("How odd.. The sizes didn't match, email apt@packages.debian.org") << endl
;
840 if (DebBytes
!= FetchBytes
)
841 ioprintf(c1out
,_("Need to get %sB/%sB of archives.\n"),
842 SizeToStr(FetchBytes
).c_str(),SizeToStr(DebBytes
).c_str());
843 else if (DebBytes
!= 0)
844 ioprintf(c1out
,_("Need to get %sB of archives.\n"),
845 SizeToStr(DebBytes
).c_str());
848 if (Cache
->UsrSize() >= 0)
849 ioprintf(c1out
,_("After this operation, %sB of additional disk space will be used.\n"),
850 SizeToStr(Cache
->UsrSize()).c_str());
852 ioprintf(c1out
,_("After this operation, %sB disk space will be freed.\n"),
853 SizeToStr(-1*Cache
->UsrSize()).c_str());
855 if (_error
->PendingError() == true)
858 /* Check for enough free space, but only if we are actually going to
860 if (_config
->FindB("APT::Get::Print-URIs") == false &&
861 _config
->FindB("APT::Get::Download",true) == true)
864 string OutputDir
= _config
->FindDir("Dir::Cache::Archives");
865 if (statvfs(OutputDir
.c_str(),&Buf
) != 0)
866 return _error
->Errno("statvfs",_("Couldn't determine free space in %s"),
868 if (unsigned(Buf
.f_bfree
) < (FetchBytes
- FetchPBytes
)/Buf
.f_bsize
)
871 if (statfs(OutputDir
.c_str(),&Stat
) != 0 ||
872 unsigned(Stat
.f_type
) != RAMFS_MAGIC
)
873 return _error
->Error(_("You don't have enough free space in %s."),
879 if (_config
->FindI("quiet",0) >= 2 ||
880 _config
->FindB("APT::Get::Assume-Yes",false) == true)
882 if (Fail
== true && _config
->FindB("APT::Get::Force-Yes",false) == false)
883 return _error
->Error(_("There are problems and -y was used without --force-yes"));
886 if (Essential
== true && Safety
== true)
888 if (_config
->FindB("APT::Get::Trivial-Only",false) == true)
889 return _error
->Error(_("Trivial Only specified but this is not a trivial operation."));
891 const char *Prompt
= _("Yes, do as I say!");
893 _("You are about to do something potentially harmful.\n"
894 "To continue type in the phrase '%s'\n"
897 if (AnalPrompt(Prompt
) == false)
899 c2out
<< _("Abort.") << endl
;
905 // Prompt to continue
906 if (Ask
== true || Fail
== true)
908 if (_config
->FindB("APT::Get::Trivial-Only",false) == true)
909 return _error
->Error(_("Trivial Only specified but this is not a trivial operation."));
911 if (_config
->FindI("quiet",0) < 2 &&
912 _config
->FindB("APT::Get::Assume-Yes",false) == false)
914 c2out
<< _("Do you want to continue [Y/n]? ") << flush
;
916 if (YnPrompt() == false)
918 c2out
<< _("Abort.") << endl
;
925 // Just print out the uris an exit if the --print-uris flag was used
926 if (_config
->FindB("APT::Get::Print-URIs") == true)
928 pkgAcquire::UriIterator I
= Fetcher
.UriBegin();
929 for (; I
!= Fetcher
.UriEnd(); I
++)
930 cout
<< '\'' << I
->URI
<< "' " << flNotDir(I
->Owner
->DestFile
) << ' ' <<
931 I
->Owner
->FileSize
<< ' ' << I
->Owner
->HashSum() << endl
;
935 if (!CheckAuth(Fetcher
))
938 /* Unlock the dpkg lock if we are not going to be doing an install
940 if (_config
->FindB("APT::Get::Download-Only",false) == true)
946 bool Transient
= false;
947 if (_config
->FindB("APT::Get::Download",true) == false)
949 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin(); I
< Fetcher
.ItemsEnd();)
951 if ((*I
)->Local
== true)
957 // Close the item and check if it was found in cache
959 if ((*I
)->Complete
== false)
962 // Clear it out of the fetch list
964 I
= Fetcher
.ItemsBegin();
968 if (Fetcher
.Run() == pkgAcquire::Failed
)
973 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin(); I
!= Fetcher
.ItemsEnd(); I
++)
975 if ((*I
)->Status
== pkgAcquire::Item::StatDone
&&
976 (*I
)->Complete
== true)
979 if ((*I
)->Status
== pkgAcquire::Item::StatIdle
)
986 fprintf(stderr
,_("Failed to fetch %s %s\n"),(*I
)->DescURI().c_str(),
987 (*I
)->ErrorText
.c_str());
991 /* If we are in no download mode and missing files and there were
992 'failures' then the user must specify -m. Furthermore, there
993 is no such thing as a transient error in no-download mode! */
994 if (Transient
== true &&
995 _config
->FindB("APT::Get::Download",true) == false)
1001 if (_config
->FindB("APT::Get::Download-Only",false) == true)
1003 if (Failed
== true && _config
->FindB("APT::Get::Fix-Missing",false) == false)
1004 return _error
->Error(_("Some files failed to download"));
1005 c1out
<< _("Download complete and in download only mode") << endl
;
1009 if (Failed
== true && _config
->FindB("APT::Get::Fix-Missing",false) == false)
1011 return _error
->Error(_("Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?"));
1014 if (Transient
== true && Failed
== true)
1015 return _error
->Error(_("--fix-missing and media swapping is not currently supported"));
1017 // Try to deal with missing package files
1018 if (Failed
== true && PM
->FixMissing() == false)
1020 cerr
<< _("Unable to correct missing packages.") << endl
;
1021 return _error
->Error(_("Aborting install."));
1025 int status_fd
= _config
->FindI("APT::Status-Fd",-1);
1026 pkgPackageManager::OrderResult Res
= PM
->DoInstall(status_fd
);
1027 if (Res
== pkgPackageManager::Failed
|| _error
->PendingError() == true)
1029 if (Res
== pkgPackageManager::Completed
)
1032 // Reload the fetcher object and loop again for media swapping
1034 if (PM
->GetArchives(&Fetcher
,&List
,&Recs
) == false)
1041 // TryToInstall - Try to install a single package /*{{{*/
1042 // ---------------------------------------------------------------------
1043 /* This used to be inlined in DoInstall, but with the advent of regex package
1044 name matching it was split out.. */
1045 bool TryToInstall(pkgCache::PkgIterator Pkg
,pkgDepCache
&Cache
,
1046 pkgProblemResolver
&Fix
,bool Remove
,bool BrokenFix
,
1047 unsigned int &ExpectedInst
,bool AllowFail
= true)
1049 /* This is a pure virtual package and there is a single available
1051 if (Cache
[Pkg
].CandidateVer
== 0 && Pkg
->ProvidesList
!= 0 &&
1052 Pkg
.ProvidesList()->NextProvides
== 0)
1054 pkgCache::PkgIterator Tmp
= Pkg
.ProvidesList().OwnerPkg();
1055 ioprintf(c1out
,_("Note, selecting %s instead of %s\n"),
1056 Tmp
.Name(),Pkg
.Name());
1060 // Handle the no-upgrade case
1061 if (_config
->FindB("APT::Get::upgrade",true) == false &&
1062 Pkg
->CurrentVer
!= 0)
1064 if (AllowFail
== true)
1065 ioprintf(c1out
,_("Skipping %s, it is already installed and upgrade is not set.\n"),
1070 // Check if there is something at all to install
1071 pkgDepCache::StateCache
&State
= Cache
[Pkg
];
1072 if (Remove
== true && Pkg
->CurrentVer
== 0)
1078 /* We want to continue searching for regex hits, so we return false here
1079 otherwise this is not really an error. */
1080 if (AllowFail
== false)
1083 ioprintf(c1out
,_("Package %s is not installed, so not removed\n"),Pkg
.Name());
1087 if (State
.CandidateVer
== 0 && Remove
== false)
1089 if (AllowFail
== false)
1092 if (Pkg
->ProvidesList
!= 0)
1094 ioprintf(c1out
,_("Package %s is a virtual package provided by:\n"),
1097 pkgCache::PrvIterator I
= Pkg
.ProvidesList();
1098 for (; I
.end() == false; I
++)
1100 pkgCache::PkgIterator Pkg
= I
.OwnerPkg();
1102 if (Cache
[Pkg
].CandidateVerIter(Cache
) == I
.OwnerVer())
1104 if (Cache
[Pkg
].Install() == true && Cache
[Pkg
].NewInstall() == false)
1105 c1out
<< " " << Pkg
.Name() << " " << I
.OwnerVer().VerStr() <<
1106 _(" [Installed]") << endl
;
1108 c1out
<< " " << Pkg
.Name() << " " << I
.OwnerVer().VerStr() << endl
;
1111 c1out
<< _("You should explicitly select one to install.") << endl
;
1116 _("Package %s is not available, but is referred to by another package.\n"
1117 "This may mean that the package is missing, has been obsoleted, or\n"
1118 "is only available from another source\n"),Pkg
.Name());
1121 string VersionsList
;
1122 SPtrArray
<bool> Seen
= new bool[Cache
.Head().PackageCount
];
1123 memset(Seen
,0,Cache
.Head().PackageCount
*sizeof(*Seen
));
1124 pkgCache::DepIterator Dep
= Pkg
.RevDependsList();
1125 for (; Dep
.end() == false; Dep
++)
1127 if (Dep
->Type
!= pkgCache::Dep::Replaces
)
1129 if (Seen
[Dep
.ParentPkg()->ID
] == true)
1131 Seen
[Dep
.ParentPkg()->ID
] = true;
1132 List
+= string(Dep
.ParentPkg().Name()) + " ";
1133 //VersionsList += string(Dep.ParentPkg().CurVersion) + "\n"; ???
1135 ShowList(c1out
,_("However the following packages replace it:"),List
,VersionsList
);
1138 _error
->Error(_("Package %s has no installation candidate"),Pkg
.Name());
1147 Cache
.MarkDelete(Pkg
,_config
->FindB("APT::Get::Purge",false));
1152 Cache
.MarkInstall(Pkg
,false);
1153 if (State
.Install() == false)
1155 if (_config
->FindB("APT::Get::ReInstall",false) == true)
1157 if (Pkg
->CurrentVer
== 0 || Pkg
.CurrentVer().Downloadable() == false)
1158 ioprintf(c1out
,_("Reinstallation of %s is not possible, it cannot be downloaded.\n"),
1161 Cache
.SetReInstall(Pkg
,true);
1165 if (AllowFail
== true)
1166 ioprintf(c1out
,_("%s is already the newest version.\n"),
1173 // Install it with autoinstalling enabled (if we not respect the minial
1174 // required deps or the policy)
1175 if ((State
.InstBroken() == true || State
.InstPolicyBroken() == true) && BrokenFix
== false)
1176 Cache
.MarkInstall(Pkg
,true);
1181 // TryToChangeVer - Try to change a candidate version /*{{{*/
1182 // ---------------------------------------------------------------------
1184 bool TryToChangeVer(pkgCache::PkgIterator Pkg
,pkgDepCache
&Cache
,
1185 const char *VerTag
,bool IsRel
)
1187 pkgVersionMatch
Match(VerTag
,(IsRel
== true?pkgVersionMatch::Release
:
1188 pkgVersionMatch::Version
));
1190 pkgCache::VerIterator Ver
= Match
.Find(Pkg
);
1192 if (Ver
.end() == true)
1195 return _error
->Error(_("Release '%s' for '%s' was not found"),
1197 return _error
->Error(_("Version '%s' for '%s' was not found"),
1201 if (strcmp(VerTag
,Ver
.VerStr()) != 0)
1203 ioprintf(c1out
,_("Selected version %s (%s) for %s\n"),
1204 Ver
.VerStr(),Ver
.RelStr().c_str(),Pkg
.Name());
1207 Cache
.SetCandidateVersion(Ver
);
1211 // FindSrc - Find a source record /*{{{*/
1212 // ---------------------------------------------------------------------
1214 pkgSrcRecords::Parser
*FindSrc(const char *Name
,pkgRecords
&Recs
,
1215 pkgSrcRecords
&SrcRecs
,string
&Src
,
1218 // We want to pull the version off the package specification..
1220 string TmpSrc
= Name
;
1221 string::size_type Slash
= TmpSrc
.rfind('=');
1223 // honor default release
1224 string DefRel
= _config
->Find("APT::Default-Release");
1225 pkgCache::PkgIterator Pkg
= Cache
.FindPkg(TmpSrc
);
1227 if (Slash
!= string::npos
)
1229 VerTag
= string(TmpSrc
.begin() + Slash
+ 1,TmpSrc
.end());
1230 TmpSrc
= string(TmpSrc
.begin(),TmpSrc
.begin() + Slash
);
1232 else if(!Pkg
.end() && DefRel
.empty() == false)
1234 // we have a default release, try to locate the pkg. we do it like
1235 // this because GetCandidateVer() will not "downgrade", that means
1236 // "apt-get source -t stable apt" won't work on a unstable system
1237 for (pkgCache::VerIterator Ver
= Pkg
.VersionList(); Ver
.end() == false;
1240 for (pkgCache::VerFileIterator VF
= Ver
.FileList(); VF
.end() == false;
1243 /* If this is the status file, and the current version is not the
1244 version in the status file (ie it is not installed, or somesuch)
1245 then it is not a candidate for installation, ever. This weeds
1246 out bogus entries that may be due to config-file states, or
1248 if ((VF
.File()->Flags
& pkgCache::Flag::NotSource
) ==
1249 pkgCache::Flag::NotSource
&& Pkg
.CurrentVer() != Ver
)
1252 //std::cout << VF.File().Archive() << std::endl;
1253 if(VF
.File().Archive() && (VF
.File().Archive() == DefRel
))
1255 VerTag
= Ver
.VerStr();
1262 /* Lookup the version of the package we would install if we were to
1263 install a version and determine the source package name, then look
1264 in the archive for a source package of the same name. */
1265 if (_config
->FindB("APT::Get::Only-Source") == false)
1267 if (Pkg
.end() == false)
1269 pkgCache::VerIterator Ver
= Cache
.GetCandidateVer(Pkg
);
1270 if (Ver
.end() == false)
1272 pkgRecords::Parser
&Parse
= Recs
.Lookup(Ver
.FileList());
1273 Src
= Parse
.SourcePkg();
1278 // No source package name..
1279 if (Src
.empty() == true)
1283 pkgSrcRecords::Parser
*Last
= 0;
1284 unsigned long Offset
= 0;
1286 bool IsMatch
= false;
1288 // If we are matching by version then we need exact matches to be happy
1289 if (VerTag
.empty() == false)
1292 /* Iterate over all of the hits, which includes the resulting
1293 binary packages in the search */
1294 pkgSrcRecords::Parser
*Parse
;
1296 while ((Parse
= SrcRecs
.Find(Src
.c_str(),false)) != 0)
1298 string Ver
= Parse
->Version();
1300 // Skip name mismatches
1301 if (IsMatch
== true && Parse
->Package() != Src
)
1304 if (VerTag
.empty() == false)
1306 /* Don't want to fall through because we are doing exact version
1308 if (Cache
.VS().CmpVersion(VerTag
,Ver
) != 0)
1312 Offset
= Parse
->Offset();
1316 // Newer version or an exact match
1317 if (Last
== 0 || Cache
.VS().CmpVersion(Version
,Ver
) < 0 ||
1318 (Parse
->Package() == Src
&& IsMatch
== false))
1320 IsMatch
= Parse
->Package() == Src
;
1322 Offset
= Parse
->Offset();
1327 if (Last
== 0 || Last
->Jump(Offset
) == false)
1334 // DoUpdate - Update the package lists /*{{{*/
1335 // ---------------------------------------------------------------------
1337 bool DoUpdate(CommandLine
&CmdL
)
1339 if (CmdL
.FileSize() != 1)
1340 return _error
->Error(_("The update command takes no arguments"));
1342 // Get the source list
1344 if (List
.ReadMainList() == false)
1347 // Lock the list directory
1349 if (_config
->FindB("Debug::NoLocking",false) == false)
1351 Lock
.Fd(GetLock(_config
->FindDir("Dir::State::Lists") + "lock"));
1352 if (_error
->PendingError() == true)
1353 return _error
->Error(_("Unable to lock the list directory"));
1356 // Create the progress
1357 AcqTextStatus
Stat(ScreenWidth
,_config
->FindI("quiet",0));
1359 // Just print out the uris an exit if the --print-uris flag was used
1360 if (_config
->FindB("APT::Get::Print-URIs") == true)
1363 pkgAcquire
Fetcher(&Stat
);
1365 // Populate it with the source selection and get all Indexes
1367 if (List
.GetIndexes(&Fetcher
,true) == false)
1370 pkgAcquire::UriIterator I
= Fetcher
.UriBegin();
1371 for (; I
!= Fetcher
.UriEnd(); I
++)
1372 cout
<< '\'' << I
->URI
<< "' " << flNotDir(I
->Owner
->DestFile
) << ' ' <<
1373 I
->Owner
->FileSize
<< ' ' << I
->Owner
->HashSum() << endl
;
1379 if (_config
->FindB("APT::Get::Download",true) == true)
1380 ListUpdate(Stat
, List
);
1382 // Rebuild the cache.
1383 if (Cache
.BuildCaches() == false)
1389 // DoAutomaticRemove - Remove all automatic unused packages /*{{{*/
1390 // ---------------------------------------------------------------------
1391 /* Remove unused automatic packages */
1392 bool DoAutomaticRemove(CacheFile
&Cache
)
1394 bool Debug
= _config
->FindI("Debug::pkgAutoRemove",false);
1395 bool doAutoRemove
= _config
->FindB("APT::Get::AutomaticRemove", false);
1396 bool hideAutoRemove
= _config
->FindB("APT::Get::HideAutoRemove");
1397 pkgDepCache::ActionGroup
group(*Cache
);
1400 std::cout
<< "DoAutomaticRemove()" << std::endl
;
1402 if (_config
->FindB("APT::Get::Remove",true) == false &&
1403 doAutoRemove
== true)
1405 c1out
<< _("We are not supposed to delete stuff, can't start "
1406 "AutoRemover") << std::endl
;
1407 doAutoRemove
= false;
1410 string autoremovelist
, autoremoveversions
;
1411 // look over the cache to see what can be removed
1412 for (pkgCache::PkgIterator Pkg
= Cache
->PkgBegin(); ! Pkg
.end(); ++Pkg
)
1414 if (Cache
[Pkg
].Garbage
)
1416 if(Pkg
.CurrentVer() != 0 || Cache
[Pkg
].Install())
1418 std::cout
<< "We could delete %s" << Pkg
.Name() << std::endl
;
1420 // only show stuff in the list that is not yet marked for removal
1421 if(Cache
[Pkg
].Delete() == false)
1423 autoremovelist
+= string(Pkg
.Name()) + " ";
1424 autoremoveversions
+= string(Cache
[Pkg
].CandVersion
) + "\n";
1428 if(Pkg
.CurrentVer() != 0 &&
1429 Pkg
->CurrentState
!= pkgCache::State::ConfigFiles
)
1430 Cache
->MarkDelete(Pkg
, _config
->FindB("APT::Get::Purge", false));
1432 Cache
->MarkKeep(Pkg
, false, false);
1436 if (!hideAutoRemove
)
1437 ShowList(c1out
, _("The following packages were automatically installed and are no longer required:"), autoremovelist
, autoremoveversions
);
1438 if (!doAutoRemove
&& !hideAutoRemove
&& autoremovelist
.size() > 0)
1439 c1out
<< _("Use 'apt-get autoremove' to remove them.") << std::endl
;
1441 // Now see if we destroyed anything
1442 if (Cache
->BrokenCount() != 0)
1444 c1out
<< _("Hmm, seems like the AutoRemover destroyed something which really\n"
1445 "shouldn't happen. Please file a bug report against apt.") << endl
;
1447 c1out
<< _("The following information may help to resolve the situation:") << endl
;
1449 ShowBroken(c1out
,Cache
,false);
1451 return _error
->Error(_("Internal Error, AutoRemover broke stuff"));
1456 // DoUpgrade - Upgrade all packages /*{{{*/
1457 // ---------------------------------------------------------------------
1458 /* Upgrade all packages without installing new packages or erasing old
1460 bool DoUpgrade(CommandLine
&CmdL
)
1463 if (Cache
.OpenForInstall() == false || Cache
.CheckDeps() == false)
1467 if (pkgAllUpgrade(Cache
) == false)
1469 ShowBroken(c1out
,Cache
,false);
1470 return _error
->Error(_("Internal error, AllUpgrade broke stuff"));
1473 return InstallPackages(Cache
,true);
1476 // DoInstallTask - Install task from the command line /*{{{*/
1477 // ---------------------------------------------------------------------
1478 /* Install named task */
1479 bool TryInstallTask(pkgDepCache
&Cache
, pkgProblemResolver
&Fix
,
1481 unsigned int& ExpectedInst
,
1482 const char *taskname
,
1485 const char *start
, *end
;
1486 pkgCache::PkgIterator Pkg
;
1491 pkgRecords
Recs(Cache
);
1493 // build regexp for the task
1495 snprintf(S
, sizeof(S
), "^Task:.*[, ]%s([, ]|$)", taskname
);
1496 if(regcomp(&Pattern
,S
, REG_EXTENDED
| REG_NOSUB
| REG_NEWLINE
) != 0)
1497 return _error
->Error("Failed to compile task regexp");
1502 // two runs, first ignore dependencies, second install any missing
1503 for(int IgnoreBroken
=1; IgnoreBroken
>= 0; IgnoreBroken
--)
1505 for (Pkg
= Cache
.PkgBegin(); Pkg
.end() == false; Pkg
++)
1507 pkgCache::VerIterator ver
= Cache
[Pkg
].CandidateVerIter(Cache
);
1510 pkgRecords::Parser
&parser
= Recs
.Lookup(ver
.FileList());
1511 parser
.GetRec(start
,end
);
1512 strncpy(buf
, start
, end
-start
);
1513 buf
[end
-start
] = 0x0;
1514 if (regexec(&Pattern
,buf
,0,0,0) != 0)
1516 res
&= TryToInstall(Pkg
,Cache
,Fix
,Remove
,IgnoreBroken
,ExpectedInst
);
1521 // now let the problem resolver deal with any issues
1525 _error
->Error(_("Couldn't find task %s"),taskname
);
1531 // DoInstall - Install packages from the command line /*{{{*/
1532 // ---------------------------------------------------------------------
1533 /* Install named packages */
1534 bool DoInstall(CommandLine
&CmdL
)
1537 if (Cache
.OpenForInstall() == false ||
1538 Cache
.CheckDeps(CmdL
.FileSize() != 1) == false)
1541 // Enter the special broken fixing mode if the user specified arguments
1542 bool BrokenFix
= false;
1543 if (Cache
->BrokenCount() != 0)
1546 unsigned int AutoMarkChanged
= 0;
1547 unsigned int ExpectedInst
= 0;
1548 unsigned int Packages
= 0;
1549 pkgProblemResolver
Fix(Cache
);
1551 bool DefRemove
= false;
1552 if (strcasecmp(CmdL
.FileList
[0],"remove") == 0)
1554 else if (strcasecmp(CmdL
.FileList
[0], "purge") == 0)
1556 _config
->Set("APT::Get::Purge", true);
1559 else if (strcasecmp(CmdL
.FileList
[0], "autoremove") == 0)
1561 _config
->Set("APT::Get::AutomaticRemove", "true");
1564 // new scope for the ActionGroup
1566 pkgDepCache::ActionGroup
group(Cache
);
1567 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++)
1569 // Duplicate the string
1570 unsigned int Length
= strlen(*I
);
1572 if (Length
>= sizeof(S
))
1576 // See if we are removing and special indicators..
1577 bool Remove
= DefRemove
;
1579 bool VerIsRel
= false;
1582 if (Length
>= 1 && S
[Length
- 1] == '^')
1585 // tasks must always be confirmed
1586 ExpectedInst
+= 1000;
1587 // see if we can install it
1588 TryInstallTask(Cache
, Fix
, BrokenFix
, ExpectedInst
, S
, Remove
);
1592 while (Cache
->FindPkg(S
).end() == true)
1594 // Handle an optional end tag indicating what to do
1595 if (Length
>= 1 && S
[Length
- 1] == '-')
1602 if (Length
>= 1 && S
[Length
- 1] == '+')
1609 char *Slash
= strchr(S
,'=');
1617 Slash
= strchr(S
,'/');
1628 // Locate the package
1629 pkgCache::PkgIterator Pkg
= Cache
->FindPkg(S
);
1631 if (Pkg
.end() == true)
1633 // Check if the name is a regex
1635 for (I
= S
; *I
!= 0; I
++)
1636 if (*I
== '?' || *I
== '*' || *I
== '|' ||
1637 *I
== '[' || *I
== '^' || *I
== '$')
1640 return _error
->Error(_("Couldn't find package %s"),S
);
1642 // Regexs must always be confirmed
1643 ExpectedInst
+= 1000;
1645 // Compile the regex pattern
1648 if ((Res
= regcomp(&Pattern
,S
,REG_EXTENDED
| REG_ICASE
|
1652 regerror(Res
,&Pattern
,Error
,sizeof(Error
));
1653 return _error
->Error(_("Regex compilation error - %s"),Error
);
1656 // Run over the matches
1658 for (Pkg
= Cache
->PkgBegin(); Pkg
.end() == false; Pkg
++)
1660 if (regexec(&Pattern
,Pkg
.Name(),0,0,0) != 0)
1663 ioprintf(c1out
,_("Note, selecting %s for regex '%s'\n"),
1667 if (TryToChangeVer(Pkg
,Cache
,VerTag
,VerIsRel
) == false)
1670 Hit
|= TryToInstall(Pkg
,Cache
,Fix
,Remove
,BrokenFix
,
1671 ExpectedInst
,false);
1676 return _error
->Error(_("Couldn't find package %s"),S
);
1681 if (TryToChangeVer(Pkg
,Cache
,VerTag
,VerIsRel
) == false)
1683 if (TryToInstall(Pkg
,Cache
,Fix
,Remove
,BrokenFix
,ExpectedInst
) == false)
1686 // see if we need to fix the auto-mark flag
1687 // e.g. apt-get install foo
1688 // where foo is marked automatic
1690 Cache
[Pkg
].Install() == false &&
1691 (Cache
[Pkg
].Flags
& pkgCache::Flag::Auto
) &&
1692 _config
->FindB("APT::Get::ReInstall",false) == false)
1694 ioprintf(c1out
,_("%s set to manually installed.\n"),
1696 Cache
->MarkAuto(Pkg
,false);
1702 /* If we are in the Broken fixing mode we do not attempt to fix the
1703 problems. This is if the user invoked install without -f and gave
1705 if (BrokenFix
== true && Cache
->BrokenCount() != 0)
1707 c1out
<< _("You might want to run `apt-get -f install' to correct these:") << endl
;
1708 ShowBroken(c1out
,Cache
,false);
1710 return _error
->Error(_("Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution)."));
1713 // Call the scored problem resolver
1714 Fix
.InstallProtect();
1715 if (Fix
.Resolve(true) == false)
1718 // Now we check the state of the packages,
1719 if (Cache
->BrokenCount() != 0)
1722 _("Some packages could not be installed. This may mean that you have\n"
1723 "requested an impossible situation or if you are using the unstable\n"
1724 "distribution that some required packages have not yet been created\n"
1725 "or been moved out of Incoming.") << endl
;
1731 _("Since you only requested a single operation it is extremely likely that\n"
1732 "the package is simply not installable and a bug report against\n"
1733 "that package should be filed.") << endl;
1737 c1out
<< _("The following information may help to resolve the situation:") << endl
;
1739 ShowBroken(c1out
,Cache
,false);
1740 return _error
->Error(_("Broken packages"));
1743 if (!DoAutomaticRemove(Cache
))
1746 /* Print out a list of packages that are going to be installed extra
1747 to what the user asked */
1748 if (Cache
->InstCount() != ExpectedInst
)
1751 string VersionsList
;
1752 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
1754 pkgCache::PkgIterator
I(Cache
,Cache
.List
[J
]);
1755 if ((*Cache
)[I
].Install() == false)
1759 for (J
= CmdL
.FileList
+ 1; *J
!= 0; J
++)
1760 if (strcmp(*J
,I
.Name()) == 0)
1764 List
+= string(I
.Name()) + " ";
1765 VersionsList
+= string(Cache
[I
].CandVersion
) + "\n";
1769 ShowList(c1out
,_("The following extra packages will be installed:"),List
,VersionsList
);
1772 /* Print out a list of suggested and recommended packages */
1774 string SuggestsList
, RecommendsList
, List
;
1775 string SuggestsVersions
, RecommendsVersions
;
1776 for (unsigned J
= 0; J
< Cache
->Head().PackageCount
; J
++)
1778 pkgCache::PkgIterator
Pkg(Cache
,Cache
.List
[J
]);
1780 /* Just look at the ones we want to install */
1781 if ((*Cache
)[Pkg
].Install() == false)
1784 // get the recommends/suggests for the candidate ver
1785 pkgCache::VerIterator CV
= (*Cache
)[Pkg
].CandidateVerIter(*Cache
);
1786 for (pkgCache::DepIterator D
= CV
.DependsList(); D
.end() == false; )
1788 pkgCache::DepIterator Start
;
1789 pkgCache::DepIterator End
;
1790 D
.GlobOr(Start
,End
); // advances D
1792 // FIXME: we really should display a or-group as a or-group to the user
1793 // the problem is that ShowList is incapable of doing this
1794 string RecommendsOrList
,RecommendsOrVersions
;
1795 string SuggestsOrList
,SuggestsOrVersions
;
1796 bool foundInstalledInOrGroup
= false;
1799 /* Skip if package is installed already, or is about to be */
1800 string target
= string(Start
.TargetPkg().Name()) + " ";
1802 if ((*Start
.TargetPkg()).SelectedState
== pkgCache::State::Install
1803 || Cache
[Start
.TargetPkg()].Install())
1805 foundInstalledInOrGroup
=true;
1809 /* Skip if we already saw it */
1810 if (int(SuggestsList
.find(target
)) != -1 || int(RecommendsList
.find(target
)) != -1)
1812 foundInstalledInOrGroup
=true;
1816 // this is a dep on a virtual pkg, check if any package that provides it
1817 // should be installed
1818 if(Start
.TargetPkg().ProvidesList() != 0)
1820 pkgCache::PrvIterator I
= Start
.TargetPkg().ProvidesList();
1821 for (; I
.end() == false; I
++)
1823 pkgCache::PkgIterator Pkg
= I
.OwnerPkg();
1824 if (Cache
[Pkg
].CandidateVerIter(Cache
) == I
.OwnerVer() &&
1825 Pkg
.CurrentVer() != 0)
1826 foundInstalledInOrGroup
=true;
1830 if (Start
->Type
== pkgCache::Dep::Suggests
)
1832 SuggestsOrList
+= target
;
1833 SuggestsOrVersions
+= string(Cache
[Start
.TargetPkg()].CandVersion
) + "\n";
1836 if (Start
->Type
== pkgCache::Dep::Recommends
)
1838 RecommendsOrList
+= target
;
1839 RecommendsOrVersions
+= string(Cache
[Start
.TargetPkg()].CandVersion
) + "\n";
1847 if(foundInstalledInOrGroup
== false)
1849 RecommendsList
+= RecommendsOrList
;
1850 RecommendsVersions
+= RecommendsOrVersions
;
1851 SuggestsList
+= SuggestsOrList
;
1852 SuggestsVersions
+= SuggestsOrVersions
;
1858 ShowList(c1out
,_("Suggested packages:"),SuggestsList
,SuggestsVersions
);
1859 ShowList(c1out
,_("Recommended packages:"),RecommendsList
,RecommendsVersions
);
1863 // if nothing changed in the cache, but only the automark information
1864 // we write the StateFile here, otherwise it will be written in
1866 if (AutoMarkChanged
> 0 &&
1867 Cache
->DelCount() == 0 && Cache
->InstCount() == 0 &&
1868 Cache
->BadCount() == 0)
1869 Cache
->writeStateFile(NULL
);
1871 // See if we need to prompt
1872 if (Cache
->InstCount() == ExpectedInst
&& Cache
->DelCount() == 0)
1873 return InstallPackages(Cache
,false,false);
1875 return InstallPackages(Cache
,false);
1878 // DoDistUpgrade - Automatic smart upgrader /*{{{*/
1879 // ---------------------------------------------------------------------
1880 /* Intelligent upgrader that will install and remove packages at will */
1881 bool DoDistUpgrade(CommandLine
&CmdL
)
1884 if (Cache
.OpenForInstall() == false || Cache
.CheckDeps() == false)
1887 c0out
<< _("Calculating upgrade... ") << flush
;
1888 if (pkgDistUpgrade(*Cache
) == false)
1890 c0out
<< _("Failed") << endl
;
1891 ShowBroken(c1out
,Cache
,false);
1895 c0out
<< _("Done") << endl
;
1897 return InstallPackages(Cache
,true);
1900 // DoDSelectUpgrade - Do an upgrade by following dselects selections /*{{{*/
1901 // ---------------------------------------------------------------------
1902 /* Follows dselect's selections */
1903 bool DoDSelectUpgrade(CommandLine
&CmdL
)
1906 if (Cache
.OpenForInstall() == false || Cache
.CheckDeps() == false)
1909 pkgDepCache::ActionGroup
group(Cache
);
1911 // Install everything with the install flag set
1912 pkgCache::PkgIterator I
= Cache
->PkgBegin();
1913 for (;I
.end() != true; I
++)
1915 /* Install the package only if it is a new install, the autoupgrader
1916 will deal with the rest */
1917 if (I
->SelectedState
== pkgCache::State::Install
)
1918 Cache
->MarkInstall(I
,false);
1921 /* Now install their deps too, if we do this above then order of
1922 the status file is significant for | groups */
1923 for (I
= Cache
->PkgBegin();I
.end() != true; I
++)
1925 /* Install the package only if it is a new install, the autoupgrader
1926 will deal with the rest */
1927 if (I
->SelectedState
== pkgCache::State::Install
)
1928 Cache
->MarkInstall(I
,true);
1931 // Apply erasures now, they override everything else.
1932 for (I
= Cache
->PkgBegin();I
.end() != true; I
++)
1935 if (I
->SelectedState
== pkgCache::State::DeInstall
||
1936 I
->SelectedState
== pkgCache::State::Purge
)
1937 Cache
->MarkDelete(I
,I
->SelectedState
== pkgCache::State::Purge
);
1940 /* Resolve any problems that dselect created, allupgrade cannot handle
1941 such things. We do so quite agressively too.. */
1942 if (Cache
->BrokenCount() != 0)
1944 pkgProblemResolver
Fix(Cache
);
1946 // Hold back held packages.
1947 if (_config
->FindB("APT::Ignore-Hold",false) == false)
1949 for (pkgCache::PkgIterator I
= Cache
->PkgBegin(); I
.end() == false; I
++)
1951 if (I
->SelectedState
== pkgCache::State::Hold
)
1959 if (Fix
.Resolve() == false)
1961 ShowBroken(c1out
,Cache
,false);
1962 return _error
->Error(_("Internal error, problem resolver broke stuff"));
1966 // Now upgrade everything
1967 if (pkgAllUpgrade(Cache
) == false)
1969 ShowBroken(c1out
,Cache
,false);
1970 return _error
->Error(_("Internal error, problem resolver broke stuff"));
1973 return InstallPackages(Cache
,false);
1976 // DoClean - Remove download archives /*{{{*/
1977 // ---------------------------------------------------------------------
1979 bool DoClean(CommandLine
&CmdL
)
1981 if (_config
->FindB("APT::Get::Simulate") == true)
1983 cout
<< "Del " << _config
->FindDir("Dir::Cache::archives") << "* " <<
1984 _config
->FindDir("Dir::Cache::archives") << "partial/*" << endl
;
1988 // Lock the archive directory
1990 if (_config
->FindB("Debug::NoLocking",false) == false)
1992 Lock
.Fd(GetLock(_config
->FindDir("Dir::Cache::Archives") + "lock"));
1993 if (_error
->PendingError() == true)
1994 return _error
->Error(_("Unable to lock the download directory"));
1998 Fetcher
.Clean(_config
->FindDir("Dir::Cache::archives"));
1999 Fetcher
.Clean(_config
->FindDir("Dir::Cache::archives") + "partial/");
2003 // DoAutoClean - Smartly remove downloaded archives /*{{{*/
2004 // ---------------------------------------------------------------------
2005 /* This is similar to clean but it only purges things that cannot be
2006 downloaded, that is old versions of cached packages. */
2007 class LogCleaner
: public pkgArchiveCleaner
2010 virtual void Erase(const char *File
,string Pkg
,string Ver
,struct stat
&St
)
2012 c1out
<< "Del " << Pkg
<< " " << Ver
<< " [" << SizeToStr(St
.st_size
) << "B]" << endl
;
2014 if (_config
->FindB("APT::Get::Simulate") == false)
2019 bool DoAutoClean(CommandLine
&CmdL
)
2021 // Lock the archive directory
2023 if (_config
->FindB("Debug::NoLocking",false) == false)
2025 Lock
.Fd(GetLock(_config
->FindDir("Dir::Cache::Archives") + "lock"));
2026 if (_error
->PendingError() == true)
2027 return _error
->Error(_("Unable to lock the download directory"));
2031 if (Cache
.Open() == false)
2036 return Cleaner
.Go(_config
->FindDir("Dir::Cache::archives"),*Cache
) &&
2037 Cleaner
.Go(_config
->FindDir("Dir::Cache::archives") + "partial/",*Cache
);
2040 // DoCheck - Perform the check operation /*{{{*/
2041 // ---------------------------------------------------------------------
2042 /* Opening automatically checks the system, this command is mostly used
2044 bool DoCheck(CommandLine
&CmdL
)
2053 // DoSource - Fetch a source archive /*{{{*/
2054 // ---------------------------------------------------------------------
2055 /* Fetch souce packages */
2063 bool DoSource(CommandLine
&CmdL
)
2066 if (Cache
.Open(false) == false)
2069 if (CmdL
.FileSize() <= 1)
2070 return _error
->Error(_("Must specify at least one package to fetch source for"));
2072 // Read the source list
2074 if (List
.ReadMainList() == false)
2075 return _error
->Error(_("The list of sources could not be read."));
2077 // Create the text record parsers
2078 pkgRecords
Recs(Cache
);
2079 pkgSrcRecords
SrcRecs(List
);
2080 if (_error
->PendingError() == true)
2083 // Create the download object
2084 AcqTextStatus
Stat(ScreenWidth
,_config
->FindI("quiet",0));
2085 pkgAcquire
Fetcher(&Stat
);
2087 DscFile
*Dsc
= new DscFile
[CmdL
.FileSize()];
2089 // insert all downloaded uris into this set to avoid downloading them
2092 // Load the requestd sources into the fetcher
2094 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++, J
++)
2097 pkgSrcRecords::Parser
*Last
= FindSrc(*I
,Recs
,SrcRecs
,Src
,*Cache
);
2100 return _error
->Error(_("Unable to find a source package for %s"),Src
.c_str());
2103 vector
<pkgSrcRecords::File
> Lst
;
2104 if (Last
->Files(Lst
) == false)
2107 // Load them into the fetcher
2108 for (vector
<pkgSrcRecords::File
>::const_iterator I
= Lst
.begin();
2109 I
!= Lst
.end(); I
++)
2111 // Try to guess what sort of file it is we are getting.
2112 if (I
->Type
== "dsc")
2114 Dsc
[J
].Package
= Last
->Package();
2115 Dsc
[J
].Version
= Last
->Version();
2116 Dsc
[J
].Dsc
= flNotDir(I
->Path
);
2119 // Diff only mode only fetches .diff files
2120 if (_config
->FindB("APT::Get::Diff-Only",false) == true &&
2124 // Tar only mode only fetches .tar files
2125 if (_config
->FindB("APT::Get::Tar-Only",false) == true &&
2129 // Dsc only mode only fetches .dsc files
2130 if (_config
->FindB("APT::Get::Dsc-Only",false) == true &&
2134 // don't download the same uri twice (should this be moved to
2135 // the fetcher interface itself?)
2136 if(queued
.find(Last
->Index().ArchiveURI(I
->Path
)) != queued
.end())
2138 queued
.insert(Last
->Index().ArchiveURI(I
->Path
));
2140 // check if we have a file with that md5 sum already localy
2141 if(!I
->MD5Hash
.empty() && FileExists(flNotDir(I
->Path
)))
2143 FileFd
Fd(flNotDir(I
->Path
), FileFd::ReadOnly
);
2145 sum
.AddFD(Fd
.Fd(), Fd
.Size());
2147 if((string
)sum
.Result() == I
->MD5Hash
)
2149 ioprintf(c1out
,_("Skipping already downloaded file '%s'\n"),
2150 flNotDir(I
->Path
).c_str());
2155 new pkgAcqFile(&Fetcher
,Last
->Index().ArchiveURI(I
->Path
),
2157 Last
->Index().SourceInfo(*Last
,*I
),Src
);
2161 // Display statistics
2162 double FetchBytes
= Fetcher
.FetchNeeded();
2163 double FetchPBytes
= Fetcher
.PartialPresent();
2164 double DebBytes
= Fetcher
.TotalNeeded();
2166 // Check for enough free space
2168 string OutputDir
= ".";
2169 if (statvfs(OutputDir
.c_str(),&Buf
) != 0)
2170 return _error
->Errno("statvfs",_("Couldn't determine free space in %s"),
2172 if (unsigned(Buf
.f_bfree
) < (FetchBytes
- FetchPBytes
)/Buf
.f_bsize
)
2175 if (statfs(OutputDir
.c_str(),&Stat
) != 0 ||
2176 unsigned(Stat
.f_type
) != RAMFS_MAGIC
)
2177 return _error
->Error(_("You don't have enough free space in %s"),
2182 if (DebBytes
!= FetchBytes
)
2183 ioprintf(c1out
,_("Need to get %sB/%sB of source archives.\n"),
2184 SizeToStr(FetchBytes
).c_str(),SizeToStr(DebBytes
).c_str());
2186 ioprintf(c1out
,_("Need to get %sB of source archives.\n"),
2187 SizeToStr(DebBytes
).c_str());
2189 if (_config
->FindB("APT::Get::Simulate",false) == true)
2191 for (unsigned I
= 0; I
!= J
; I
++)
2192 ioprintf(cout
,_("Fetch source %s\n"),Dsc
[I
].Package
.c_str());
2196 // Just print out the uris an exit if the --print-uris flag was used
2197 if (_config
->FindB("APT::Get::Print-URIs") == true)
2199 pkgAcquire::UriIterator I
= Fetcher
.UriBegin();
2200 for (; I
!= Fetcher
.UriEnd(); I
++)
2201 cout
<< '\'' << I
->URI
<< "' " << flNotDir(I
->Owner
->DestFile
) << ' ' <<
2202 I
->Owner
->FileSize
<< ' ' << I
->Owner
->HashSum() << endl
;
2207 if (Fetcher
.Run() == pkgAcquire::Failed
)
2210 // Print error messages
2211 bool Failed
= false;
2212 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin(); I
!= Fetcher
.ItemsEnd(); I
++)
2214 if ((*I
)->Status
== pkgAcquire::Item::StatDone
&&
2215 (*I
)->Complete
== true)
2218 fprintf(stderr
,_("Failed to fetch %s %s\n"),(*I
)->DescURI().c_str(),
2219 (*I
)->ErrorText
.c_str());
2223 return _error
->Error(_("Failed to fetch some archives."));
2225 if (_config
->FindB("APT::Get::Download-only",false) == true)
2227 c1out
<< _("Download complete and in download only mode") << endl
;
2231 // Unpack the sources
2232 pid_t Process
= ExecFork();
2236 for (unsigned I
= 0; I
!= J
; I
++)
2238 string Dir
= Dsc
[I
].Package
+ '-' + Cache
->VS().UpstreamVersion(Dsc
[I
].Version
.c_str());
2240 // Diff only mode only fetches .diff files
2241 if (_config
->FindB("APT::Get::Diff-Only",false) == true ||
2242 _config
->FindB("APT::Get::Tar-Only",false) == true ||
2243 Dsc
[I
].Dsc
.empty() == true)
2246 // See if the package is already unpacked
2248 if (stat(Dir
.c_str(),&Stat
) == 0 &&
2249 S_ISDIR(Stat
.st_mode
) != 0)
2251 ioprintf(c0out
,_("Skipping unpack of already unpacked source in %s\n"),
2258 snprintf(S
,sizeof(S
),"%s -x %s",
2259 _config
->Find("Dir::Bin::dpkg-source","dpkg-source").c_str(),
2260 Dsc
[I
].Dsc
.c_str());
2263 fprintf(stderr
,_("Unpack command '%s' failed.\n"),S
);
2264 fprintf(stderr
,_("Check if the 'dpkg-dev' package is installed.\n"));
2269 // Try to compile it with dpkg-buildpackage
2270 if (_config
->FindB("APT::Get::Compile",false) == true)
2272 // Call dpkg-buildpackage
2274 snprintf(S
,sizeof(S
),"cd %s && %s %s",
2276 _config
->Find("Dir::Bin::dpkg-buildpackage","dpkg-buildpackage").c_str(),
2277 _config
->Find("DPkg::Build-Options","-b -uc").c_str());
2281 fprintf(stderr
,_("Build command '%s' failed.\n"),S
);
2290 // Wait for the subprocess
2292 while (waitpid(Process
,&Status
,0) != Process
)
2296 return _error
->Errno("waitpid","Couldn't wait for subprocess");
2299 if (WIFEXITED(Status
) == 0 || WEXITSTATUS(Status
) != 0)
2300 return _error
->Error(_("Child process failed"));
2305 // DoBuildDep - Install/removes packages to satisfy build dependencies /*{{{*/
2306 // ---------------------------------------------------------------------
2307 /* This function will look at the build depends list of the given source
2308 package and install the necessary packages to make it true, or fail. */
2309 bool DoBuildDep(CommandLine
&CmdL
)
2312 if (Cache
.Open(true) == false)
2315 if (CmdL
.FileSize() <= 1)
2316 return _error
->Error(_("Must specify at least one package to check builddeps for"));
2318 // Read the source list
2320 if (List
.ReadMainList() == false)
2321 return _error
->Error(_("The list of sources could not be read."));
2323 // Create the text record parsers
2324 pkgRecords
Recs(Cache
);
2325 pkgSrcRecords
SrcRecs(List
);
2326 if (_error
->PendingError() == true)
2329 // Create the download object
2330 AcqTextStatus
Stat(ScreenWidth
,_config
->FindI("quiet",0));
2331 pkgAcquire
Fetcher(&Stat
);
2334 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++, J
++)
2337 pkgSrcRecords::Parser
*Last
= FindSrc(*I
,Recs
,SrcRecs
,Src
,*Cache
);
2339 return _error
->Error(_("Unable to find a source package for %s"),Src
.c_str());
2341 // Process the build-dependencies
2342 vector
<pkgSrcRecords::Parser::BuildDepRec
> BuildDeps
;
2343 if (Last
->BuildDepends(BuildDeps
, _config
->FindB("APT::Get::Arch-Only",false)) == false)
2344 return _error
->Error(_("Unable to get build-dependency information for %s"),Src
.c_str());
2346 // Also ensure that build-essential packages are present
2347 Configuration::Item
const *Opts
= _config
->Tree("APT::Build-Essential");
2350 for (; Opts
; Opts
= Opts
->Next
)
2352 if (Opts
->Value
.empty() == true)
2355 pkgSrcRecords::Parser::BuildDepRec rec
;
2356 rec
.Package
= Opts
->Value
;
2357 rec
.Type
= pkgSrcRecords::Parser::BuildDependIndep
;
2359 BuildDeps
.push_back(rec
);
2362 if (BuildDeps
.size() == 0)
2364 ioprintf(c1out
,_("%s has no build depends.\n"),Src
.c_str());
2368 // Install the requested packages
2369 unsigned int ExpectedInst
= 0;
2370 vector
<pkgSrcRecords::Parser::BuildDepRec
>::iterator D
;
2371 pkgProblemResolver
Fix(Cache
);
2372 bool skipAlternatives
= false; // skip remaining alternatives in an or group
2373 for (D
= BuildDeps
.begin(); D
!= BuildDeps
.end(); D
++)
2375 bool hasAlternatives
= (((*D
).Op
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
);
2377 if (skipAlternatives
== true)
2379 if (!hasAlternatives
)
2380 skipAlternatives
= false; // end of or group
2384 if ((*D
).Type
== pkgSrcRecords::Parser::BuildConflict
||
2385 (*D
).Type
== pkgSrcRecords::Parser::BuildConflictIndep
)
2387 pkgCache::PkgIterator Pkg
= Cache
->FindPkg((*D
).Package
);
2388 // Build-conflicts on unknown packages are silently ignored
2389 if (Pkg
.end() == true)
2392 pkgCache::VerIterator IV
= (*Cache
)[Pkg
].InstVerIter(*Cache
);
2395 * Remove if we have an installed version that satisfies the
2398 if (IV
.end() == false &&
2399 Cache
->VS().CheckDep(IV
.VerStr(),(*D
).Op
,(*D
).Version
.c_str()) == true)
2400 TryToInstall(Pkg
,Cache
,Fix
,true,false,ExpectedInst
);
2402 else // BuildDep || BuildDepIndep
2404 pkgCache::PkgIterator Pkg
= Cache
->FindPkg((*D
).Package
);
2405 if (_config
->FindB("Debug::BuildDeps",false) == true)
2406 cout
<< "Looking for " << (*D
).Package
<< "...\n";
2408 if (Pkg
.end() == true)
2410 if (_config
->FindB("Debug::BuildDeps",false) == true)
2411 cout
<< " (not found)" << (*D
).Package
<< endl
;
2413 if (hasAlternatives
)
2416 return _error
->Error(_("%s dependency for %s cannot be satisfied "
2417 "because the package %s cannot be found"),
2418 Last
->BuildDepType((*D
).Type
),Src
.c_str(),
2419 (*D
).Package
.c_str());
2423 * if there are alternatives, we've already picked one, so skip
2426 * TODO: this means that if there's a build-dep on A|B and B is
2427 * installed, we'll still try to install A; more importantly,
2428 * if A is currently broken, we cannot go back and try B. To fix
2429 * this would require we do a Resolve cycle for each package we
2430 * add to the install list. Ugh
2434 * If this is a virtual package, we need to check the list of
2435 * packages that provide it and see if any of those are
2438 pkgCache::PrvIterator Prv
= Pkg
.ProvidesList();
2439 for (; Prv
.end() != true; Prv
++)
2441 if (_config
->FindB("Debug::BuildDeps",false) == true)
2442 cout
<< " Checking provider " << Prv
.OwnerPkg().Name() << endl
;
2444 if ((*Cache
)[Prv
.OwnerPkg()].InstVerIter(*Cache
).end() == false)
2448 // Get installed version and version we are going to install
2449 pkgCache::VerIterator IV
= (*Cache
)[Pkg
].InstVerIter(*Cache
);
2451 if ((*D
).Version
[0] != '\0') {
2452 // Versioned dependency
2454 pkgCache::VerIterator CV
= (*Cache
)[Pkg
].CandidateVerIter(*Cache
);
2456 for (; CV
.end() != true; CV
++)
2458 if (Cache
->VS().CheckDep(CV
.VerStr(),(*D
).Op
,(*D
).Version
.c_str()) == true)
2461 if (CV
.end() == true)
2463 if (hasAlternatives
)
2469 return _error
->Error(_("%s dependency for %s cannot be satisfied "
2470 "because no available versions of package %s "
2471 "can satisfy version requirements"),
2472 Last
->BuildDepType((*D
).Type
),Src
.c_str(),
2473 (*D
).Package
.c_str());
2479 // Only consider virtual packages if there is no versioned dependency
2480 if (Prv
.end() == false)
2482 if (_config
->FindB("Debug::BuildDeps",false) == true)
2483 cout
<< " Is provided by installed package " << Prv
.OwnerPkg().Name() << endl
;
2484 skipAlternatives
= hasAlternatives
;
2489 if (IV
.end() == false)
2491 if (_config
->FindB("Debug::BuildDeps",false) == true)
2492 cout
<< " Is installed\n";
2494 if (Cache
->VS().CheckDep(IV
.VerStr(),(*D
).Op
,(*D
).Version
.c_str()) == true)
2496 skipAlternatives
= hasAlternatives
;
2500 if (_config
->FindB("Debug::BuildDeps",false) == true)
2501 cout
<< " ...but the installed version doesn't meet the version requirement\n";
2503 if (((*D
).Op
& pkgCache::Dep::LessEq
) == pkgCache::Dep::LessEq
)
2505 return _error
->Error(_("Failed to satisfy %s dependency for %s: Installed package %s is too new"),
2506 Last
->BuildDepType((*D
).Type
),
2513 if (_config
->FindB("Debug::BuildDeps",false) == true)
2514 cout
<< " Trying to install " << (*D
).Package
<< endl
;
2516 if (TryToInstall(Pkg
,Cache
,Fix
,false,false,ExpectedInst
) == true)
2518 // We successfully installed something; skip remaining alternatives
2519 skipAlternatives
= hasAlternatives
;
2520 if(_config
->FindB("APT::Get::Build-Dep-Automatic", false) == true)
2521 Cache
->MarkAuto(Pkg
, true);
2524 else if (hasAlternatives
)
2526 if (_config
->FindB("Debug::BuildDeps",false) == true)
2527 cout
<< " Unsatisfiable, trying alternatives\n";
2532 return _error
->Error(_("Failed to satisfy %s dependency for %s: %s"),
2533 Last
->BuildDepType((*D
).Type
),
2535 (*D
).Package
.c_str());
2540 Fix
.InstallProtect();
2541 if (Fix
.Resolve(true) == false)
2544 // Now we check the state of the packages,
2545 if (Cache
->BrokenCount() != 0)
2546 return _error
->Error(_("Build-dependencies for %s could not be satisfied."),*I
);
2549 if (InstallPackages(Cache
, false, true) == false)
2550 return _error
->Error(_("Failed to process build dependencies"));
2555 // DoMoo - Never Ask, Never Tell /*{{{*/
2556 // ---------------------------------------------------------------------
2558 bool DoMoo(CommandLine
&CmdL
)
2567 "....\"Have you mooed today?\"...\n";
2572 // ShowHelp - Show a help screen /*{{{*/
2573 // ---------------------------------------------------------------------
2575 bool ShowHelp(CommandLine
&CmdL
)
2577 ioprintf(cout
,_("%s %s for %s compiled on %s %s\n"),PACKAGE
,VERSION
,
2578 COMMON_ARCH
,__DATE__
,__TIME__
);
2580 if (_config
->FindB("version") == true)
2582 cout
<< _("Supported modules:") << endl
;
2584 for (unsigned I
= 0; I
!= pkgVersioningSystem::GlobalListLen
; I
++)
2586 pkgVersioningSystem
*VS
= pkgVersioningSystem::GlobalList
[I
];
2587 if (_system
!= 0 && _system
->VS
== VS
)
2591 cout
<< "Ver: " << VS
->Label
<< endl
;
2593 /* Print out all the packaging systems that will work with
2595 for (unsigned J
= 0; J
!= pkgSystem::GlobalListLen
; J
++)
2597 pkgSystem
*Sys
= pkgSystem::GlobalList
[J
];
2602 if (Sys
->VS
->TestCompatibility(*VS
) == true)
2603 cout
<< "Pkg: " << Sys
->Label
<< " (Priority " << Sys
->Score(*_config
) << ")" << endl
;
2607 for (unsigned I
= 0; I
!= pkgSourceList::Type::GlobalListLen
; I
++)
2609 pkgSourceList::Type
*Type
= pkgSourceList::Type::GlobalList
[I
];
2610 cout
<< " S.L: '" << Type
->Name
<< "' " << Type
->Label
<< endl
;
2613 for (unsigned I
= 0; I
!= pkgIndexFile::Type::GlobalListLen
; I
++)
2615 pkgIndexFile::Type
*Type
= pkgIndexFile::Type::GlobalList
[I
];
2616 cout
<< " Idx: " << Type
->Label
<< endl
;
2623 _("Usage: apt-get [options] command\n"
2624 " apt-get [options] install|remove pkg1 [pkg2 ...]\n"
2625 " apt-get [options] source pkg1 [pkg2 ...]\n"
2627 "apt-get is a simple command line interface for downloading and\n"
2628 "installing packages. The most frequently used commands are update\n"
2632 " update - Retrieve new lists of packages\n"
2633 " upgrade - Perform an upgrade\n"
2634 " install - Install new packages (pkg is libc6 not libc6.deb)\n"
2635 " remove - Remove packages\n"
2636 " autoremove - Remove automatically all unused packages\n"
2637 " purge - Remove and purge packages\n"
2638 " source - Download source archives\n"
2639 " build-dep - Configure build-dependencies for source packages\n"
2640 " dist-upgrade - Distribution upgrade, see apt-get(8)\n"
2641 " dselect-upgrade - Follow dselect selections\n"
2642 " clean - Erase downloaded archive files\n"
2643 " autoclean - Erase old downloaded archive files\n"
2644 " check - Verify that there are no broken dependencies\n"
2647 " -h This help text.\n"
2648 " -q Loggable output - no progress indicator\n"
2649 " -qq No output except for errors\n"
2650 " -d Download only - do NOT install or unpack archives\n"
2651 " -s No-act. Perform ordering simulation\n"
2652 " -y Assume Yes to all queries and do not prompt\n"
2653 " -f Attempt to correct a system with broken dependencies in place\n"
2654 " -m Attempt to continue if archives are unlocatable\n"
2655 " -u Show a list of upgraded packages as well\n"
2656 " -b Build the source package after fetching it\n"
2657 " -V Show verbose version numbers\n"
2658 " -c=? Read this configuration file\n"
2659 " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
2660 "See the apt-get(8), sources.list(5) and apt.conf(5) manual\n"
2661 "pages for more information and options.\n"
2662 " This APT has Super Cow Powers.\n");
2666 // GetInitialize - Initialize things for apt-get /*{{{*/
2667 // ---------------------------------------------------------------------
2669 void GetInitialize()
2671 _config
->Set("quiet",0);
2672 _config
->Set("help",false);
2673 _config
->Set("APT::Get::Download-Only",false);
2674 _config
->Set("APT::Get::Simulate",false);
2675 _config
->Set("APT::Get::Assume-Yes",false);
2676 _config
->Set("APT::Get::Fix-Broken",false);
2677 _config
->Set("APT::Get::Force-Yes",false);
2678 _config
->Set("APT::Get::List-Cleanup",true);
2679 _config
->Set("APT::Get::AutomaticRemove",false);
2682 // SigWinch - Window size change signal handler /*{{{*/
2683 // ---------------------------------------------------------------------
2687 // Riped from GNU ls
2691 if (ioctl(1, TIOCGWINSZ
, &ws
) != -1 && ws
.ws_col
>= 5)
2692 ScreenWidth
= ws
.ws_col
- 1;
2697 int main(int argc
,const char *argv
[])
2699 CommandLine::Args Args
[] = {
2700 {'h',"help","help",0},
2701 {'v',"version","version",0},
2702 {'V',"verbose-versions","APT::Get::Show-Versions",0},
2703 {'q',"quiet","quiet",CommandLine::IntLevel
},
2704 {'q',"silent","quiet",CommandLine::IntLevel
},
2705 {'d',"download-only","APT::Get::Download-Only",0},
2706 {'b',"compile","APT::Get::Compile",0},
2707 {'b',"build","APT::Get::Compile",0},
2708 {'s',"simulate","APT::Get::Simulate",0},
2709 {'s',"just-print","APT::Get::Simulate",0},
2710 {'s',"recon","APT::Get::Simulate",0},
2711 {'s',"dry-run","APT::Get::Simulate",0},
2712 {'s',"no-act","APT::Get::Simulate",0},
2713 {'y',"yes","APT::Get::Assume-Yes",0},
2714 {'y',"assume-yes","APT::Get::Assume-Yes",0},
2715 {'f',"fix-broken","APT::Get::Fix-Broken",0},
2716 {'u',"show-upgraded","APT::Get::Show-Upgraded",0},
2717 {'m',"ignore-missing","APT::Get::Fix-Missing",0},
2718 {'t',"target-release","APT::Default-Release",CommandLine::HasArg
},
2719 {'t',"default-release","APT::Default-Release",CommandLine::HasArg
},
2720 {0,"download","APT::Get::Download",0},
2721 {0,"fix-missing","APT::Get::Fix-Missing",0},
2722 {0,"ignore-hold","APT::Ignore-Hold",0},
2723 {0,"upgrade","APT::Get::upgrade",0},
2724 {0,"force-yes","APT::Get::force-yes",0},
2725 {0,"print-uris","APT::Get::Print-URIs",0},
2726 {0,"diff-only","APT::Get::Diff-Only",0},
2727 {0,"tar-only","APT::Get::Tar-Only",0},
2728 {0,"dsc-only","APT::Get::Dsc-Only",0},
2729 {0,"purge","APT::Get::Purge",0},
2730 {0,"list-cleanup","APT::Get::List-Cleanup",0},
2731 {0,"reinstall","APT::Get::ReInstall",0},
2732 {0,"trivial-only","APT::Get::Trivial-Only",0},
2733 {0,"remove","APT::Get::Remove",0},
2734 {0,"only-source","APT::Get::Only-Source",0},
2735 {0,"arch-only","APT::Get::Arch-Only",0},
2736 {0,"auto-remove","APT::Get::AutomaticRemove",0},
2737 {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0},
2738 {0,"install-recommends","APT::Install-Recommends",CommandLine::Boolean
},
2739 {0,"fix-policy","APT::Get::Fix-Policy-Broken",0},
2740 {'c',"config-file",0,CommandLine::ConfigFile
},
2741 {'o',"option",0,CommandLine::ArbItem
},
2743 CommandLine::Dispatch Cmds
[] = {{"update",&DoUpdate
},
2744 {"upgrade",&DoUpgrade
},
2745 {"install",&DoInstall
},
2746 {"remove",&DoInstall
},
2747 {"purge",&DoInstall
},
2748 {"autoremove",&DoInstall
},
2749 {"purge",&DoInstall
},
2750 {"dist-upgrade",&DoDistUpgrade
},
2751 {"dselect-upgrade",&DoDSelectUpgrade
},
2752 {"build-dep",&DoBuildDep
},
2754 {"autoclean",&DoAutoClean
},
2756 {"source",&DoSource
},
2761 // Set up gettext support
2762 setlocale(LC_ALL
,"");
2763 textdomain(PACKAGE
);
2765 // Parse the command line and initialize the package library
2766 CommandLine
CmdL(Args
,_config
);
2767 if (pkgInitConfig(*_config
) == false ||
2768 CmdL
.Parse(argc
,argv
) == false ||
2769 pkgInitSystem(*_config
,_system
) == false)
2771 if (_config
->FindB("version") == true)
2774 _error
->DumpErrors();
2778 // See if the help should be shown
2779 if (_config
->FindB("help") == true ||
2780 _config
->FindB("version") == true ||
2781 CmdL
.FileSize() == 0)
2787 // Deal with stdout not being a tty
2788 if (!isatty(STDOUT_FILENO
) && _config
->FindI("quiet",0) < 1)
2789 _config
->Set("quiet","1");
2792 devnull
.open("/dev/null");
2794 // Setup the output streams
2795 c0out
.rdbuf(cout
.rdbuf());
2796 c1out
.rdbuf(cout
.rdbuf());
2797 c2out
.rdbuf(cout
.rdbuf());
2798 if (_config
->FindI("quiet",0) > 0)
2799 c0out
.rdbuf(devnull
.rdbuf());
2800 if (_config
->FindI("quiet",0) > 1)
2801 c1out
.rdbuf(devnull
.rdbuf());
2803 // Setup the signals
2804 signal(SIGPIPE
,SIG_IGN
);
2805 signal(SIGWINCH
,SigWinch
);
2808 // Match the operation
2809 CmdL
.DispatchArg(Cmds
);
2811 // Print any errors or warnings found during parsing
2812 if (_error
->empty() == false)
2814 bool Errors
= _error
->PendingError();
2815 _error
->DumpErrors();
2816 return Errors
== true?100:0;