]> git.saurik.com Git - apt.git/commitdiff
prevent C++ locale number formatting in text APIs
authorDavid Kalnischkies <david@kalnischkies.de>
Fri, 27 May 2016 16:10:39 +0000 (18:10 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Fri, 27 May 2016 17:14:38 +0000 (19:14 +0200)
Setting the C++ locale via std::locale::global(std::locale("")); which
would otherwise default to the default C locale (aka: unaffected by
setlocale) effects the formatting of numeric types in IO streams, which
for output for humans is perfectly sensible, but breaks our many text
interfaces used and parsed by us and others without expecting the
numbers to be formatted.

Closes: #825396
15 files changed:
apt-pkg/acquire-method.cc
apt-pkg/acquire.cc
apt-pkg/contrib/strutl.cc
apt-pkg/deb/debindexfile.cc
apt-pkg/install-progress.cc
apt-private/private-install.cc
apt-private/private-source.cc
apt-private/private-update.cc
cmdline/apt-helper.cc
ftparchive/writer.cc
methods/http.cc
methods/server.cc
test/integration/test-apt-download-progress
test/integration/test-apt-progress-fd
test/integration/test-apt-progress-fd-deb822

index d0eb01bbc31ff74e338357028df49267dfb1d2bf..82f4b626d08486fe32091105a3fda3470975de7d 100644 (file)
@@ -145,13 +145,13 @@ void pkgAcqMethod::URIStart(FetchResult &Res)
    std::cout << "200 URI Start\n"
             << "URI: " << Queue->Uri << "\n";
    if (Res.Size != 0)
    std::cout << "200 URI Start\n"
             << "URI: " << Queue->Uri << "\n";
    if (Res.Size != 0)
-      std::cout << "Size: " << Res.Size << "\n";
+      std::cout << "Size: " << std::to_string(Res.Size) << "\n";
 
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
 
    if (Res.ResumePoint != 0)
 
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
 
    if (Res.ResumePoint != 0)
-      std::cout << "Resume-Point: " << Res.ResumePoint << "\n";
+      std::cout << "Resume-Point: " << std::to_string(Res.ResumePoint) << "\n";
 
    if (UsedMirror.empty() == false)
       std::cout << "UsedMirror: " << UsedMirror << "\n";
 
    if (UsedMirror.empty() == false)
       std::cout << "UsedMirror: " << UsedMirror << "\n";
@@ -184,7 +184,7 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
       std::cout << "Filename: " << Res.Filename << "\n";
 
    if (Res.Size != 0)
       std::cout << "Filename: " << Res.Filename << "\n";
 
    if (Res.Size != 0)
-      std::cout << "Size: " << Res.Size << "\n";
+      std::cout << "Size: " << std::to_string(Res.Size) << "\n";
 
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
 
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
@@ -202,7 +202,7 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
    }
 
    if (Res.ResumePoint != 0)
    }
 
    if (Res.ResumePoint != 0)
-      std::cout << "Resume-Point: " << Res.ResumePoint << "\n";
+      std::cout << "Resume-Point: " << std::to_string(Res.ResumePoint) << "\n";
 
    if (Res.IMSHit == true)
       std::cout << "IMS-Hit: true\n";
 
    if (Res.IMSHit == true)
       std::cout << "IMS-Hit: true\n";
@@ -213,7 +213,7 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
         std::cout << "Alt-Filename: " << Alt->Filename << "\n";
 
       if (Alt->Size != 0)
         std::cout << "Alt-Filename: " << Alt->Filename << "\n";
 
       if (Alt->Size != 0)
-        std::cout << "Alt-Size: " << Alt->Size << "\n";
+        std::cout << "Alt-Size: " << std::to_string(Alt->Size) << "\n";
 
       if (Alt->LastModified != 0)
         std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n";
 
       if (Alt->LastModified != 0)
         std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n";
index ff41246b872cb513b1255216d52b1414c88735f7..29362fb407c96ba21d5bce7e1791d4a624ec5191 100644 (file)
@@ -1258,13 +1258,9 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
         snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
 
       // build the status str
         snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
 
       // build the status str
-      status << "dlstatus:" << i
-             << ":"  << std::setprecision(3) << Percent
-             << ":" << msg
-             << endl;
-
-      std::string const dlstatus = status.str();
-      FileFd::Write(fd, dlstatus.c_str(), dlstatus.size());
+      std::string dlstatus;
+      strprintf(dlstatus, "dlstatus:%ld:%.4f:%s\n", i, Percent, msg);
+      FileFd::Write(fd, dlstatus.data(), dlstatus.size());
    }
 
    return true;
    }
 
    return true;
index 24fca517422289b9a85a65e22c1eed9695338972..96ea99147e5a1a97fe94d2c4bf1b71903a9a6148 100644 (file)
@@ -1653,7 +1653,7 @@ URI::operator string()
         Res << Host;
 
       if (Port != 0)
         Res << Host;
 
       if (Port != 0)
-        Res << ':' << Port;
+        Res << ':' << std::to_string(Port);
    }
 
    if (Path.empty() == false)
    }
 
    if (Path.empty() == false)
index 9be2db4c95667a16035ae9bfcf26c0ff547ba1b9..6a23b2c00ae57b96881857110f6df6a756abee1f 100644 (file)
@@ -194,7 +194,7 @@ bool debDebPkgFileIndex::GetContent(std::ostream &content, std::string const &de
       return _error->Error("Popen failed");
 
    content << "Filename: " << debfile << "\n";
       return _error->Error("Popen failed");
 
    content << "Filename: " << debfile << "\n";
-   content << "Size: " << Buf.st_size << "\n";
+   content << "Size: " << std::to_string(Buf.st_size) << "\n";
    bool first_line_seen = false;
    char buffer[1024];
    do {
    bool first_line_seen = false;
    char buffer[1024];
    do {
index f1a9f42dc4b40af47654a891261ab220272bcd5b..c77c240c33800c91cc52d4739b76e8fe48ea0d4d 100644 (file)
@@ -87,12 +87,10 @@ void PackageManagerProgressFd::StartDpkg()
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
 
    // send status information that we are about to fork dpkg
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
 
    // send status information that we are about to fork dpkg
-   std::ostringstream status;
-   status << "pmstatus:dpkg-exec:" 
-          << (StepsDone/float(StepsTotal)*100.0) 
-          << ":" << _("Running dpkg")
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "pmstatus:dpkg-exec:%.4f:%s\n",
+        (StepsDone/float(StepsTotal)*100.0), _("Running dpkg"));
+   WriteToStatusFd(std::move(status));
 }
 
 APT_CONST void PackageManagerProgressFd::Stop()
 }
 
 APT_CONST void PackageManagerProgressFd::Stop()
@@ -104,12 +102,10 @@ void PackageManagerProgressFd::Error(std::string PackageName,
                                      unsigned int TotalSteps,
                                      std::string ErrorMessage)
 {
                                      unsigned int TotalSteps,
                                      std::string ErrorMessage)
 {
-   std::ostringstream status;
-   status << "pmerror:" << PackageName
-          << ":"  << (StepsDone/float(TotalSteps)*100.0) 
-          << ":" << ErrorMessage
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "pmerror:%s:%.4f:%s\n", PackageName.c_str(),
+        (StepsDone/float(TotalSteps)*100.0), ErrorMessage.c_str());
+   WriteToStatusFd(std::move(status));
 }
 
 void PackageManagerProgressFd::ConffilePrompt(std::string PackageName,
 }
 
 void PackageManagerProgressFd::ConffilePrompt(std::string PackageName,
@@ -117,12 +113,10 @@ void PackageManagerProgressFd::ConffilePrompt(std::string PackageName,
                                               unsigned int TotalSteps,
                                               std::string ConfMessage)
 {
                                               unsigned int TotalSteps,
                                               std::string ConfMessage)
 {
-   std::ostringstream status;
-   status << "pmconffile:" << PackageName
-          << ":"  << (StepsDone/float(TotalSteps)*100.0) 
-          << ":" << ConfMessage
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "pmconffile:%s:%.4f:%s\n", PackageName.c_str(),
+        (StepsDone/float(TotalSteps)*100.0), ConfMessage.c_str());
+   WriteToStatusFd(std::move(status));
 }
 
 
 }
 
 
@@ -135,12 +129,10 @@ bool PackageManagerProgressFd::StatusChanged(std::string PackageName,
    StepsTotal = xTotalSteps;
 
    // build the status str
    StepsTotal = xTotalSteps;
 
    // build the status str
-   std::ostringstream status;
-   status << "pmstatus:" << StringSplit(PackageName, ":")[0]
-          << ":"  << (StepsDone/float(StepsTotal)*100.0) 
-          << ":" << pkg_action
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "pmstatus:%s:%.4f:%s\n", StringSplit(PackageName, ":")[0].c_str(),
+        (StepsDone/float(StepsTotal)*100.0), pkg_action.c_str());
+   WriteToStatusFd(std::move(status));
 
    if(_config->FindB("Debug::APT::Progress::PackageManagerFd", false) == true)
       std::cerr << "progress: " << PackageName << " " << xStepsDone
 
    if(_config->FindB("Debug::APT::Progress::PackageManagerFd", false) == true)
       std::cerr << "progress: " << PackageName << " " << xStepsDone
@@ -171,12 +163,10 @@ void PackageManagerProgressDeb822Fd::StartDpkg()
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
 
    // send status information that we are about to fork dpkg
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
 
    // send status information that we are about to fork dpkg
-   std::ostringstream status;
-   status << "Status: " << "progress" << std::endl
-          << "Percent: " << (StepsDone/float(StepsTotal)*100.0) << std::endl
-          << "Message: " << _("Running dpkg") << std::endl
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "Status: %s\nPercent: %.4f\nMessage: %s\n\n", "progress",
+        (StepsDone/float(StepsTotal)*100.0), _("Running dpkg"));
+   WriteToStatusFd(std::move(status));
 }
 
 APT_CONST void PackageManagerProgressDeb822Fd::Stop()
 }
 
 APT_CONST void PackageManagerProgressDeb822Fd::Stop()
@@ -188,13 +178,10 @@ void PackageManagerProgressDeb822Fd::Error(std::string PackageName,
                                      unsigned int TotalSteps,
                                      std::string ErrorMessage)
 {
                                      unsigned int TotalSteps,
                                      std::string ErrorMessage)
 {
-   std::ostringstream status;
-   status << "Status: " << "Error" << std::endl
-          << "Package:" << PackageName << std::endl
-          << "Percent: "  << (StepsDone/float(TotalSteps)*100.0) << std::endl
-          << "Message: " << ErrorMessage << std::endl
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "Status: %s\nPackage: %s\nPercent: %.4f\nMessage: %s\n\n", "Error",
+        PackageName.c_str(), (StepsDone/float(TotalSteps)*100.0), ErrorMessage.c_str());
+   WriteToStatusFd(std::move(status));
 }
 
 void PackageManagerProgressDeb822Fd::ConffilePrompt(std::string PackageName,
 }
 
 void PackageManagerProgressDeb822Fd::ConffilePrompt(std::string PackageName,
@@ -202,13 +189,10 @@ void PackageManagerProgressDeb822Fd::ConffilePrompt(std::string PackageName,
                                               unsigned int TotalSteps,
                                               std::string ConfMessage)
 {
                                               unsigned int TotalSteps,
                                               std::string ConfMessage)
 {
-   std::ostringstream status;
-   status << "Status: " << "ConfFile" << std::endl
-          << "Package:" << PackageName << std::endl
-          << "Percent: "  << (StepsDone/float(TotalSteps)*100.0) << std::endl
-          << "Message: " << ConfMessage << std::endl
-          << std::endl;
-   WriteToStatusFd(status.str());
+   std::string status;
+   strprintf(status, "Status: %s\nPackage: %s\nPercent: %.4f\nMessage: %s\n\n", "ConfFile",
+        PackageName.c_str(), (StepsDone/float(TotalSteps)*100.0), ConfMessage.c_str());
+   WriteToStatusFd(std::move(status));
 }
 
 
 }
 
 
@@ -220,15 +204,10 @@ bool PackageManagerProgressDeb822Fd::StatusChanged(std::string PackageName,
    StepsDone = xStepsDone;
    StepsTotal = xTotalSteps;
 
    StepsDone = xStepsDone;
    StepsTotal = xTotalSteps;
 
-   // build the status str
-   std::ostringstream status;
-   status << "Status: " << "progress" << std::endl
-          << "Package: " << PackageName << std::endl
-          << "Percent: "  << (StepsDone/float(StepsTotal)*100.0) << std::endl
-          << "Message: " << message << std::endl
-          << std::endl;
-   WriteToStatusFd(status.str());
-
+   std::string status;
+   strprintf(status, "Status: %s\nPackage: %s\nPercent: %.4f\nMessage: %s\n\n", "progress",
+        PackageName.c_str(), (StepsDone/float(StepsTotal)*100.0), message.c_str());
+   WriteToStatusFd(std::move(status));
    return true;
 }
 
    return true;
 }
 
@@ -289,7 +268,7 @@ void PackageManagerFancy::SetupTerminalScrollArea(int nr_rows)
      std::cout << "\0337";
          
      // set scroll region (this will place the cursor in the top left)
      std::cout << "\0337";
          
      // set scroll region (this will place the cursor in the top left)
-     std::cout << "\033[0;" << nr_rows - 1 << "r";
+     std::cout << "\033[0;" << std::to_string(nr_rows - 1) << "r";
             
      // restore cursor but ensure its inside the scrolling area
      std::cout << "\0338";
             
      // restore cursor but ensure its inside the scrolling area
      std::cout << "\0338";
@@ -390,7 +369,7 @@ bool PackageManagerFancy::DrawStatusLine()
 
    std::cout << save_cursor
       // move cursor position to last row
 
    std::cout << save_cursor
       // move cursor position to last row
-             << "\033[" << size.rows << ";0f" 
+             << "\033[" << std::to_string(size.rows) << ";0f"
              << set_bg_color
              << set_fg_color
              << progress_str
              << set_bg_color
              << set_fg_color
              << progress_str
index 6c4b30da096050d7e96b0546a4d63071fe38da26..7bd9a603449dd99b856aa10bda3c2dce97454e8a 100644 (file)
@@ -257,7 +257,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       for (; I != Fetcher.UriEnd(); ++I)
         std::cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' <<
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       for (; I != Fetcher.UriEnd(); ++I)
         std::cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' <<
-              I->Owner->FileSize << ' ' << I->Owner->HashSum() << std::endl;
+              std::to_string(I->Owner->FileSize) << ' ' << I->Owner->HashSum() << std::endl;
       return true;
    }
 
       return true;
    }
 
index 5053c60fc41ba144585978e97cf66d52b46db3f5..dd52a8822312ce522483beb2df2831b6b5ed0b40 100644 (file)
@@ -478,8 +478,8 @@ bool DoSource(CommandLine &CmdL)
    {
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       for (; I != Fetcher.UriEnd(); ++I)
    {
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       for (; I != Fetcher.UriEnd(); ++I)
-        std::cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' << 
-           I->Owner->FileSize << ' ' << I->Owner->HashSum() << std::endl;
+        std::cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' <<
+           std::to_string(I->Owner->FileSize) << ' ' << I->Owner->HashSum() << std::endl;
       return true;
    }
 
       return true;
    }
 
index 1e5d695126827ed5d83669e74f945cc14853f876..ba953a088f714136d37556d61fc442d5dcc02868 100644 (file)
@@ -58,8 +58,8 @@ bool DoUpdate(CommandLine &CmdL)
          if(compExt.empty() == false && 
             APT::String::Endswith(FileName, compExt))
             FileName = FileName.substr(0, FileName.size() - compExt.size() - 1);
          if(compExt.empty() == false && 
             APT::String::Endswith(FileName, compExt))
             FileName = FileName.substr(0, FileName.size() - compExt.size() - 1);
-        c1out << '\'' << I->URI << "' " << FileName << ' ' << 
-            I->Owner->FileSize << ' ' << I->Owner->HashSum() << std::endl;
+        c1out << '\'' << I->URI << "' " << FileName << ' ' <<
+           std::to_string(I->Owner->FileSize) << ' ' << I->Owner->HashSum() << std::endl;
       }
       return true;
    }
       }
       return true;
    }
index b92055ab7883e8f024ee781ca71f2e61e71f943a..fd4d269c2f52003e153cd3d062917ae0a704e43f 100644 (file)
@@ -102,7 +102,7 @@ static bool DoSrvLookup(CommandLine &CmdL)                          /*{{{*/
         _error->Error(_("GetSrvRec failed for %s"), name.c_str());
 
       for (SrvRec const &I : srv_records)
         _error->Error(_("GetSrvRec failed for %s"), name.c_str());
 
       for (SrvRec const &I : srv_records)
-        c1out << I.target << "\t" << I.priority << "\t" << I.weight << "\t" << I.port << std::endl;
+        ioprintf(c1out, "%s\t%d\t%d\t%d\n", I.target.c_str(), I.priority, I.weight, I.port);
    }
    return true;
 }
    }
    return true;
 }
index d4b46042f81631a3232c4a96ee6fda8fc22e8470..65b0f85537a220a0c3d8ca6217a28b2f2cd5146f 100644 (file)
@@ -623,12 +623,12 @@ SourcesWriter::SourcesWriter(FileFd * const GivenOutput, string const &DB, strin
 // SourcesWriter::DoPackage - Process a single package                 /*{{{*/
 static std::string getDscHash(unsigned int const DoHashes,
       Hashes::SupportedHashes const DoIt, pkgTagSection &Tags, char const * const FieldName,
 // SourcesWriter::DoPackage - Process a single package                 /*{{{*/
 static std::string getDscHash(unsigned int const DoHashes,
       Hashes::SupportedHashes const DoIt, pkgTagSection &Tags, char const * const FieldName,
-      HashString const * const Hash, unsigned long long Size, std::string FileName)
+      HashString const * const Hash, unsigned long long Size, std::string const &FileName)
 {
    if ((DoHashes & DoIt) != DoIt || Tags.Exists(FieldName) == false || Hash == NULL)
       return "";
    std::ostringstream out;
 {
    if ((DoHashes & DoIt) != DoIt || Tags.Exists(FieldName) == false || Hash == NULL)
       return "";
    std::ostringstream out;
-   out << "\n " << Hash->HashValue() << " " << Size << " " << FileName
+   out << "\n " << Hash->HashValue() << " " << std::to_string(Size) << " " << FileName
       << "\n " << Tags.FindS(FieldName);
    return out.str();
 }
       << "\n " << Tags.FindS(FieldName);
    return out.str();
 }
@@ -802,7 +802,7 @@ bool SourcesWriter::DoPackage(string FileName)
            if (Tags.Exists(fieldname) == true)
               continue;
            std::ostringstream streamout;
            if (Tags.Exists(fieldname) == true)
               continue;
            std::ostringstream streamout;
-           streamout << "\n " << hs->HashValue() << " " << Db.GetFileSize() << " " << ParseJnk;
+           streamout << "\n " << hs->HashValue() << " " << std::to_string(Db.GetFileSize()) << " " << ParseJnk;
            out->append(streamout.str());
         }
 
            out->append(streamout.str());
         }
 
index 78b20e66d304cde4a383bf6f91143d89e4bc3e40..0c3803fbb3979d1635bc9478f2343d7e19fdfb59 100644 (file)
@@ -708,7 +708,7 @@ void HttpMethod::SendReq(FetchItem *Itm)
       C.f. https://tools.ietf.org/wg/httpbis/trac/ticket/158 */
    Req << "GET " << requesturi << " HTTP/1.1\r\n";
    if (Uri.Port != 0)
       C.f. https://tools.ietf.org/wg/httpbis/trac/ticket/158 */
    Req << "GET " << requesturi << " HTTP/1.1\r\n";
    if (Uri.Port != 0)
-      Req << "Host: " << ProperHost << ":" << Uri.Port << "\r\n";
+      Req << "Host: " << ProperHost << ":" << std::to_string(Uri.Port) << "\r\n";
    else
       Req << "Host: " << ProperHost << "\r\n";
 
    else
       Req << "Host: " << ProperHost << "\r\n";
 
@@ -717,7 +717,7 @@ void HttpMethod::SendReq(FetchItem *Itm)
       Req << "Cache-Control: no-cache\r\n"
         << "Pragma: no-cache\r\n";
    else if (Itm->IndexFile == true)
       Req << "Cache-Control: no-cache\r\n"
         << "Pragma: no-cache\r\n";
    else if (Itm->IndexFile == true)
-      Req << "Cache-Control: max-age=" << _config->FindI("Acquire::http::Max-Age",0) << "\r\n";
+      Req << "Cache-Control: max-age=" << std::to_string(_config->FindI("Acquire::http::Max-Age",0)) << "\r\n";
    else if (_config->FindB("Acquire::http::No-Store",false) == true)
       Req << "Cache-Control: no-store\r\n";
 
    else if (_config->FindB("Acquire::http::No-Store",false) == true)
       Req << "Cache-Control: no-store\r\n";
 
index b323ef4f3cdad29e80f9b9edbec9c5095a6cde29..d606f26aa0408fb38ed52420eee19fbdd8d66f8d 100644 (file)
@@ -130,7 +130,7 @@ bool ServerState::HeaderLine(string Line)
         {
            Code[0] = '\0';
            if (Owner != NULL && Owner->Debug == true)
         {
            Code[0] = '\0';
            if (Owner != NULL && Owner->Debug == true)
-              clog << "HTTP server doesn't give Reason-Phrase for " << Result << std::endl;
+              clog << "HTTP server doesn't give Reason-Phrase for " << std::to_string(Result) << std::endl;
         }
         else if (elements != 4)
            return _error->Error(_("The HTTP server sent an invalid reply header"));
         }
         else if (elements != 4)
            return _error->Error(_("The HTTP server sent an invalid reply header"));
index b48e7ebb3748dabfbe445a22369df9bb64be5fc8..7ac044a57a497a8a6d684a79288364404985c71e 100755 (executable)
@@ -11,13 +11,9 @@ setupenvironment
 changetohttpswebserver
 
 assertprogress() {
 changetohttpswebserver
 
 assertprogress() {
-    T="$1"
-    testsuccess grep "dlstatus:1:0:Retrieving file 1 of 1" "$T"
-    if ! grep -E -q "dlstatus:1:(0\..*|([1-9](\..*)?)|[1-9][0-9](\..*)?):Retrieving file 1 of 1" "$T"; then
-        cat "$T"
-        msgfail "Failed to detect download progress"
-    fi
-    testsuccess grep "dlstatus:1:100:Retrieving file 1 of 1" "$T"
+    testsuccess grep "dlstatus:1:0.0000:Retrieving file 1 of 1" "$1"
+    testsuccess grep -E "dlstatus:1:[1-9][0-9]{0,1}\.[0-9]{1,4}:Retrieving file 1 of 1" "$1"
+    testsuccess grep "dlstatus:1:100.0000:Retrieving file 1 of 1" "$1"
 }
 
 # we need to ensure the file is reasonable big so that apt has a chance to
 }
 
 # we need to ensure the file is reasonable big so that apt has a chance to
index c6650bc2e38a88166f9d709f5250a111c66cef7c..86eaa1354134763488da25024fc5808a25b98863 100755 (executable)
@@ -15,15 +15,15 @@ setupaptarchive
 # install native
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.1 -y -o APT::Status-Fd=3
 # install native
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.1 -y -o APT::Status-Fd=3
-testfileequal './apt-progress.log' 'dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:100:Retrieving file 1 of 1
-pmstatus:dpkg-exec:0:Running dpkg
-pmstatus:testing:0:Installing testing (amd64)
+testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1
+dlstatus:1:100.0000:Retrieving file 1 of 1
+pmstatus:dpkg-exec:0.0000:Running dpkg
+pmstatus:testing:0.0000:Installing testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking testing (amd64)
-pmstatus:testing:50:Preparing to configure testing (amd64)
-pmstatus:dpkg-exec:50:Running dpkg
-pmstatus:testing:50:Configuring testing (amd64)
+pmstatus:testing:50.0000:Preparing to configure testing (amd64)
+pmstatus:dpkg-exec:50.0000:Running dpkg
+pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
@@ -31,15 +31,15 @@ pmstatus:dpkg-exec:83.3333:Running dpkg'
 # upgrade
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 -y -o APT::Status-Fd=3
 # upgrade
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 -y -o APT::Status-Fd=3
-testfileequal './apt-progress.log' 'dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:100:Retrieving file 1 of 1
-pmstatus:dpkg-exec:0:Running dpkg
-pmstatus:testing:0:Installing testing (amd64)
+testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1
+dlstatus:1:100.0000:Retrieving file 1 of 1
+pmstatus:dpkg-exec:0.0000:Running dpkg
+pmstatus:testing:0.0000:Installing testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking testing (amd64)
-pmstatus:testing:50:Preparing to configure testing (amd64)
-pmstatus:dpkg-exec:50:Running dpkg
-pmstatus:testing:50:Configuring testing (amd64)
+pmstatus:testing:50.0000:Preparing to configure testing (amd64)
+pmstatus:dpkg-exec:50.0000:Running dpkg
+pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
@@ -47,15 +47,15 @@ pmstatus:dpkg-exec:83.3333:Running dpkg'
 # reinstall
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 --reinstall -y -o APT::Status-Fd=3
 # reinstall
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 --reinstall -y -o APT::Status-Fd=3
-testfileequal './apt-progress.log' 'dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:100:Retrieving file 1 of 1
-pmstatus:dpkg-exec:0:Running dpkg
-pmstatus:testing:0:Installing testing (amd64)
+testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1
+dlstatus:1:100.0000:Retrieving file 1 of 1
+pmstatus:dpkg-exec:0.0000:Running dpkg
+pmstatus:testing:0.0000:Installing testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking testing (amd64)
-pmstatus:testing:50:Preparing to configure testing (amd64)
-pmstatus:dpkg-exec:50:Running dpkg
-pmstatus:testing:50:Configuring testing (amd64)
+pmstatus:testing:50.0000:Preparing to configure testing (amd64)
+pmstatus:dpkg-exec:50.0000:Running dpkg
+pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
@@ -63,25 +63,25 @@ pmstatus:dpkg-exec:83.3333:Running dpkg'
 # and remove
 exec 3> apt-progress.log
 testsuccess aptget remove testing -y -o APT::Status-Fd=3
 # and remove
 exec 3> apt-progress.log
 testsuccess aptget remove testing -y -o APT::Status-Fd=3
-testfileequal './apt-progress.log' 'pmstatus:dpkg-exec:0:Running dpkg
-pmstatus:testing:0:Removing testing (amd64)
-pmstatus:testing:25:Preparing for removal of testing (amd64)
-pmstatus:testing:50:Removing testing (amd64)
-pmstatus:testing:75:Removed testing (amd64)
-pmstatus:dpkg-exec:75:Running dpkg'
+testfileequal './apt-progress.log' 'pmstatus:dpkg-exec:0.0000:Running dpkg
+pmstatus:testing:0.0000:Removing testing (amd64)
+pmstatus:testing:25.0000:Preparing for removal of testing (amd64)
+pmstatus:testing:50.0000:Removing testing (amd64)
+pmstatus:testing:75.0000:Removed testing (amd64)
+pmstatus:dpkg-exec:75.0000:Running dpkg'
 
 # install non-native and ensure we get proper progress info
 exec 3> apt-progress.log
 testsuccess aptget install testing2:i386 -y -o APT::Status-Fd=3
 
 # install non-native and ensure we get proper progress info
 exec 3> apt-progress.log
 testsuccess aptget install testing2:i386 -y -o APT::Status-Fd=3
-testfileequal './apt-progress.log' 'dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:100:Retrieving file 1 of 1
-pmstatus:dpkg-exec:0:Running dpkg
-pmstatus:testing2:0:Installing testing2 (i386)
+testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1
+dlstatus:1:100.0000:Retrieving file 1 of 1
+pmstatus:dpkg-exec:0.0000:Running dpkg
+pmstatus:testing2:0.0000:Installing testing2 (i386)
 pmstatus:testing2:16.6667:Preparing testing2 (i386)
 pmstatus:testing2:33.3333:Unpacking testing2 (i386)
 pmstatus:testing2:16.6667:Preparing testing2 (i386)
 pmstatus:testing2:33.3333:Unpacking testing2 (i386)
-pmstatus:testing2:50:Preparing to configure testing2 (i386)
-pmstatus:dpkg-exec:50:Running dpkg
-pmstatus:testing2:50:Configuring testing2 (i386)
+pmstatus:testing2:50.0000:Preparing to configure testing2 (i386)
+pmstatus:dpkg-exec:50.0000:Running dpkg
+pmstatus:testing2:50.0000:Configuring testing2 (i386)
 pmstatus:testing2:66.6667:Configuring testing2 (i386)
 pmstatus:testing2:83.3333:Installed testing2 (i386)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:testing2:66.6667:Configuring testing2 (i386)
 pmstatus:testing2:83.3333:Installed testing2 (i386)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
index 58fd73275b9aaec470a6bd5d51b909a7a9fa7674..a8d59608d5aced3c3049ad4e16f583210c65e3bc 100755 (executable)
@@ -17,12 +17,12 @@ exec 3> apt-progress.log
 testsuccess aptget install testing=0.1 -y -o APT::Status-deb822-Fd=3
 
 testfileequal './apt-progress.log' 'Status: progress
 testsuccess aptget install testing=0.1 -y -o APT::Status-deb822-Fd=3
 
 testfileequal './apt-progress.log' 'Status: progress
-Percent: 0
+Percent: 0.0000
 Message: Running dpkg
 
 Status: progress
 Package: testing:amd64
 Message: Running dpkg
 
 Status: progress
 Package: testing:amd64
-Percent: 0
+Percent: 0.0000
 Message: Installing testing (amd64)
 
 Status: progress
 Message: Installing testing (amd64)
 
 Status: progress
@@ -37,16 +37,16 @@ Message: Unpacking testing (amd64)
 
 Status: progress
 Package: testing:amd64
 
 Status: progress
 Package: testing:amd64
-Percent: 50
+Percent: 50.0000
 Message: Preparing to configure testing (amd64)
 
 Status: progress
 Message: Preparing to configure testing (amd64)
 
 Status: progress
-Percent: 50
+Percent: 50.0000
 Message: Running dpkg
 
 Status: progress
 Package: testing:amd64
 Message: Running dpkg
 
 Status: progress
 Package: testing:amd64
-Percent: 50
+Percent: 50.0000
 Message: Configuring testing (amd64)
 
 Status: progress
 Message: Configuring testing (amd64)
 
 Status: progress