[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#714877: apt: Please support an apt-get update for a single repository only



Package: apt
Version: 0.9.9
Severity: wishlist

Hi maintainers,

It would be useful to have the ability to apt-get update a single repository, without touching the state of other repositories or downloading their package lists. Updating a single sources.list.d file would also suffice, and might be easier in terms of syntax.


The primary use case for this would be sbuild: currently, the apt resolver needs to create a new repository inside the chroot and make apt aware of it, but if sbuild is run without --apt-update, running `apt-get update` (which updates every repository) would be inappropriate. So it resorts to doing some black magic to write out the appropriate /var/lib/apt/lists/ file without actually invoking apt:

http://sources.debian.net/src/sbuild/0.64.0-1/lib/Sbuild/ResolverBase.pm#L179

Being able to run `apt-get update sbuild-build-depends-archive.list` or something would be much cleaner.

The reason I care about this is that I'm hoping to extend sbuild to allow adding a new repository at the sbuild command line to provide build dependencies for the current build only (see bug #700522). I'd rather not add code to do _more_ of the black magic, and would prefer that apt had a documented interface to take a new sources.list.d file into account without updating everything else.

There's also a use case for "normal" end users with lots of repositories, where a full `apt-get update` takes a while, and they're only looking for a package in a specific repository.

I tried writing a patch for this, but the most obvious approach ended up with apt thinking that one sources.list.d file was the _only_ one configured (and forgetting all other repositories). Patch is attached because why not; I haven't had time to look into making it work properly, yet, but might end up doing so eventually.

--
Geoffrey Thomas
gthomas@mokafive.com
diff -Nru apt-0.9.7.5ubuntu5.2/apt-pkg/cachefile.cc apt-0.9.7.5ubuntu5.2+gthomas1/apt-pkg/cachefile.cc
--- apt-0.9.7.5ubuntu5.2/apt-pkg/cachefile.cc	2012-11-01 02:48:40.000000000 -0700
+++ apt-0.9.7.5ubuntu5.2+gthomas1/apt-pkg/cachefile.cc	2013-03-04 18:22:17.000000000 -0800
@@ -110,6 +110,20 @@
    return true;
 }
 									/*}}}*/
+// CacheFile::BuildSourceListFile - Open and build one sources.list file/*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgCacheFile::BuildSourceListFile(std::string file, OpProgress *Progress)
+{
+   if (SrcList != NULL)
+      return true;
+
+   SrcList = new pkgSourceList();
+   if (SrcList->Read(file) == false)
+      return _error->Error(_("The list of sources could not be read."));
+   return true;
+}
+									/*}}}*/
 // CacheFile::BuildPolicy - Open and build all relevant preferences	/*{{{*/
 // ---------------------------------------------------------------------
 /* */
diff -Nru apt-0.9.7.5ubuntu5.2/apt-pkg/cachefile.h apt-0.9.7.5ubuntu5.2+gthomas1/apt-pkg/cachefile.h
--- apt-0.9.7.5ubuntu5.2/apt-pkg/cachefile.h	2012-11-01 02:48:40.000000000 -0700
+++ apt-0.9.7.5ubuntu5.2+gthomas1/apt-pkg/cachefile.h	2013-03-04 18:22:12.000000000 -0800
@@ -62,6 +62,7 @@
    bool BuildCaches(OpProgress *Progress = NULL,bool WithLock = true);
    __deprecated bool BuildCaches(OpProgress &Progress,bool const &WithLock = true) { return BuildCaches(&Progress, WithLock); };
    bool BuildSourceList(OpProgress *Progress = NULL);
+   bool BuildSourceListFile(std::string file, OpProgress *Progress = NULL);
    bool BuildPolicy(OpProgress *Progress = NULL);
    bool BuildDepCache(OpProgress *Progress = NULL);
    bool Open(OpProgress *Progress = NULL, bool WithLock = true);
diff -Nru apt-0.9.7.5ubuntu5.2/cmdline/apt-get.cc apt-0.9.7.5ubuntu5.2+gthomas1/cmdline/apt-get.cc
--- apt-0.9.7.5ubuntu5.2/cmdline/apt-get.cc	2012-11-09 00:40:44.000000000 -0800
+++ apt-0.9.7.5ubuntu5.2+gthomas1/cmdline/apt-get.cc	2013-03-04 18:21:04.000000000 -0800
@@ -1641,14 +1641,19 @@
 /* */
 bool DoUpdate(CommandLine &CmdL)
 {
-   if (CmdL.FileSize() != 1)
-      return _error->Error(_("The update command takes no arguments"));
+   if (CmdL.FileSize() > 2)
+      return _error->Error(_("The update command takes at most one argument"));
 
    CacheFile Cache;
 
    // Get the source list
-   if (Cache.BuildSourceList() == false)
-      return false;
+   if (CmdL.FileSize() == 2) {
+      if (Cache.BuildSourceListFile(CmdL.FileList[1]) == false)
+         return false;
+   } else {
+      if (Cache.BuildSourceList() == false)
+         return false;
+   }
    pkgSourceList *List = Cache.GetSourceList();
 
    // Create the progress

Reply to: