Explorar el Código

prevent C++ locale number formatting in text APIs

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
David Kalnischkies hace 10 años
padre
commit
b58e2c7c56

+ 5 - 5
apt-pkg/acquire-method.cc

@@ -145,13 +145,13 @@ void pkgAcqMethod::URIStart(FetchResult &Res)
    std::cout << "200 URI Start\n"
    std::cout << "200 URI Start\n"
 	     << "URI: " << Queue->Uri << "\n";
 	     << "URI: " << Queue->Uri << "\n";
    if (Res.Size != 0)
    if (Res.Size != 0)
-      std::cout << "Size: " << Res.Size << "\n";
+      std::cout << "Size: " << std::to_string(Res.Size) << "\n";
 
 
    if (Res.LastModified != 0)
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
 
 
    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 (UsedMirror.empty() == false)
    if (UsedMirror.empty() == false)
       std::cout << "UsedMirror: " << UsedMirror << "\n";
       std::cout << "UsedMirror: " << UsedMirror << "\n";
@@ -184,7 +184,7 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
       std::cout << "Filename: " << Res.Filename << "\n";
       std::cout << "Filename: " << Res.Filename << "\n";
 
 
    if (Res.Size != 0)
    if (Res.Size != 0)
-      std::cout << "Size: " << Res.Size << "\n";
+      std::cout << "Size: " << std::to_string(Res.Size) << "\n";
 
 
    if (Res.LastModified != 0)
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
       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)
    if (Res.IMSHit == true)
       std::cout << "IMS-Hit: true\n";
       std::cout << "IMS-Hit: true\n";
@@ -213,7 +213,7 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
 	 std::cout << "Alt-Filename: " << Alt->Filename << "\n";
 	 std::cout << "Alt-Filename: " << Alt->Filename << "\n";
 
 
       if (Alt->Size != 0)
       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)
       if (Alt->LastModified != 0)
 	 std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n";
 	 std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n";

+ 3 - 7
apt-pkg/acquire.cc

@@ -1258,13 +1258,9 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
 	 snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
 	 snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
 
 
       // build the status str
       // 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;

+ 1 - 1
apt-pkg/contrib/strutl.cc

@@ -1653,7 +1653,7 @@ URI::operator string()
 	 Res << Host;
 	 Res << Host;
 
 
       if (Port != 0)
       if (Port != 0)
-	 Res << ':' << Port;
+	 Res << ':' << std::to_string(Port);
    }
    }
 
 
    if (Path.empty() == false)
    if (Path.empty() == false)

+ 1 - 1
apt-pkg/deb/debindexfile.cc

@@ -194,7 +194,7 @@ bool debDebPkgFileIndex::GetContent(std::ostream &content, std::string const &de
       return _error->Error("Popen failed");
       return _error->Error("Popen failed");
 
 
    content << "Filename: " << debfile << "\n";
    content << "Filename: " << debfile << "\n";
-   content << "Size: " << Buf.st_size << "\n";
+   content << "Size: " << std::to_string(Buf.st_size) << "\n";
    bool first_line_seen = false;
    bool first_line_seen = false;
    char buffer[1024];
    char buffer[1024];
    do {
    do {

+ 34 - 55
apt-pkg/install-progress.cc

@@ -87,12 +87,10 @@ void PackageManagerProgressFd::StartDpkg()
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
 
 
    // send status information that we are about to fork dpkg
    // 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,
                                      unsigned int TotalSteps,
                                      std::string ErrorMessage)
                                      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,
                                               unsigned int TotalSteps,
                                               std::string ConfMessage)
                                               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;
    StepsTotal = xTotalSteps;
 
 
    // build the status str
    // 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)
    if(_config->FindB("Debug::APT::Progress::PackageManagerFd", false) == true)
       std::cerr << "progress: " << PackageName << " " << xStepsDone
       std::cerr << "progress: " << PackageName << " " << xStepsDone
@@ -171,12 +163,10 @@ void PackageManagerProgressDeb822Fd::StartDpkg()
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
    fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC); 
 
 
    // send status information that we are about to fork dpkg
    // 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,
                                      unsigned int TotalSteps,
                                      std::string ErrorMessage)
                                      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,
                                               unsigned int TotalSteps,
                                               std::string ConfMessage)
                                               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;
    StepsDone = xStepsDone;
    StepsTotal = xTotalSteps;
    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";
      std::cout << "\0337";
          
          
      // set scroll region (this will place the cursor in the top left)
      // 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
      // restore cursor but ensure its inside the scrolling area
      std::cout << "\0338";
      std::cout << "\0338";
@@ -390,7 +369,7 @@ bool PackageManagerFancy::DrawStatusLine()
 
 
    std::cout << save_cursor
    std::cout << save_cursor
       // move cursor position to last row
       // move cursor position to last row
-             << "\033[" << size.rows << ";0f" 
+             << "\033[" << std::to_string(size.rows) << ";0f"
              << set_bg_color
              << set_bg_color
              << set_fg_color
              << set_fg_color
              << progress_str
              << progress_str

+ 1 - 1
apt-private/private-install.cc

@@ -257,7 +257,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       for (; I != Fetcher.UriEnd(); ++I)
       for (; I != Fetcher.UriEnd(); ++I)
 	 std::cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' <<
 	 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;
    }
    }
 
 

+ 2 - 2
apt-private/private-source.cc

@@ -478,8 +478,8 @@ bool DoSource(CommandLine &CmdL)
    {
    {
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       pkgAcquire::UriIterator I = Fetcher.UriBegin();
       for (; I != Fetcher.UriEnd(); ++I)
       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;
    }
    }
 
 

+ 2 - 2
apt-private/private-update.cc

@@ -58,8 +58,8 @@ bool DoUpdate(CommandLine &CmdL)
          if(compExt.empty() == false && 
          if(compExt.empty() == false && 
             APT::String::Endswith(FileName, compExt))
             APT::String::Endswith(FileName, compExt))
             FileName = FileName.substr(0, FileName.size() - compExt.size() - 1);
             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;
    }
    }

+ 1 - 1
cmdline/apt-helper.cc

@@ -102,7 +102,7 @@ static bool DoSrvLookup(CommandLine &CmdL)				/*{{{*/
 	 _error->Error(_("GetSrvRec failed for %s"), name.c_str());
 	 _error->Error(_("GetSrvRec failed for %s"), name.c_str());
 
 
       for (SrvRec const &I : srv_records)
       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;
 }
 }

+ 3 - 3
ftparchive/writer.cc

@@ -623,12 +623,12 @@ SourcesWriter::SourcesWriter(FileFd * const GivenOutput, string const &DB, strin
 // SourcesWriter::DoPackage - Process a single package			/*{{{*/
 // SourcesWriter::DoPackage - Process a single package			/*{{{*/
 static std::string getDscHash(unsigned int const DoHashes,
 static std::string getDscHash(unsigned int const DoHashes,
       Hashes::SupportedHashes const DoIt, pkgTagSection &Tags, char const * const FieldName,
       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)
    if ((DoHashes & DoIt) != DoIt || Tags.Exists(FieldName) == false || Hash == NULL)
       return "";
       return "";
    std::ostringstream out;
    std::ostringstream out;
-   out << "\n " << Hash->HashValue() << " " << Size << " " << FileName
+   out << "\n " << Hash->HashValue() << " " << std::to_string(Size) << " " << FileName
       << "\n " << Tags.FindS(FieldName);
       << "\n " << Tags.FindS(FieldName);
    return out.str();
    return out.str();
 }
 }
@@ -802,7 +802,7 @@ bool SourcesWriter::DoPackage(string FileName)
 	    if (Tags.Exists(fieldname) == true)
 	    if (Tags.Exists(fieldname) == true)
 	       continue;
 	       continue;
 	    std::ostringstream streamout;
 	    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());
 	 }
 	 }
 
 

+ 2 - 2
methods/http.cc

@@ -708,7 +708,7 @@ void HttpMethod::SendReq(FetchItem *Itm)
       C.f. https://tools.ietf.org/wg/httpbis/trac/ticket/158 */
       C.f. https://tools.ietf.org/wg/httpbis/trac/ticket/158 */
    Req << "GET " << requesturi << " HTTP/1.1\r\n";
    Req << "GET " << requesturi << " HTTP/1.1\r\n";
    if (Uri.Port != 0)
    if (Uri.Port != 0)
-      Req << "Host: " << ProperHost << ":" << Uri.Port << "\r\n";
+      Req << "Host: " << ProperHost << ":" << std::to_string(Uri.Port) << "\r\n";
    else
    else
       Req << "Host: " << ProperHost << "\r\n";
       Req << "Host: " << ProperHost << "\r\n";
 
 
@@ -717,7 +717,7 @@ void HttpMethod::SendReq(FetchItem *Itm)
       Req << "Cache-Control: no-cache\r\n"
       Req << "Cache-Control: no-cache\r\n"
 	 << "Pragma: no-cache\r\n";
 	 << "Pragma: no-cache\r\n";
    else if (Itm->IndexFile == true)
    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)
    else if (_config->FindB("Acquire::http::No-Store",false) == true)
       Req << "Cache-Control: no-store\r\n";
       Req << "Cache-Control: no-store\r\n";
 
 

+ 1 - 1
methods/server.cc

@@ -130,7 +130,7 @@ bool ServerState::HeaderLine(string Line)
 	 {
 	 {
 	    Code[0] = '\0';
 	    Code[0] = '\0';
 	    if (Owner != NULL && Owner->Debug == true)
 	    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)
 	 else if (elements != 4)
 	    return _error->Error(_("The HTTP server sent an invalid reply header"));
 	    return _error->Error(_("The HTTP server sent an invalid reply header"));

+ 3 - 7
test/integration/test-apt-download-progress

@@ -11,13 +11,9 @@ setupenvironment
 changetohttpswebserver
 changetohttpswebserver
 
 
 assertprogress() {
 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

+ 34 - 34
test/integration/test-apt-progress-fd

@@ -15,15 +15,15 @@ setupaptarchive
 # install native
 # install native
 exec 3> apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.1 -y -o APT::Status-Fd=3
 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:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking 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:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:dpkg-exec:83.3333:Running dpkg'
@@ -31,15 +31,15 @@ pmstatus:dpkg-exec:83.3333:Running dpkg'
 # upgrade
 # upgrade
 exec 3> apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 -y -o APT::Status-Fd=3
 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:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking 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:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:dpkg-exec:83.3333:Running dpkg'
@@ -47,15 +47,15 @@ pmstatus:dpkg-exec:83.3333:Running dpkg'
 # reinstall
 # reinstall
 exec 3> apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 --reinstall -y -o APT::Status-Fd=3
 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:16.6667:Preparing testing (amd64)
 pmstatus:testing:33.3333:Unpacking 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:66.6667:Configuring testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:testing:83.3333:Installed testing (amd64)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:dpkg-exec:83.3333:Running dpkg'
@@ -63,25 +63,25 @@ pmstatus:dpkg-exec:83.3333:Running dpkg'
 # and remove
 # and remove
 exec 3> apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget remove testing -y -o APT::Status-Fd=3
 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
 # install non-native and ensure we get proper progress info
 exec 3> apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget install testing2:i386 -y -o APT::Status-Fd=3
 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:16.6667:Preparing testing2 (i386)
 pmstatus:testing2:33.3333:Unpacking 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:66.6667:Configuring testing2 (i386)
 pmstatus:testing2:83.3333:Installed testing2 (i386)
 pmstatus:testing2:83.3333:Installed testing2 (i386)
 pmstatus:dpkg-exec:83.3333:Running dpkg'
 pmstatus:dpkg-exec:83.3333:Running dpkg'

+ 5 - 5
test/integration/test-apt-progress-fd-deb822

@@ -17,12 +17,12 @@ exec 3> apt-progress.log
 testsuccess aptget install testing=0.1 -y -o APT::Status-deb822-Fd=3
 testsuccess aptget install testing=0.1 -y -o APT::Status-deb822-Fd=3
 
 
 testfileequal './apt-progress.log' 'Status: progress
 testfileequal './apt-progress.log' 'Status: progress
-Percent: 0
+Percent: 0.0000
 Message: Running dpkg
 Message: Running dpkg
 
 
 Status: progress
 Status: progress
 Package: testing:amd64
 Package: testing:amd64
-Percent: 0
+Percent: 0.0000
 Message: Installing testing (amd64)
 Message: Installing testing (amd64)
 
 
 Status: progress
 Status: progress
@@ -37,16 +37,16 @@ Message: Unpacking testing (amd64)
 
 
 Status: progress
 Status: progress
 Package: testing:amd64
 Package: testing:amd64
-Percent: 50
+Percent: 50.0000
 Message: Preparing to configure testing (amd64)
 Message: Preparing to configure testing (amd64)
 
 
 Status: progress
 Status: progress
-Percent: 50
+Percent: 50.0000
 Message: Running dpkg
 Message: Running dpkg
 
 
 Status: progress
 Status: progress
 Package: testing:amd64
 Package: testing:amd64
-Percent: 50
+Percent: 50.0000
 Message: Configuring testing (amd64)
 Message: Configuring testing (amd64)
 
 
 Status: progress
 Status: progress