]> git.saurik.com Git - apt.git/commitdiff
* apt-pkg/contrib/strutl.cc:
authorMichael Vogt <mvo@debian.org>
Thu, 9 Apr 2009 02:36:34 +0000 (04:36 +0200)
committerMichael Vogt <mvo@debian.org>
Thu, 9 Apr 2009 02:36:34 +0000 (04:36 +0200)
  - fix TimeToStr i18n (LP: #289807)
* [ABI break] merge support for http redirects, thanks to
  Jeff Licquia and Anthony Towns
* [ABI break] use int for the package IDs (thanks to Steve Cotton)
* apt-pkg/pkgcache.cc:
  - do not run "dpkg --configure pkg" if pkg is in trigger-awaited
    state (LP: #322955)
* methods/https.cc:
  - add Acquire::https::AllowRedirect support
* Clarify the --help for 'purge' (LP: #243948)
* cmdline/apt-get.cc
  - fix "apt-get source pkg" if there is a binary package and
    a source package of the same name but from different
    packages (LP: #330103)
* cmdline/acqprogress.cc:
  - Call pkgAcquireStatus::Pulse even if quiet, so that we still get
    dlstatus messages on the status-fd (LP: #290234).

21 files changed:
.bzr-builddeb/default.conf [new file with mode: 0644]
.bzr-builddeb/default.conf.orig [new file with mode: 0644]
apt-pkg/acquire-method.cc
apt-pkg/acquire-method.h
apt-pkg/acquire-worker.cc
apt-pkg/contrib/strutl.cc
apt-pkg/deb/debsystem.cc
apt-pkg/deb/dpkgpm.cc
apt-pkg/makefile
apt-pkg/pkgcache.cc
apt-pkg/pkgcache.h
cmdline/acqprogress.cc
cmdline/apt-get.cc
debian/changelog
doc/examples/configure-index
ftparchive/cachedb.cc
methods/http.cc
methods/http.h
methods/https.cc
methods/makefile
pre-build.sh [new file with mode: 0755]

diff --git a/.bzr-builddeb/default.conf b/.bzr-builddeb/default.conf
new file mode 100644 (file)
index 0000000..f2c0825
--- /dev/null
@@ -0,0 +1,5 @@
+[BUILDDEB]
+native = true
+
+[HOOKS]
+pre-build=./pre-build.sh
diff --git a/.bzr-builddeb/default.conf.orig b/.bzr-builddeb/default.conf.orig
new file mode 100644 (file)
index 0000000..9c55498
--- /dev/null
@@ -0,0 +1,2 @@
+[BUILDDEB]
+native = true
index bc29417f776e9d3b5db93b7d3fedf0229c2094e6..acf1156dcd75162187314d385d1b0524bb94ec9a 100644 (file)
@@ -447,6 +447,38 @@ void pkgAcqMethod::Status(const char *Format,...)
 }
                                                                        /*}}}*/
 
+// AcqMethod::Redirect - Send a redirect message                       /*{{{*/
+// ---------------------------------------------------------------------
+/* This method sends the redirect message and also manipulates the queue
+   to keep the pipeline synchronized. */
+void pkgAcqMethod::Redirect(const string &NewURI)
+{
+   string CurrentURI = "<UNKNOWN>";
+   if (Queue != 0)
+      CurrentURI = Queue->Uri;
+   char S[1024];
+   snprintf(S, sizeof(S)-50, "103 Redirect\nURI: %s\nNew-URI: %s\n\n",
+         CurrentURI.c_str(), NewURI.c_str());
+
+   if (write(STDOUT_FILENO,S,strlen(S)) != (ssize_t)strlen(S))
+      exit(100);
+
+   // Change the URI for the request.
+   Queue->Uri = NewURI;
+
+   /* To keep the pipeline synchronized, move the current request to
+      the end of the queue, past the end of the current pipeline. */
+   FetchItem *I;
+   for (I = Queue; I->Next != 0; I = I->Next) ;
+   I->Next = Queue;
+   Queue = Queue->Next;
+   I->Next->Next = 0;
+   if (QueueBack == 0)
+      QueueBack = I->Next;
+}
+                                                                        /*}}}*/
+
 // AcqMethod::FetchResult::FetchResult - Constructor                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
index e02eab01859e25cff57849660d532fdb26dc8f46..fab77e66469dd8139b19041c7a2fd341f44b7521 100644 (file)
@@ -84,6 +84,8 @@ class pkgAcqMethod
    void Log(const char *Format,...);
    void Status(const char *Format,...);
    
+   void Redirect(const string &NewURI);
    int Run(bool Single = false);
    inline void SetFailExtraMsg(string Msg) {FailExtra = Msg;};
    
index 1a754dae905cd3f8aa6e49076ed07c7098be3e65..78c68737c32f4d3aef1a37de6314e6b4cfd4d3e8 100644 (file)
@@ -220,6 +220,20 @@ bool pkgAcquire::Worker::RunMessages()
         Status = LookupTag(Message,"Message");
         break;
            
+         // 103 Redirect
+         case 103:
+         {
+            if (Itm == 0)
+            {
+               _error->Error("Method gave invalid 103 Redirect message");
+               break;
+            }
+            string NewURI = LookupTag(Message,"New-URI",URI.c_str());
+            Itm->URI = NewURI;
+            break;
+         }
+   
         // 200 URI Start
         case 200:
         {
index bd374fd1e74ad47974c6949161d2af3a95827fcb..a69cf01eca77ef1d449eea7b16398e57e896274b 100644 (file)
@@ -331,23 +331,27 @@ string TimeToStr(unsigned long Sec)
    {
       if (Sec > 60*60*24)
       {
-        sprintf(S,"%lid %lih%limin%lis",Sec/60/60/24,(Sec/60/60) % 24,(Sec/60) % 60,Sec % 60);
+        //d means days, h means hours, min means minutes, s means seconds
+        sprintf(S,_("%lid %lih %limin %lis"),Sec/60/60/24,(Sec/60/60) % 24,(Sec/60) % 60,Sec % 60);
         break;
       }
       
       if (Sec > 60*60)
       {
-        sprintf(S,"%lih%limin%lis",Sec/60/60,(Sec/60) % 60,Sec % 60);
+        //h means hours, min means minutes, s means seconds
+        sprintf(S,_("%lih %limin %lis"),Sec/60/60,(Sec/60) % 60,Sec % 60);
         break;
       }
       
       if (Sec > 60)
       {
-        sprintf(S,"%limin%lis",Sec/60,Sec % 60);
+        //min means minutes, s means seconds
+        sprintf(S,_("%limin %lis"),Sec/60,Sec % 60);
         break;
       }
-      
-      sprintf(S,"%lis",Sec);
+
+      //s means seconds
+      sprintf(S,_("%lis"),Sec);
       break;
    }
    
index 11a84f1c61e5aa0517b9d1d742371a27d5551ec0..baa98f54668eb7f75c1ba4e05dc52f4b5b2f288b 100644 (file)
@@ -96,7 +96,7 @@ bool debSystem::UnLock(bool NoErrors)
       return false;
    
    if (LockCount < 1)
-      return _error->Error("Not locked");
+      return _error->Error(_("Not locked"));
    if (--LockCount == 0)
    {
       close(LockFD);
index 40aafafa495cccaad2f77822fe50bc2eb387b6c6..85e54988e8beb104720d7204f7126c2793cd7ae3 100644 (file)
@@ -777,16 +777,14 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       sighandler_t old_SIGHUP = signal(SIGHUP,SIG_IGN);
 
       struct   termios tt;
-      struct   termios tt_out;
       struct   winsize win;
       int      master;
       int      slave;
 
       // FIXME: setup sensible signal handling (*ick*)
       tcgetattr(0, &tt);
-      tcgetattr(1, &tt_out);
       ioctl(0, TIOCGWINSZ, (char *)&win);
-      if (openpty(&master, &slave, NULL, &tt_out, &win) < 0) 
+      if (openpty(&master, &slave, NULL, &tt, &win) < 0) 
       {
         const char *s = _("Can not write log, openpty() "
                           "failed (/dev/pts not mounted?)\n");
index 1b78c94f687667eb0305fff122070187fce0c348..087f177409aea21afbea679ad0a552a52d1b8ece 100644 (file)
@@ -13,7 +13,7 @@ include ../buildlib/defaults.mak
 # methods/makefile - FIXME
 LIBRARY=apt-pkg
 LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER)
-MAJOR=4.6
+MAJOR=4.7
 MINOR=0
 SLIBS=$(PTHREADLIB) $(INTLLIBS) -lutil
 APT_DOMAIN:=libapt-pkg$(MAJOR)
index 8eb62089a8369af4c23f89b07045a71804ed5169..4fbf42c4bb6c4f82dd919ad8fbe2647eb58df06d 100644 (file)
@@ -275,8 +275,12 @@ pkgCache::PkgIterator::OkState pkgCache::PkgIterator::State() const
    
    if (Pkg->CurrentState == pkgCache::State::UnPacked ||
        Pkg->CurrentState == pkgCache::State::HalfConfigured ||
-       Pkg->CurrentState == pkgCache::State::TriggersPending ||
-       Pkg->CurrentState == pkgCache::State::TriggersAwaited)
+      //we don't need to care for triggers awaiting packages
+      //dpkg will deal with them automatically when the 
+      //trigger pending action is run (those packages are usually
+      //in half-configured or triggers-pending state)
+      //Pkg->CurrentState == pkgCache::State::TriggersAwaited
+       Pkg->CurrentState == pkgCache::State::TriggersPending)
       return NeedsConfigure;
    
    if (Pkg->CurrentState == pkgCache::State::HalfInstalled ||
index 59d5003bba4f7ecc0f151b1c8e82ba94639d13eb..759e9a2251fdf8d706c91ee9adf67123c545b201 100644 (file)
@@ -214,7 +214,7 @@ struct pkgCache::Package
    unsigned char InstState;         // Flags
    unsigned char CurrentState;      // State
    
-   unsigned short ID;
+   unsigned int ID;
    unsigned long Flags;
 };
 
@@ -235,7 +235,7 @@ struct pkgCache::PackageFile
    
    // Linked list
    map_ptrloc NextFile;        // PackageFile
-   unsigned short ID;
+   unsigned int ID;
    time_t mtime;                  // Modification time for the file
 };
 
@@ -272,7 +272,7 @@ struct pkgCache::Version
    map_ptrloc Size;              // These are the .deb size
    map_ptrloc InstalledSize;
    unsigned short Hash;
-   unsigned short ID;
+   unsigned int ID;
    unsigned char Priority;
 };
 
@@ -289,7 +289,7 @@ struct pkgCache::Description
    map_ptrloc NextDesc;          // Description
    map_ptrloc ParentPkg;         // Package
 
-   unsigned short ID;
+   unsigned int ID;
 };
 
 struct pkgCache::Dependency
index a5fee1db52170688d3dbfee27e84d94ecd2dd3a0..b3ded4142f651f831db799604b6527075bf13a9d 100644 (file)
@@ -145,11 +145,11 @@ void AcqTextStatus::Stop()
    bandwidth and ETA indicator. */
 bool AcqTextStatus::Pulse(pkgAcquire *Owner)
 {
+   pkgAcquireStatus::Pulse(Owner);
+   
    if (Quiet > 0)
       return true;
    
-   pkgAcquireStatus::Pulse(Owner);
-   
    enum {Long = 0,Medium,Short} Mode = Long;
    
    char Buffer[sizeof(BlankLine)];
index a7221d47dd576c6568da3a89c40674f3d39f517a..ccf53ed25bcce359206f342834b924081bb26d84 100644 (file)
@@ -1272,16 +1272,23 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
         }
       }   
    }
-   
-   // No source package name..
-   if (Src.empty() == true)
-      Src = TmpSrc;
-   
+
    // The best hit
    pkgSrcRecords::Parser *Last = 0;
    unsigned long Offset = 0;
    string Version;
    bool IsMatch = false;
+   bool MatchSrcOnly = false;
+
+   // No source package name..
+   if (Src.empty() == true)
+      Src = TmpSrc;
+   else 
+      // if we have a source pkg name, make sure to only search
+      // for srcpkg names, otherwise apt gets confused if there
+      // is a binary package "pkg1" and a source package "pkg1"
+      // with the same name but that comes from different packages
+      MatchSrcOnly = true;
    
    // If we are matching by version then we need exact matches to be happy
    if (VerTag.empty() == false)
@@ -1291,13 +1298,11 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
       binary packages in the search */
    pkgSrcRecords::Parser *Parse;
    SrcRecs.Restart();
-   while ((Parse = SrcRecs.Find(Src.c_str(),false)) != 0)
+   while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0)
    {
       string Ver = Parse->Version();
       
-      // Skip name mismatches
-      if (IsMatch == true && Parse->Package() != Src)
-        continue;
+        ioprintf(c1out,  _("No source package '%s' picking '%s' instead\n"), Parse->Package().c_str(), Src.c_str());
       
       if (VerTag.empty() == false)
       {
@@ -2632,7 +2637,7 @@ bool ShowHelp(CommandLine &CmdL)
       "   install - Install new packages (pkg is libc6 not libc6.deb)\n"
       "   remove - Remove packages\n"
       "   autoremove - Remove automatically all unused packages\n"
-      "   purge - Remove and purge packages\n"
+      "   purge - Remove packages and config files\n"
       "   source - Download source archives\n"
       "   build-dep - Configure build-dependencies for source packages\n"
       "   dist-upgrade - Distribution upgrade, see apt-get(8)\n"
index 5ddd98a0dd369783522bd639e0890012c484f3a7..6fe3b7a70d5d2c558bdaca9e6dd5b92a2b971eda 100644 (file)
@@ -18,6 +18,26 @@ apt (0.7.20.3) UNRELEASED; urgency=low
   [ Michael Vogt ]
   * methods/gpgv.cc:
     - properly check for expired and revoked keys (closes: #433091)
+  * apt-pkg/contrib/strutl.cc:
+    - fix TimeToStr i18n (LP: #289807)
+  * [ABI break] merge support for http redirects, thanks to
+    Jeff Licquia and Anthony Towns
+  * [ABI break] use int for the package IDs (thanks to Steve Cotton)
+  * apt-pkg/pkgcache.cc:
+    - do not run "dpkg --configure pkg" if pkg is in trigger-awaited
+      state (LP: #322955)
+  * methods/https.cc:
+    - add Acquire::https::AllowRedirect support
+  * Clarify the --help for 'purge' (LP: #243948)
+  * cmdline/apt-get.cc
+    - fix "apt-get source pkg" if there is a binary package and
+      a source package of the same name but from different 
+      packages (LP: #330103)
+
+  [ Colin Watson ]
+  * cmdline/acqprogress.cc:
+    - Call pkgAcquireStatus::Pulse even if quiet, so that we still get
+      dlstatus messages on the status-fd (LP: #290234).
 
  -- Michael Vogt <mvo@debian.org>  Wed, 08 Apr 2009 22:37:01 +0200
 
index db07f189ee84096b40a8390b9acd617c8c852ce9..5f29a2d3f0725e05b90c239b8d22a383424244fc 100644 (file)
@@ -133,7 +133,8 @@ Acquire
     Proxy::http.us.debian.org "DIRECT";  // Specific per-host setting
     Timeout "120";
     Pipeline-Depth "5";
-    
+    AllowRedirect  "true";
+
     // Cache Control. Note these do not work with Squid 2.0.2
     No-Cache "false";
     Max-Age "86400";     // 1 Day age on index files
@@ -150,7 +151,8 @@ Acquire
        Verify-Peer "false";
        SslCert "/etc/apt/some.pem";
         CaPath  "/etc/ssl/certs";
-        Verify-Host" "2";
+        Verify-Host" "true";
+        AllowRedirect  "true";
   };
 
   ftp
index 8de3a0b9ef14eecacdbe54ff60515e36b987143d..ff9a92d3264f2f78013893949e9ce944e1c07945 100644 (file)
@@ -463,6 +463,7 @@ bool CacheDB::Clean()
       
       Cursor->c_del(Cursor,0);
    }
+   Dbp->compact(Dbp, NULL, NULL, NULL, NULL, DB_FREE_SPACE, NULL);
 
    return true;
 }
index b3c791fa0a0e2fd555e81b4361dd7076b08e88bf..1bf798da44a9e02eac0d715186993380bd3146e8 100644 (file)
@@ -39,6 +39,7 @@
 #include <errno.h>
 #include <string.h>
 #include <iostream>
+#include <map>
 #include <apti18n.h>
 
 // Internet stuff
@@ -57,6 +58,7 @@ int HttpMethod::FailFd = -1;
 time_t HttpMethod::FailTime = 0;
 unsigned long PipelineDepth = 10;
 unsigned long TimeOut = 120;
+bool AllowRedirect = false;
 bool Debug = false;
 URI Proxy;
 
@@ -628,6 +630,12 @@ bool ServerState::HeaderLine(string Line)
       return true;
    }
 
+   if (stringcasecmp(Tag,"Location:") == 0)
+   {
+      Location = Val;
+      return true;
+   }
+
    return true;
 }
                                                                        /*}}}*/
@@ -900,7 +908,9 @@ bool HttpMethod::ServerDie(ServerState *Srv)
      1 - IMS hit
      3 - Unrecoverable error 
      4 - Error with error content page
-     5 - Unrecoverable non-server error (close the connection) */
+     5 - Unrecoverable non-server error (close the connection) 
+     6 - Try again with a new or changed URI
+ */
 int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
 {
    // Not Modified
@@ -912,6 +922,27 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
       return 1;
    }
    
+   /* Redirect
+    *
+    * Note that it is only OK for us to treat all redirection the same
+    * because we *always* use GET, not other HTTP methods.  There are
+    * three redirection codes for which it is not appropriate that we
+    * redirect.  Pass on those codes so the error handling kicks in.
+    */
+   if (AllowRedirect
+       && (Srv->Result > 300 && Srv->Result < 400)
+       && (Srv->Result != 300       // Multiple Choices
+           && Srv->Result != 304    // Not Modified
+           && Srv->Result != 306))  // (Not part of HTTP/1.1, reserved)
+   {
+      if (!Srv->Location.empty())
+      {
+         NextURI = Srv->Location;
+         return 6;
+      }
+      /* else pass through for error message */
+   }
    /* We have a reply we dont handle. This should indicate a perm server
       failure */
    if (Srv->Result < 200 || Srv->Result >= 300)
@@ -1026,6 +1057,7 @@ bool HttpMethod::Configuration(string Message)
    if (pkgAcqMethod::Configuration(Message) == false)
       return false;
    
+   AllowRedirect = _config->FindB("Acquire::http::AllowRedirect",true);
    TimeOut = _config->FindI("Acquire::http::Timeout",TimeOut);
    PipelineDepth = _config->FindI("Acquire::http::Pipeline-Depth",
                                  PipelineDepth);
@@ -1039,6 +1071,10 @@ bool HttpMethod::Configuration(string Message)
 /* */
 int HttpMethod::Loop()
 {
+   typedef vector<string> StringVector;
+   typedef vector<string>::iterator StringVectorIterator;
+   map<string, StringVector> Redirected;
+
    signal(SIGTERM,SigTerm);
    signal(SIGINT,SigTerm);
    
@@ -1225,6 +1261,46 @@ int HttpMethod::Loop()
            break;
         }
         
+         // Try again with a new URL
+         case 6:
+         {
+            // Clear rest of response if there is content
+            if (Server->HaveContent)
+            {
+               File = new FileFd("/dev/null",FileFd::WriteExists);
+               Server->RunData();
+               delete File;
+               File = 0;
+            }
+
+            /* Detect redirect loops.  No more redirects are allowed
+               after the same URI is seen twice in a queue item. */
+            StringVector &R = Redirected[Queue->DestFile];
+            bool StopRedirects = false;
+            if (R.size() == 0)
+               R.push_back(Queue->Uri);
+            else if (R[0] == "STOP" || R.size() > 10)
+               StopRedirects = true;
+            else
+            {
+               for (StringVectorIterator I = R.begin(); I != R.end(); I++)
+                  if (Queue->Uri == *I)
+                  {
+                     R[0] = "STOP";
+                     break;
+                  }
+               R.push_back(Queue->Uri);
+            }
+            if (StopRedirects == false)
+               Redirect(NextURI);
+            else
+               Fail();
+            break;
+         }
+
         default:
         Fail(_("Internal error"));
         break;
index 6753a990122d9ffb556f463157a3a7ba7975ae99..13f02ec77b0b0c3d7560128ed07bd7c938c2ff50 100644 (file)
@@ -99,6 +99,7 @@ struct ServerState
    enum {Chunked,Stream,Closes} Encoding;
    enum {Header, Data} State;
    bool Persistent;
+   string Location;
    
    // This is a Persistent attribute of the server itself.
    bool Pipeline;
@@ -143,6 +144,8 @@ class HttpMethod : public pkgAcqMethod
    static time_t FailTime;
    static void SigTerm(int);
    
+   string NextURI;
+   
    public:
    friend class ServerState;
 
index 98dfeefa10ad638673580f07e985828d9094b11c..8bf44b52a995b994f6ba252aa386d1d39d171859 100644 (file)
@@ -208,6 +208,11 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout);
 
+   // set redirect options and default to 10 redirects
+   bool AllowRedirect = _config->FindI("Acquire::https::AllowRedirect", true);
+   curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, AllowRedirect);
+   curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10);
+
    // debug
    if(_config->FindB("Debug::Acquire::https", false))
       curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
@@ -248,7 +253,6 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
    // cleanup
    if(success != 0) 
    {
-      unlink(File->Name().c_str());
       _error->Error("%s", curl_errorstr);
       Fail();
       return true;
index d9481dbcc30f1cda93597798d856ecdbce3321af..78bdbc96f033a724462f43d8ef96a95cff21a5bb 100644 (file)
@@ -7,7 +7,7 @@ include ../buildlib/defaults.mak
 BIN := $(BIN)/methods
 
 # FIXME..
-LIB_APT_PKG_MAJOR = 4.6
+LIB_APT_PKG_MAJOR = 4.7
 APT_DOMAIN := libapt-pkg$(LIB_APT_PKG_MAJOR)
 
 # The file method
diff --git a/pre-build.sh b/pre-build.sh
new file mode 100755 (executable)
index 0000000..2c7d28c
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+make -f Makefile startup doc