]> git.saurik.com Git - apt.git/commitdiff
Merge remote-tracking branch 'mvo/feature/upgrade-with-new' into debian/sid
authorMichael Vogt <mvo@debian.org>
Tue, 8 Oct 2013 17:59:04 +0000 (19:59 +0200)
committerMichael Vogt <mvo@debian.org>
Tue, 8 Oct 2013 17:59:04 +0000 (19:59 +0200)
1  2 
apt-private/private-cmndline.cc
cmdline/apt-get.cc
doc/apt-get.8.xml

index 5124ac157358e5864e2dcc884b16ecd9c6e6a72c,121d72ede4a17d536bcd89e912f8d66d097c990a..8ba6629a802d4b26c5e74c187d839e1d47850a70
@@@ -62,12 -62,8 +62,12 @@@ bool addArgumentsAPTCache(std::vector<C
     {
        addArg(0, "all-names", "APT::Cache::AllNames", 0);
     }
 +   else if (CmdMatches("unmet"))
 +   {
 +      addArg('i', "important", "APT::Cache::Important", 0);
 +   }
     else if (CmdMatches("gencaches", "showsrc", "showpkg", "stats", "dump",
 -          "dumpavail", "unmet", "showauto", "policy", "madison"))
 +          "dumpavail", "showauto", "policy", "madison"))
        ;
     else
        return false;
@@@ -120,7 -116,7 +120,7 @@@ bool addArgumentsAPTGet(std::vector<Com
     if (CmdMatches("install", "remove", "purge", "upgrade", "dist-upgrade",
            "dselect-upgrade", "autoremove"))
     {
 -      addArg(0, "dpkg-progress", "DpkgPM::Progress", 0);
 +      addArg(0, "show-progress", "DpkgPM::Progress", 0);
        addArg('f', "fix-broken", "APT::Get::Fix-Broken", 0);
        addArg(0, "purge", "APT::Get::Purge", 0);
        addArg('V',"verbose-versions","APT::Get::Show-Versions",0);
        addArg(0, "solver", "APT::Solver", CommandLine::HasArg);
        if (CmdMatches("upgrade"))
        {
-        addArg(0, "allow-new", "APT::Get::UpgradeAllowNew", 0);
+          addArg(0, "new-pkgs", "APT::Get::Upgrade-Allow-New", 
+                 CommandLine::Boolean);
        }
     }
     else if (CmdMatches("update"))
diff --combined cmdline/apt-get.cc
index 630a9489b31c0351fba6b0952400ea9fe49794e4,3a41b8c1fb9c81dd554abf9974d6a14d106a8478..e5e22e16635a7e31260acb0dca0f68740912cfe9
@@@ -50,7 -50,7 +50,7 @@@
  #include <apt-pkg/pkgrecords.h>
  #include <apt-pkg/indexfile.h>
  
 -
 +#include <apt-private/private-download.h>
  #include <apt-private/private-install.h>
  #include <apt-private/private-upgrade.h>
  #include <apt-private/private-output.h>
  #include <apt-private/acqprogress.h>
  
  #include <set>
 +#include <fstream>
 +#include <sstream>
 +
  #include <locale.h>
  #include <langinfo.h>
 -#include <fstream>
  #include <termios.h>
  #include <sys/ioctl.h>
  #include <sys/stat.h>
@@@ -78,6 -76,7 +78,6 @@@
  #include <errno.h>
  #include <regex.h>
  #include <sys/wait.h>
 -#include <sstream>
  
  #include <apt-private/private-output.h>
  #include <apt-private/private-main.h>
  #include <apti18n.h>
                                                                        /*}}}*/
  
 -
  using namespace std;
  
 -
 -
  // TryToInstallBuildDep - Try to install a single package             /*{{{*/
  // ---------------------------------------------------------------------
  /* This used to be inlined in DoInstall, but with the advent of regex package
@@@ -525,7 -527,7 +525,7 @@@ bool DoDownload(CommandLine &CmdL
     CacheFile Cache;
     if (Cache.ReadOnlyOpen() == false)
        return false;
 -   
 +
     APT::CacheSetHelper helper(c0out);
     APT::VersionList verset = APT::VersionList::FromCommandLine(Cache,
                CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper);
     if (verset.empty() == true)
        return false;
  
 +   AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet", 0));
     pkgAcquire Fetcher;
 -   AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet",0));
 -   if (_config->FindB("APT::Get::Print-URIs") == false)
 -      Fetcher.Setup(&Stat);
 +   if (Fetcher.Setup(&Stat) == false)
 +      return false;
  
     pkgRecords Recs(Cache);
     pkgSourceList *SrcList = Cache.GetSourceList();
 -   bool gotAll = true;
  
 -   for (APT::VersionList::const_iterator Ver = verset.begin(); 
 -        Ver != verset.end(); 
 -        ++Ver) 
 +   // reuse the usual acquire methods for deb files, but don't drop them into
 +   // the usual directories - keep everything in the current directory
 +   std::vector<std::string> storefile(verset.size());
 +   std::string const cwd = SafeGetCWD();
 +   _config->Set("Dir::Cache::Archives", cwd);
 +   int i = 0;
 +   for (APT::VersionList::const_iterator Ver = verset.begin();
 +       Ver != verset.end(); ++Ver, ++i)
     {
 -      string descr;
 -      // get the right version
 -      pkgCache::PkgIterator Pkg = Ver.ParentPkg();
 -      pkgRecords::Parser &rec=Recs.Lookup(Ver.FileList());
 -      pkgCache::VerFileIterator Vf = Ver.FileList();
 -      if (Vf.end() == true)
 -      {
 -       _error->Error("Can not find VerFile for %s in version %s", Pkg.FullName().c_str(), Ver.VerStr());
 -       gotAll = false;
 -       continue;
 -      }
 -      pkgCache::PkgFileIterator F = Vf.File();
 -      pkgIndexFile *index;
 -      if(SrcList->FindIndex(F, index) == false)
 -      {
 -       _error->Error(_("Can't find a source to download version '%s' of '%s'"), Ver.VerStr(), Pkg.FullName().c_str());
 -       gotAll = false;
 -       continue;
 -      }
 -      string uri = index->ArchiveURI(rec.FileName());
 -      strprintf(descr, _("Downloading %s %s"), Pkg.Name(), Ver.VerStr());
 -      // get the most appropriate hash
 -      HashString hash;
 -      if (rec.SHA512Hash() != "")
 -         hash = HashString("sha512", rec.SHA512Hash());
 -      else if (rec.SHA256Hash() != "")
 -         hash = HashString("sha256", rec.SHA256Hash());
 -      else if (rec.SHA1Hash() != "")
 -         hash = HashString("sha1", rec.SHA1Hash());
 -      else if (rec.MD5Hash() != "")
 -         hash = HashString("md5", rec.MD5Hash());
 -      // get the file
 -      new pkgAcqFile(&Fetcher, uri, hash.toStr(), (*Ver)->Size, descr, Pkg.Name(), ".");
 +      pkgAcquire::Item *I = new pkgAcqArchive(&Fetcher, SrcList, &Recs, *Ver, storefile[i]);
 +      std::string const filename = cwd + flNotDir(storefile[i]);
 +      storefile[i].assign(filename);
 +      I->DestFile.assign(filename);
     }
 -   if (gotAll == false)
 -      return false;
  
     // Just print out the uris and exit if the --print-uris flag was used
     if (_config->FindB("APT::Get::Print-URIs") == true)
     {
        pkgAcquire::UriIterator I = Fetcher.UriBegin();
        for (; I != Fetcher.UriEnd(); ++I)
 -       cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' << 
 +       cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' <<
               I->Owner->FileSize << ' ' << I->Owner->HashSum() << endl;
        return true;
     }
  
 -   return (Fetcher.Run() == pkgAcquire::Continue);
 +   if (_error->PendingError() == true || CheckAuth(Fetcher, false) == false)
 +      return false;
 +
 +   bool Failed = false;
 +   if (AcquireRun(Fetcher, 0, &Failed, NULL) == false)
 +      return false;
 +
 +   // copy files in local sources to the current directory
 +   for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); ++I)
 +      if ((*I)->Local == true && (*I)->Status == pkgAcquire::Item::StatDone)
 +      {
 +       std::string const filename = cwd + flNotDir((*I)->DestFile);
 +       std::ifstream src((*I)->DestFile.c_str(), std::ios::binary);
 +       std::ofstream dst(filename.c_str(), std::ios::binary);
 +       dst << src.rdbuf();
 +      }
 +
 +   return Failed == false;
  }
                                                                        /*}}}*/
  // DoCheck - Perform the check operation                              /*{{{*/
@@@ -803,10 -815,27 +803,10 @@@ bool DoSource(CommandLine &CmdL
        delete[] Dsc;
        return true;
     }
 -   
 -   // Run it
 -   if (Fetcher.Run() == pkgAcquire::Failed)
 -   {
 -      delete[] Dsc;
 -      return false;
 -   }
  
 -   // Print error messages
 +   // Run it
     bool Failed = false;
 -   for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); ++I)
 -   {
 -      if ((*I)->Status == pkgAcquire::Item::StatDone &&
 -        (*I)->Complete == true)
 -       continue;
 -      
 -      fprintf(stderr,_("Failed to fetch %s  %s\n"),(*I)->DescURI().c_str(),
 -            (*I)->ErrorText.c_str());
 -      Failed = true;
 -   }
 -   if (Failed == true)
 +   if (AcquireRun(Fetcher, 0, &Failed, NULL) == false || Failed == true)
     {
        delete[] Dsc;
        return _error->Error(_("Failed to fetch some archives."));
@@@ -1596,14 -1625,15 +1596,14 @@@ void SigWinch(int
  #endif
  }
                                                                        /*}}}*/
 -
 -bool DoUpgrade(CommandLine &CmdL)
 +bool DoUpgrade(CommandLine &CmdL)                                     /*{{{*/
  {
-    if (_config->FindB("APT::Get::UpgradeAllowNew", false) == true)
+    if (_config->FindB("APT::Get::Upgrade-Allow-New", false) == true)
        return DoUpgradeWithAllowNewPackages(CmdL);
     else
        return DoUpgradeNoNewPackages(CmdL);
  }
 -
 +                                                                      /*}}}*/
  int main(int argc,const char *argv[])                                 /*{{{*/
  {
     CommandLine::Dispatch Cmds[] = {{"update",&DoUpdate},
diff --combined doc/apt-get.8.xml
index 18a559c0b6a21711defaf39a3049ffacfcf9c4a1,6ccd9e5ecabba7af9b19058fb726d7fcfa07bd32..4c050ec03a7618a9de554b1bb6adeae080d067da
       Configuration Item: <literal>APT::Ignore-Hold</literal>.</para></listitem>
       </varlistentry>
  
+      <varlistentry><term><option>--with-new-pkgs</option></term>
+      <listitem><para>Allow installing new packages when used in
+      conjunction with <literal>upgrade</literal>.  This is useful if
+      the update of a installed package requires new dependencies to be
+      installed. Instead of holding the package back <literal>upgrade</literal>
+      will upgrade the package and install the new dependencies. Note that
+      <literal>upgrade</literal> with this option will never remove packages,
+      only allow adding new ones.
+      Configuration Item:  <literal>APT::Get::Upgrade-Allow-New</literal>.
+      </para></listitem>
+      </varlistentry>
       <varlistentry><term><option>--no-upgrade</option></term>
       <listitem><para>Do not upgrade packages; when used in conjunction with <literal>install</literal>,
       <literal>no-upgrade</literal> will prevent packages on the command line
       This is useful for tools like pbuilder.
       Configuration Item: <literal>APT::Get::AllowUnauthenticated</literal>.</para></listitem>
       </varlistentry>
 -     
 +
 +     <varlistentry><term><option>--show-progress</option></term>
 +     <listitem><para>Show user friendly progress information in the
 +     terminal window when packages are installed, upgraded or
 +     removed. For a machine parsable version of this data see
 +     README.progress-reporting in the apt doc directory.
 +     <literal>DpkgPM::Progress</literal>.</para></listitem>
 +     </varlistentry>
 +    
  
       &apt-commonoptions;