]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/progress.cc
testcases runable as root
[apt.git] / apt-pkg / contrib / progress.cc
index 8d49eff2e1093e982c60e830e647d60f8a89f6aa..4ff4f181d0cb547b8591e1fcf426e6e92d2d35b9 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: progress.cc,v 1.2 1998/07/22 01:45:38 jgg Exp $
+// $Id: progress.cc,v 1.12 2003/01/11 07:17:04 jgg Exp $
 /* ######################################################################
    
    OpProgress - Operation Progress
 /* ######################################################################
    
    OpProgress - Operation Progress
@@ -8,13 +8,23 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/progress.h"
-#endif 
+#include <config.h>
+
 #include <apt-pkg/progress.h>
 #include <apt-pkg/progress.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/configuration.h>
+
+#include <sys/time.h>
+#include <string>
+#include <iostream>
 #include <stdio.h>
 #include <stdio.h>
+#include <cstring>
+
+#include <apti18n.h>
                                                                        /*}}}*/
 
                                                                        /*}}}*/
 
+using namespace std;
+
 // OpProgress::OpProgress - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // OpProgress::OpProgress - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -26,36 +36,51 @@ OpProgress::OpProgress() : Current(0), Total(0), Size(0), SubTotal(1),
                                                                        /*}}}*/
 // OpProgress::Progress - Sub progress with no state change            /*{{{*/
 // ---------------------------------------------------------------------
                                                                        /*}}}*/
 // OpProgress::Progress - Sub progress with no state change            /*{{{*/
 // ---------------------------------------------------------------------
-/* This assumes that Size is the same as the current sub size */
-void OpProgress::Progress(unsigned long Cur)
+/* Current is the Base Overall progress in units of Total. Cur is the sub
+   progress in units of SubTotal. Size is a scaling factor that says what
+   percent of Total SubTotal is. */
+void OpProgress::Progress(unsigned long long Cur)
 {
 {
-   Percent = (Current + Cur/((float)SubTotal)*Size)*100.0/Total;
+   if (Total == 0 || Size == 0 || SubTotal == 0)
+      Percent = 0;
+   else
+      Percent = (Current + Cur/((float)SubTotal)*Size)*100.0/Total;
    Update();
 }
                                                                        /*}}}*/
 // OpProgress::OverallProgress - Set the overall progress              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
    Update();
 }
                                                                        /*}}}*/
 // OpProgress::OverallProgress - Set the overall progress              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-void OpProgress::OverallProgress(unsigned long Current, unsigned long Total,
-                                unsigned long Size,string Op)
+void OpProgress::OverallProgress(unsigned long long Current, unsigned long long Total,
+                                unsigned long long Size,const string &Op)
 {
    this->Current = Current;
    this->Total = Total;
    this->Size = Size;
    this->Op = Op;
    SubOp = string();
 {
    this->Current = Current;
    this->Total = Total;
    this->Size = Size;
    this->Op = Op;
    SubOp = string();
-   Percent = Current*100.0/Total;
+   if (Total == 0)
+      Percent = 0;
+   else
+      Percent = Current*100.0/Total;
    Update();
 }
                                                                        /*}}}*/
 // OpProgress::SubProgress - Set the sub progress state                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
    Update();
 }
                                                                        /*}}}*/
 // OpProgress::SubProgress - Set the sub progress state                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-void OpProgress::SubProgress(unsigned long SubTotal,string Op)
+void OpProgress::SubProgress(unsigned long long SubTotal,const string &Op,
+                            float const Percent)
 {
    this->SubTotal = SubTotal;
 {
    this->SubTotal = SubTotal;
-   SubOp = Op;
-   Percent = Current*100.0/Total;
+   if (Op.empty() == false)
+      SubOp = Op;
+   if (Total == 0 || Percent == 0)
+      this->Percent = 0;
+   else if (Percent != -1)
+      this->Percent = this->Current += (Size*Percent)/SubTotal;
+   else
+      this->Percent = Current*100.0/Total;
    Update();
 }
                                                                        /*}}}*/
    Update();
 }
                                                                        /*}}}*/
@@ -75,10 +100,20 @@ bool OpProgress::CheckChange(float Interval)
    }
    MajorChange = false;
 
    }
    MajorChange = false;
 
+   if (SubOp != LastSubOp)
+   {
+      LastSubOp = SubOp;
+      return true;
+   }
+   
    if ((int)LastPercent == (int)Percent)
       return false;
    if ((int)LastPercent == (int)Percent)
       return false;
+
    LastPercent = Percent;
    
    LastPercent = Percent;
    
+   if (Interval == 0)
+      return false;
+   
    // Check time delta
    struct timeval Now;
    gettimeofday(&Now,0);
    // Check time delta
    struct timeval Now;
    gettimeofday(&Now,0);
@@ -89,6 +124,18 @@ bool OpProgress::CheckChange(float Interval)
    return true;
 }
                                                                        /*}}}*/
    return true;
 }
                                                                        /*}}}*/
+// OpTextProgress::OpTextProgress - Constructor                                /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+OpTextProgress::OpTextProgress(Configuration &Config) :
+                               NoUpdate(false), NoDisplay(false), LastLen(0)
+{
+   if (Config.FindI("quiet",0) >= 1 || Config.FindB("quiet::NoUpdate", false) == true)
+      NoUpdate = true;
+   if (Config.FindI("quiet",0) >= 2)
+      NoDisplay = true;
+}
+                                                                       /*}}}*/
 // OpTextProgress::Done - Clean up the display                         /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // OpTextProgress::Done - Clean up the display                         /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -97,11 +144,20 @@ void OpTextProgress::Done()
    if (NoUpdate == false && OldOp.empty() == false)
    {
       char S[300];
    if (NoUpdate == false && OldOp.empty() == false)
    {
       char S[300];
-      snprintf(S,sizeof(S),"\r%s... Done",OldOp.c_str());
+      if (_error->PendingError() == true)
+        snprintf(S,sizeof(S),_("%c%s... Error!"),'\r',OldOp.c_str());
+      else
+        snprintf(S,sizeof(S),_("%c%s... Done"),'\r',OldOp.c_str());
       Write(S);
       cout << endl;
       OldOp = string();
       Write(S);
       cout << endl;
       OldOp = string();
-   }      
+   }
+
+   if (NoUpdate == true && NoDisplay == false && OldOp.empty() == false)
+   {
+      OldOp = string();
+      cout << endl;
+   }
 }
                                                                        /*}}}*/
 // OpTextProgress::Update - Simple text spinner                                /*{{{*/
 }
                                                                        /*}}}*/
 // OpTextProgress::Update - Simple text spinner                                /*{{{*/
@@ -109,7 +165,7 @@ void OpTextProgress::Done()
 /* */
 void OpTextProgress::Update()
 {
 /* */
 void OpTextProgress::Update()
 {
-   if (CheckChange(0) == false)
+   if (CheckChange((NoUpdate == true?0:0.7)) == false)
       return;
    
    // No percent spinner
       return;
    
    // No percent spinner
@@ -117,7 +173,14 @@ void OpTextProgress::Update()
    {
       if (MajorChange == false)
         return;
    {
       if (MajorChange == false)
         return;
-      cout << Op << endl;
+      if (NoDisplay == false)
+      {
+        if (OldOp.empty() == false)
+           cout << endl;
+        OldOp = "a";
+        cout << Op << _("...") << flush;
+      }
+      
       return;
    }
 
       return;
    }
 
@@ -131,7 +194,7 @@ void OpTextProgress::Update()
    }
    
    // Print the spinner
    }
    
    // Print the spinner
-   snprintf(S,sizeof(S),"\r%s... %u%%",Op.c_str(),(unsigned int)Percent);
+   snprintf(S,sizeof(S),_("%c%s... %u%%"),'\r',Op.c_str(),(unsigned int)Percent);
    Write(S);
 
    OldOp = Op;
    Write(S);
 
    OldOp = Op;