--- procmake	2004/11/27 19:14:31	1.1
+++ procmake	2004/11/27 20:06:40
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # ProcMake 0.2: a GNU Make wrapper which produces a progress report.
 # 2004-04-25 groundzero@zuavra.net http://software.zuavra.net/procmake/
@@ -9,16 +9,21 @@
 # the outcome.
 #
 # The following options are customizable.
+
+# How wide to make the progress bar
 BAR_WIDTH=50
+# How far back to look for a completion time estimate (0 disables)
+ESTIMATE_PERCENT=20
 
 # From this point forward, do not modify anything unless you know
 # what you're doing.
-TSTART=`date +%s`
+TSTART=$SECONDS
 
 # function to draw a percentage bar
 function drawbar() {
   if (( BARS < BAR_WIDTH )); then
-    echo -en "\033[1G"
+    #echo -en "\033[1G"
+    echo -en "\r"
     echo -n "["
     PAR=${1:-0}
     BARS=$((BAR_WIDTH*PAR/100))
@@ -28,7 +33,12 @@
     for i in `seq 1 1 $((BAR_WIDTH-BARS)) 2>/dev/null`; do
       echo -n " "
     done
-    echo -n "] ${PAR}%  "
+    echo -n "] ${PAR}%"
+    REMAIN=${2:-0}
+    if (( REMAIN > -1 )); then
+      echo -n ": `showtime $REMAIN`"
+    fi
+    echo -n "   "
   fi
 }
 
@@ -46,18 +56,34 @@
 # the simulation run
 echo -n "Counting marker lines ... "
 TOTAL=`make -dnk ${@} 2>&1|grep -i "Finished prerequisites"|wc -l|tr -d "[:space:]"`
+EST_WINDOW=$((TOTAL*ESTIMATE_PERCENT/100))
 echo "expecting $TOTAL marker lines."
 
 # the real run
 PARTIAL=0
 OLD=0
-drawbar 0
+drawbar 0 -1
 make -d ${@} 2>&1|grep -i "Finished prerequisites"|\
 while read LINE; do
   PARTIAL=$((PARTIAL+1))
+  TRACK[$PARTIAL]=$SECONDS
   NEW=$((PARTIAL*100/TOTAL))
   if [ "$OLD" != "$NEW" ]; then
-    drawbar $NEW
+
+    TREMAIN=-1
+    if [ "$EST_WINDOW" -gt 0 ]; then
+      if [ "$PARTIAL" -gt "$EST_WINDOW" ]; then
+        DIFF_START=$((PARTIAL-EST_WINDOW))
+        WINDOW_SPAN=$EST_WINDOW
+      else
+        DIFF_START=1
+        WINDOW_SPAN=$PARTIAL
+      fi
+      TWINDOW=$((${TRACK[$PARTIAL]}-${TRACK[$DIFF_START]}))
+      TREMAIN=$(((TOTAL-PARTIAL)*TWINDOW/WINDOW_SPAN))
+    fi
+
+    drawbar $NEW $TREMAIN
   fi
   OLD=$NEW
 done
@@ -65,7 +91,7 @@
 echo
 
 # output results
-TSTOP=`date +%s`
+TSTOP=$SECONDS
 echo -n "It took `showtime $((TSTOP-TSTART))`, "
 echo "and make returned code ${RET}."
 exit $RET
