[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] dpkg: show progress while reading the files database



Reading the files database can take a while on machines with slow disks
and an empty cache.  To make the wait more tolerable and if stdout is a
terminal, display a progress indicator (going to some lengths to avoid
updating the display too often).
---
 src/filesdb.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

GNU ChangeLog entry, if still necessary:

2009-02-20  Romain Francoise  <rfrancoise@debian.org>

        * src/filesdb.c (ensure_allinstfiles_available): If stdout
          is a terminal, display a progress indicator.

diff --git a/src/filesdb.c b/src/filesdb.c
index 97fe767..f83d2e5 100644
--- a/src/filesdb.c
+++ b/src/filesdb.c
@@ -208,19 +208,29 @@ void ensure_packagefiles_available(struct pkginfo *pkg) {
 void ensure_allinstfiles_available(void) {
   struct pkgiterator *it;
   struct pkginfo *pkg;
-    
+  int fancy = isatty(1), cur, last = 0, count = 0, max = countpackages();
+
   if (allpackagesdone) return;
   if (saidread<2) {
     saidread=1;
     printf(_("(Reading database ... "));
   }
   it= iterpkgstart();
-  while ((pkg = iterpkgnext(it)) != NULL)
+  while ((pkg = iterpkgnext(it)) != NULL) {
     ensure_packagefiles_available(pkg);
+    if (saidread == 1 && fancy) {
+      cur = (++count * 100) / max;
+      if (!(cur % 5) && cur > last)
+        printf("\r%s%d%%", _("(Reading database ... "), cur);
+      last = cur;
+    }
+  }
   iterpkgend(it);
   allpackagesdone= 1;
 
   if (saidread==1) {
+    if (fancy)
+      printf("\r%s", _("(Reading database ... "));
     printf(_("%d files and directories currently installed.)\n"),nfiles);
     saidread=2;
   }
-- 
1.6.2.rc1.20.g8c5b


Reply to: