From 96c6cab1fd5a5de19fbd552b42e1dd1c08417946 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 16 Apr 2014 17:41:11 +0200 Subject: calculate Percent as part of pkgAcquireStatus to provide a weighted percent for both items and bytes --- apt-pkg/acquire-item.h | 5 +++++ apt-pkg/acquire.cc | 34 +++++++++++++++++----------------- apt-pkg/acquire.h | 4 ++++ apt-private/acqprogress.cc | 2 +- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index bf5cb09c8..ab4a69c13 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -723,6 +723,11 @@ class pkgAcqIndex : public pkgAcquire::Item */ std::string CompressionExtension; + /** \brief Pointer to the IndexTarget data + */ + const struct IndexTarget * Target; + indexRecords *MetaIndexParser; + public: // Specialized action members diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 46d5e6386..37964c943 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -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 if (TotalBytes <= 0) TotalBytes = 1; @@ -874,6 +869,12 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) // Wha?! Is not supposed to happen. if (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 struct timeval NewTime; @@ -894,6 +895,15 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) 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); if(fd > 0) { @@ -911,19 +921,9 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) else 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 status << "dlstatus:" << i - << ":" << Percent + << ":" << std::setprecision(3) << Percent << ":" << msg << endl; diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h index ef16d8556..0113021b2 100644 --- a/apt-pkg/acquire.h +++ b/apt-pkg/acquire.h @@ -714,6 +714,10 @@ class pkgAcquireStatus /** \brief The number of items that have been successfully downloaded. */ unsigned long CurrentItems; + /** \brief The estimated percentage of the download (0-100) + */ + double Percent; + public: /** \brief If \b true, the download scheduler should call Pulse() diff --git a/apt-private/acqprogress.cc b/apt-private/acqprogress.cc index fe7a45e12..adec37405 100644 --- a/apt-private/acqprogress.cc +++ b/apt-private/acqprogress.cc @@ -170,7 +170,7 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner) ScreenWidth = sizeof(Buffer)-1; // Put in the percent done - sprintf(S,"%.0f%%",((CurrentBytes + CurrentItems)*100.0)/(TotalBytes+TotalItems)); + sprintf(S,"%.0f%%", Percent); bool Shown = false; for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0; -- cgit v1.2.3