Просмотр исходного кода

calculate Percent as part of pkgAcquireStatus to provide a weighted percent for both items and bytes

Michael Vogt лет назад: 12
Родитель
Сommit
96c6cab1fd
4 измененных файлов с 27 добавлено и 18 удалено
  1. 5 0
      apt-pkg/acquire-item.h
  2. 17 17
      apt-pkg/acquire.cc
  3. 4 0
      apt-pkg/acquire.h
  4. 1 1
      apt-private/acqprogress.cc

+ 5 - 0
apt-pkg/acquire-item.h

@@ -723,6 +723,11 @@ class pkgAcqIndex : public pkgAcquire::Item
     */
     */
    std::string CompressionExtension;
    std::string CompressionExtension;
 
 
+   /** \brief Pointer to the IndexTarget data
+    */
+   const struct IndexTarget * Target;
+   indexRecords *MetaIndexParser;
+
    public:
    public:
    
    
    // Specialized action members
    // Specialized action members

+ 17 - 17
apt-pkg/acquire.cc

@@ -31,6 +31,7 @@
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
 #include <unistd.h>
 #include <unistd.h>
+#include <iomanip>
 
 
 #include <dirent.h>
 #include <dirent.h>
 #include <sys/time.h>
 #include <sys/time.h>
@@ -859,12 +860,6 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
       }
       }
    }
    }
    
    
-   // debug
-   if (_config->FindB("Debug::acquire::progress", false) == true)
-      std::clog << " Bytes: " 
-                << SizeToStr(CurrentBytes) << " / " << SizeToStr(TotalBytes) 
-                << std::endl;
-
    // Normalize the figures and account for unknown size downloads
    // Normalize the figures and account for unknown size downloads
    if (TotalBytes <= 0)
    if (TotalBytes <= 0)
       TotalBytes = 1;
       TotalBytes = 1;
@@ -874,6 +869,12 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
    // Wha?! Is not supposed to happen.
    // Wha?! Is not supposed to happen.
    if (CurrentBytes > TotalBytes)
    if (CurrentBytes > TotalBytes)
       CurrentBytes = TotalBytes;
       CurrentBytes = TotalBytes;
+
+   // debug
+   if (_config->FindB("Debug::acquire::progress", false) == true)
+      std::clog << " Bytes: " 
+                << SizeToStr(CurrentBytes) << " / " << SizeToStr(TotalBytes) 
+                << std::endl;
    
    
    // Compute the CPS
    // Compute the CPS
    struct timeval NewTime;
    struct timeval NewTime;
@@ -894,6 +895,15 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
       Time = NewTime;
       Time = NewTime;
    }
    }
 
 
+   // calculate the percentage, if we have too little data assume 0%
+   // FIXME: the 5k is totally arbitrary 
+   if (TotalBytes < 5*1024)
+      Percent = 0;
+   else 
+      // use both files and bytes because bytes can be unreliable
+      Percent = (0.8 * (CurrentBytes/float(TotalBytes)*100.0) + 
+                 0.2 * (CurrentItems/float(TotalItems)*100.0));
+
    int fd = _config->FindI("APT::Status-Fd",-1);
    int fd = _config->FindI("APT::Status-Fd",-1);
    if(fd > 0) 
    if(fd > 0) 
    {
    {
@@ -911,19 +921,9 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
       else
       else
 	 snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
 	 snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
 	 
 	 
-
-      // calculate the percentage, if we have too little data assume 0%
-      // FIXME: the 5k is totally arbitrary 
-      // FIXME2: instead, use a algorithm where 50% is based on total bytes
-      //         and the other 50% on total files
-      int Percent;
-      if (TotalBytes < 5*1024)
-         Percent = 0;
-      else
-         Percent = (CurrentBytes/float(TotalBytes)*100.0);
       // build the status str
       // build the status str
       status << "dlstatus:" << i
       status << "dlstatus:" << i
-             << ":"  << Percent
+             << ":"  << std::setprecision(3) << Percent
              << ":" << msg 
              << ":" << msg 
              << endl;
              << endl;
 
 

+ 4 - 0
apt-pkg/acquire.h

@@ -714,6 +714,10 @@ class pkgAcquireStatus
    /** \brief The number of items that have been successfully downloaded. */
    /** \brief The number of items that have been successfully downloaded. */
    unsigned long CurrentItems;
    unsigned long CurrentItems;
    
    
+   /** \brief The estimated percentage of the download (0-100)
+    */
+   double Percent;
+
    public:
    public:
 
 
    /** \brief If \b true, the download scheduler should call Pulse()
    /** \brief If \b true, the download scheduler should call Pulse()

+ 1 - 1
apt-private/acqprogress.cc

@@ -170,7 +170,7 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner)
       ScreenWidth = sizeof(Buffer)-1;
       ScreenWidth = sizeof(Buffer)-1;
 
 
    // Put in the percent done
    // Put in the percent done
-   sprintf(S,"%.0f%%",((CurrentBytes + CurrentItems)*100.0)/(TotalBytes+TotalItems));
+   sprintf(S,"%.0f%%", Percent);
 
 
    bool Shown = false;
    bool Shown = false;
    for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0;
    for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0;