summaryrefslogtreecommitdiff
path: root/cmdline/apt-get.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cmdline/apt-get.cc')
-rw-r--r--cmdline/apt-get.cc153
1 files changed, 113 insertions, 40 deletions
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 14a65449c..1bf87349b 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-get.cc,v 1.2 1998/10/08 04:55:05 jgg Exp $
+// $Id: apt-get.cc,v 1.3 1998/10/19 23:45:36 jgg Exp $
/* ######################################################################
apt-get - Cover for dpkg
@@ -85,49 +85,66 @@ void ShowBroken(ostream &out,pkgDepCache &Cache)
pkgCache::PkgIterator I = Cache.PkgBegin();
for (;I.end() != true; I++)
{
- if (Cache[I].InstBroken() == true)
+ if (Cache[I].InstBroken() == false)
+ continue;
+
+ // Print out each package and the failed dependencies
+ out <<" " << I.Name() << ":";
+ int Indent = strlen(I.Name()) + 3;
+ bool First = true;
+ if (Cache[I].InstVerIter(Cache).end() == true)
{
- // Print out each package and the failed dependencies
- out <<" " << I.Name() << ":";
- int Indent = strlen(I.Name()) + 3;
- bool First = true;
- for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false; D++)
+ cout << endl;
+ continue;
+ }
+
+ for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false; D++)
+ {
+ if (Cache.IsImportantDep(D) == false || (Cache[D] &
+ pkgDepCache::DepInstall) != 0)
+ continue;
+
+ if (First == false)
+ for (int J = 0; J != Indent; J++)
+ out << ' ';
+ First = false;
+
+ if (D->Type == pkgCache::Dep::Conflicts)
+ out << " Conflicts:" << D.TargetPkg().Name();
+ else
+ out << " Depends:" << D.TargetPkg().Name();
+
+ // Show a quick summary of the version requirements
+ if (D.TargetVer() != 0)
+ out << " (" << D.CompType() << " " << D.TargetVer() <<
+ ")";
+
+ /* Show a summary of the target package if possible. In the case
+ of virtual packages we show nothing */
+
+ pkgCache::PkgIterator Targ = D.TargetPkg();
+ if (Targ->ProvidesList == 0)
{
- if (Cache.IsImportantDep(D) == false || (Cache[D] &
- pkgDepCache::DepInstall) != 0)
- continue;
-
- if (First == false)
- for (int J = 0; J != Indent; J++)
- out << ' ';
- First = false;
-
- if (D->Type == pkgCache::Dep::Conflicts)
- out << " Conflicts:" << D.TargetPkg().Name();
+ out << " but ";
+ pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
+ if (Ver.end() == false)
+ out << Ver.VerStr() << " is installed";
else
- out << " Depends:" << D.TargetPkg().Name();
-
- // Show a quick summary of the version requirements
- if (D.TargetVer() != 0)
- out << " (" << D.CompType() << " " << D.TargetVer() <<
- ")";
-
- /* Show a summary of the target package if possible. In the case
- of virtual packages we show nothing */
- pkgCache::PkgIterator Targ = D.TargetPkg();
- if (Targ->ProvidesList == 0)
{
- out << " but ";
- pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
- if (Ver.end() == false)
- out << Ver.VerStr() << "is installed";
+ if (Cache[Targ].CandidateVerIter(Cache).end() == true)
+ {
+ if (Targ->ProvidesList == 0)
+ out << "it is not installable";
+ else
+ out << "it is a virtual package";
+ }
else
out << "it is not installed";
- }
-
- out << endl;
- }
- }
+ }
+ }
+
+ out << endl;
+ }
}
}
/*}}}*/
@@ -340,7 +357,7 @@ bool CacheFile::Open()
Progress.Done();
// Open the cache file
- File = new FileFd(_config->FindDir("Dir::Cache::pkgcache"),FileFd::ReadOnly);
+ File = new FileFd(_config->FindFile("Dir::Cache::pkgcache"),FileFd::ReadOnly);
if (_error->PendingError() == true)
return false;
@@ -463,8 +480,13 @@ bool DoInstall(CommandLine &CmdL)
return false;
int ExpectedInst = 0;
+ int Packages = 0;
pkgProblemResolver Fix(Cache);
+ bool DefRemove = false;
+ if (strcasecmp(CmdL.FileList[0],"remove") == 0)
+ DefRemove = true;
+
for (const char **I = CmdL.FileList + 1; *I != 0; I++)
{
// Duplicate the string
@@ -475,26 +497,60 @@ bool DoInstall(CommandLine &CmdL)
strcpy(S,*I);
// See if we are removing the package
- bool Remove = false;
+ bool Remove = DefRemove;
if (S[Length - 1] == '-')
{
Remove = true;
S[--Length] = 0;
}
+ if (S[Length - 1] == '+')
+ {
+ Remove = false;
+ S[--Length] = 0;
+ }
// Locate the package
pkgCache::PkgIterator Pkg = Cache->FindPkg(S);
+ Packages++;
if (Pkg.end() == true)
return _error->Error("Couldn't find package %s",S);
// Check if there is something new to install
pkgDepCache::StateCache &State = (*Cache)[Pkg];
if (State.CandidateVer == 0)
+ {
+ if (Pkg->ProvidesList != 0)
+ {
+ c1out << "Package " << S << " is a virtual package provided by:" << endl;
+
+ pkgCache::PrvIterator I = Pkg.ProvidesList();
+ for (; I.end() == false; I++)
+ {
+ pkgCache::PkgIterator Pkg = I.OwnerPkg();
+
+ if ((*Cache)[Pkg].CandidateVerIter(*Cache) == I.OwnerVer())
+ c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() << endl;
+
+ if ((*Cache)[Pkg].InstVerIter(*Cache) == I.OwnerVer())
+ c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() <<
+ " [Installed]"<< endl;
+ }
+ c1out << "You should explicly select one to install." << endl;
+ }
+ else
+ {
+ c1out << "Package " << S << " has no available version, but exists in the database." << endl;
+ c1out << "This typically means that the package was mentioned in a dependency and " << endl;
+ c1out << "never uploaded, or that it is an obsolete package." << endl;
+ }
+
return _error->Error("Package %s has no installation candidate",S);
+ }
Fix.Protect(Pkg);
if (Remove == true)
{
+ Fix.Remove(Pkg);
Cache->MarkDelete(Pkg);
continue;
}
@@ -512,12 +568,27 @@ bool DoInstall(CommandLine &CmdL)
}
// Call the scored problem resolver
+ Fix.InstallProtect();
if (Fix.Resolve(true) == false)
_error->Discard();
// Now we check the state of the packages,
if (Cache->BrokenCount() != 0)
{
+ c1out << "Some packages could not be installed. This may mean that you have" << endl;
+ c1out << "requested an impossible situation or if you are using the unstable" << endl;
+ c1out << "distribution that some required packages have not yet been created" << endl;
+ c1out << "or been moved out of Incoming." << endl;
+ if (Packages == 1)
+ {
+ c1out << endl;
+ c1out << "Since you only requested a single operation it is extremely likely that" << endl;
+ c1out << "the package is simply not installable and a bug report against" << endl;
+ c1out << "that package should be filed." << endl;
+ }
+
+ c1out << "The following information may help to resolve the situation:" << endl;
+ c1out << endl;
ShowBroken(c1out,Cache);
return _error->Error("Sorry, broken packages");
}
@@ -659,6 +730,7 @@ int ShowHelp()
cout << " update - Retrieve new lists of packages" << endl;
cout << " upgrade - Perform an upgrade" << endl;
cout << " install - Install new packages (pkg is libc6 not libc6.deb)" << endl;
+ cout << " remove - Remove packages" << endl;
cout << " dist-upgrade - Distribution upgrade, see apt-get(8)" << endl;
cout << " dselect-upgrade - Follow dselect selections" << endl;
cout << " clean - Erase downloaded archive files" << endl;
@@ -746,6 +818,7 @@ int main(int argc,const char *argv[])
} Map[] = {{"update",&DoUpdate},
{"upgrade",&DoUpgrade},
{"install",&DoInstall},
+ {"remove",&DoInstall},
{"dist-upgrade",&DoDistUpgrade},
{"dselect-upgrade",&DoDSelectUpgrade},
{"clean",&DoClean},