]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-get.cc
Fixed string case compare problem
[apt.git] / cmdline / apt-get.cc
index e134acf7ade423b0833d1c2f6597ecc6ec79293b..4933e38a7394cf27a68b18cde256d4812c873fec 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-get.cc,v 1.81 1999/10/21 06:35:00 jgg Exp $
+// $Id: apt-get.cc,v 1.91 1999/11/28 01:03:28 jgg Exp $
 /* ######################################################################
    
    apt-get - Cover for dpkg
@@ -167,7 +167,7 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
          
       // Print out each package and the failed dependencies
       out <<"  " <<  I.Name() << ":";
-      int Indent = strlen(I.Name()) + 3;
+      unsigned Indent = strlen(I.Name()) + 3;
       bool First = true;
       if (Cache[I].InstVerIter(Cache).end() == true)
       {
@@ -185,43 +185,62 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
         if (Cache->IsImportantDep(End) == false || 
             (Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
            continue;
-        
-        if (First == false)
-           for (int J = 0; J != Indent; J++)
-              out << ' ';
-        First = false;
 
-        out << ' ' << End.DepType() << ": " << End.TargetPkg().Name();
-        
-        // Show a quick summary of the version requirements
-        if (End.TargetVer() != 0)
-           out << " (" << End.CompType() << " " << End.TargetVer() << 
-           ")";
-        
-        /* Show a summary of the target package if possible. In the case
-           of virtual packages we show nothing */       
-        pkgCache::PkgIterator Targ = End.TargetPkg();
-        if (Targ->ProvidesList == 0)
+        bool FirstOr = true;
+        while (1)
         {
-           out << " but ";
-           pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
-           if (Ver.end() == false)
-              out << Ver.VerStr() << (Now?" is installed":" is to be installed");
+           if (First == false)
+              for (unsigned J = 0; J != Indent; J++)
+                 out << ' ';
+           First = false;
+
+           if (FirstOr == false)
+           {
+              for (unsigned J = 0; J != strlen(End.DepType()) + 3; J++)
+                 out << ' ';
+           }
            else
+              out << ' ' << End.DepType() << ": ";
+           FirstOr = false;
+           
+           out << Start.TargetPkg().Name();
+        
+           // Show a quick summary of the version requirements
+           if (Start.TargetVer() != 0)
+              out << " (" << Start.CompType() << " " << Start.TargetVer() << 
+              ")";
+           
+           /* Show a summary of the target package if possible. In the case
+              of virtual packages we show nothing */    
+           pkgCache::PkgIterator Targ = Start.TargetPkg();
+           if (Targ->ProvidesList == 0)
            {
-              if (Cache[Targ].CandidateVerIter(Cache).end() == true)
+              out << " but ";
+              pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
+              if (Ver.end() == false)
+                 out << Ver.VerStr() << (Now?" is installed":" is to be installed");
+              else
               {
-                 if (Targ->ProvidesList == 0)
-                    out << "it is not installable";
+                 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 a virtual package";
-              }                  
-              else
-                 out << (Now?"it is not installed":"it is not going to be installed");
-           }          
-        }
-        
-        out << endl;
+                    out << (Now?"it is not installed":"it is not going to be installed");
+              }               
+           }
+           
+           if (Start != End)
+              cout << " or";
+           out << endl;
+           
+           if (Start == End)
+              break;
+           Start++;
+        }       
       }            
    }   
 }
@@ -389,6 +408,7 @@ void Stats(ostream &out,pkgDepCache &Dep)
 {
    unsigned long Upgrade = 0;
    unsigned long Install = 0;
+   unsigned long ReInstall = 0;
    for (pkgCache::PkgIterator I = Dep.PkgBegin(); I.end() == false; I++)
    {
       if (Dep[I].NewInstall() == true)
@@ -396,11 +416,15 @@ void Stats(ostream &out,pkgDepCache &Dep)
       else
         if (Dep[I].Upgrade() == true)
            Upgrade++;
+      if (Dep[I].Delete() == false && (Dep[I].iFlags & pkgDepCache::ReInstall) == pkgDepCache::ReInstall)
+        ReInstall++;
    }   
 
    out << Upgrade << " packages upgraded, " << 
-      Install << " newly installed, " <<
-      Dep.DelCount() << " to remove and " << 
+      Install << " newly installed, ";
+   if (ReInstall != 0)
+      out << ReInstall << " reinstalled, ";
+   out << Dep.DelCount() << " to remove and " << 
       Dep.KeepCount() << " not upgraded." << endl;
 
    if (Dep.BadCount() != 0)
@@ -526,10 +550,14 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey =
       return _error->Error("Internal Error, InstallPackages was called with broken packages!");
    }
 
-   if (Cache->DelCount() == 0 && Cache->InstCount() == 0 && 
+   if (Cache->DelCount() == 0 && Cache->InstCount() == 0 &&
        Cache->BadCount() == 0)
       return true;
 
+   // No remove flag
+   if (Cache->DelCount() != 0 && _config->FindB("APT::Get::No-Remove",false) == true)
+      return _error->Error("Packages need to be removed but No Remove was specified.");
+       
    // Run the simulator ..
    if (_config->FindB("APT::Get::Simulate") == true)
    {
@@ -589,6 +617,15 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey =
       c1out << SizeToStr(DebBytes) << 'B';
       
    c1out << " of archives. After unpacking ";
+   
+   // Size delta
+   if (Cache->UsrSize() >= 0)
+      c1out << SizeToStr(Cache->UsrSize()) << "B will be used." << endl;
+   else
+      c1out << SizeToStr(-1*Cache->UsrSize()) << "B will be freed." << endl;
+
+   if (_error->PendingError() == true)
+      return false;
 
    // Check for enough free space
    struct statfs Buf;
@@ -599,15 +636,6 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey =
    if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize)
       return _error->Error("Sorry, you don't have enough free space in %s to hold all the .debs.",
                           OutputDir.c_str());
-   
-   // Size delta
-   if (Cache->UsrSize() >= 0)
-      c1out << SizeToStr(Cache->UsrSize()) << "B will be used." << endl;
-   else
-      c1out << SizeToStr(-1*Cache->UsrSize()) << "B will be freed." << endl;
-
-   if (_error->PendingError() == true)
-      return false;
 
    // Fail safe check
    if (_config->FindI("quiet",0) >= 2 ||
@@ -619,6 +647,9 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey =
 
    if (Essential == true && Saftey == true)
    {
+      if (_config->FindB("APT::Get::Trivial-Only",false) == true)
+        return _error->Error("Trivial Only specified but this is not a trivial operation.");
+      
       c2out << "You are about to do something potentially harmful" << endl;
       c2out << "To continue type in the phrase 'Yes, I understand this may be bad'" << endl;
       c2out << " ?] " << flush;
@@ -629,10 +660,13 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey =
       }     
    }
    else
-   {
+   {      
       // Prompt to continue
       if (Ask == true || Fail == true)
       {            
+        if (_config->FindB("APT::Get::Trivial-Only",false) == true)
+           return _error->Error("Trivial Only specified but this is not a trivial operation.");
+        
         if (_config->FindI("quiet",0) < 2 &&
             _config->FindB("APT::Get::Assume-Yes",false) == false)
         {
@@ -745,7 +779,7 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
        Pkg.ProvidesList()->NextProvides == 0)
    {
       pkgCache::PkgIterator Tmp = Pkg.ProvidesList().OwnerPkg();
-      c1out << "Note, installing " << Tmp.Name() << " instead of " << Pkg.Name() << endl;
+      c1out << "Note, selecting " << Tmp.Name() << " instead of " << Pkg.Name() << endl;
       Pkg = Tmp;
    }
    
@@ -760,7 +794,14 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
    
    // Check if there is something at all to install
    pkgDepCache::StateCache &State = Cache[Pkg];
-   if (State.CandidateVer == 0)
+   if (Remove == true && Pkg->CurrentVer == 0)
+   {
+      if (AllowFail == false)
+        return false;
+      return _error->Error("Package %s is not installed",Pkg.Name());
+   }
+   
+   if (State.CandidateVer == 0 && Remove == false)
    {
       if (AllowFail == false)
         return false;
@@ -789,7 +830,8 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
       {
         c1out << "Package " << Pkg.Name() << " 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;
+        c1out << "never uploaded, has been obsoleted or is not available with the contents " << endl;
+        c1out << "of sources.list" << endl;
         
         string List;
         pkgCache::DepIterator Dep = Pkg.RevDependsList();
@@ -805,8 +847,9 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
       _error->Error("Package %s has no installation candidate",Pkg.Name());
       return false;
    }
-   
-   Fix.Protect(Pkg);
+
+   Fix.Clear(Pkg);
+   Fix.Protect(Pkg);   
    if (Remove == true)
    {
       Fix.Remove(Pkg);
@@ -818,8 +861,18 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
    Cache.MarkInstall(Pkg,false);
    if (State.Install() == false)
    {
-      if (AllowFail == true)
-        c1out << "Sorry, " << Pkg.Name() << " is already the newest version"  << endl;
+      if (_config->FindB("APT::Get::ReInstall",false) == true)
+      {
+        if (Pkg->CurrentVer == 0 || Pkg.CurrentVer().Downloadable() == false)
+           c1out << "Sorry, re-installation of " << Pkg.Name() << " is not possible, it cannot be downloaded" << endl;
+        else
+           Cache.SetReInstall(Pkg,true);
+      }      
+      else
+      {
+        if (AllowFail == true)
+           c1out << "Sorry, " << Pkg.Name() << " is already the newest version"  << endl;
+      }      
    }   
    else
       ExpectedInst++;
@@ -1182,6 +1235,22 @@ bool DoDSelectUpgrade(CommandLine &CmdL)
 /* */
 bool DoClean(CommandLine &CmdL)
 {
+   if (_config->FindB("APT::Get::Simulate") == true)
+   {
+      cout << "Del " << _config->FindDir("Dir::Cache::archives") << "* " <<
+        _config->FindDir("Dir::Cache::archives") << "partial/*" << endl;
+      return true;
+   }
+   
+   // Lock the archive directory
+   FileFd Lock;
+   if (_config->FindB("Debug::NoLocking",false) == false)
+   {
+      Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
+      if (_error->PendingError() == true)
+        return _error->Error("Unable to lock the download directory");
+   }
+   
    pkgAcquire Fetcher;
    Fetcher.Clean(_config->FindDir("Dir::Cache::archives"));
    Fetcher.Clean(_config->FindDir("Dir::Cache::archives") + "partial/");
@@ -1206,6 +1275,15 @@ class LogCleaner : public pkgArchiveCleaner
 
 bool DoAutoClean(CommandLine &CmdL)
 {
+   // Lock the archive directory
+   FileFd Lock;
+   if (_config->FindB("Debug::NoLocking",false) == false)
+   {
+      Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
+      if (_error->PendingError() == true)
+        return _error->Error("Unable to lock the download directory");
+   }
+   
    CacheFile Cache;
    if (Cache.Open() == false)
       return false;
@@ -1583,11 +1661,11 @@ int main(int argc,const char *argv[])
       {'d',"download-only","APT::Get::Download-Only",0},
       {'b',"compile","APT::Get::Compile",0},
       {'b',"build","APT::Get::Compile",0},
-      {'s',"simulate","APT::Get::Simulate",0},      
-      {'s',"just-print","APT::Get::Simulate",0},      
-      {'s',"recon","APT::Get::Simulate",0},      
-      {'s',"no-act","APT::Get::Simulate",0},      
-      {'y',"yes","APT::Get::Assume-Yes",0},      
+      {'s',"simulate","APT::Get::Simulate",0},
+      {'s',"just-print","APT::Get::Simulate",0},
+      {'s',"recon","APT::Get::Simulate",0},
+      {'s',"no-act","APT::Get::Simulate",0},
+      {'y',"yes","APT::Get::Assume-Yes",0},
       {'y',"assume-yes","APT::Get::Assume-Yes",0},      
       {'f',"fix-broken","APT::Get::Fix-Broken",0},
       {'u',"show-upgraded","APT::Get::Show-Upgraded",0},
@@ -1602,6 +1680,9 @@ int main(int argc,const char *argv[])
       {0,"tar-only","APT::Get::tar-Only",0},
       {0,"purge","APT::Get::Purge",0},
       {0,"list-cleanup","APT::Get::List-Cleanup",0},
+      {0,"reinstall","APT::Get::ReInstall",0},
+      {0,"trivial-only","APT::Get::Trivial-Only",0},
+      {0,"no-remove","APT::Get::No-Remove",0},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {0,0,0,0}};