fix stream progress notification with resetting bytes_max
authorMichael Wallner <mike@php.net>
Wed, 8 Apr 2015 09:21:50 +0000 (11:21 +0200)
committerMichael Wallner <mike@php.net>
Wed, 8 Apr 2015 09:21:50 +0000 (11:21 +0200)
bin/pharext
src/pharext/Packager.php
src/pharext/Task/StreamFetch.php

index 9bb285cbbf02c144a48047268f6e53b6b6d3bae2..3de5018b8b5f92aa23453111acd01fe591717a6a 100755 (executable)
Binary files a/bin/pharext and b/bin/pharext differ
index 81bac81d13335cae823b9feb2a541f843a76e118..cd1d43681d2d9a1167615c170365175cc3c5c9b4 100644 (file)
@@ -144,13 +144,20 @@ class Packager implements Command
                if ($this->args->git) {
                        $task = new Task\GitClone($source);
                } else {
-                       $task = new Task\StreamFetch($source, function($bytes_pct) {
-                               $this->info(" %3d%% [%s>%s] \r%s",
-                                       floor($bytes_pct*100),
-                                       str_repeat("=", round(50*$bytes_pct)),
-                                       str_repeat(" ", round(50*(1-$bytes_pct))),
-                                       $bytes_pct == 1 ? "\n":""
-                               );
+                       /* print newline only once */
+                       $done = false;
+                       $task = new Task\StreamFetch($source, function($bytes_pct) use(&$done) {
+                               if (!$done) {
+                                       $this->info(" %3d%% [%s>%s] \r",
+                                               floor($bytes_pct*100),
+                                               str_repeat("=", round(50*$bytes_pct)),
+                                               str_repeat(" ", round(50*(1-$bytes_pct)))
+                                       );
+                                       if ($bytes_pct == 1) {
+                                               $done = true;
+                                               printf("\n");
+                                       }
+                               }
                        });
                }
                $local = $task->run($this->verbosity());
index 3b1fc29cb53b4db1ce44ff6261e91444e3c591e8..029754ef773e906b7d9e57df012f511afc3d5ace 100644 (file)
@@ -33,16 +33,21 @@ class StreamFetch implements Task
        private function createStreamContext() {
                $progress = $this->progress;
 
-               return stream_context_create([],["notification" => function($notification, $severity, $message, $code, $bytes_cur, $bytes_max) use($progress) {
+               /* avoid bytes_max bug of older PHP versions */
+               $maxbytes = 0;
+               return stream_context_create([],["notification" => function($notification, $severity, $message, $code, $bytes_cur, $bytes_max) use($progress, &$maxbytes) {
+                       if ($bytes_max > $maxbytes) {
+                               $maxbytes = $bytes_max;
+                       }
                        switch ($notification) {
                                case STREAM_NOTIFY_CONNECT:
                                        $progress(0);
                                        break;
                                case STREAM_NOTIFY_PROGRESS:
-                                       $progress($bytes_max ? $bytes_cur/$bytes_max : .5);
+                                       $progress($maxbytes > 0 ? $bytes_cur/$maxbytes : .5);
                                        break;
                                case STREAM_NOTIFY_COMPLETED:
-                                       /* this is not generated, why? */
+                                       /* this is sometimes not generated, why? */
                                        $progress(1);
                                        break;
                        }