@@ -31,6 +31,12 @@ final class ProgressBar
3131 /** Time when progress bar starts displaying */
3232 private int $ startTime ;
3333
34+ /**
35+ * Indicator whether maxProgress was truly set as zero.
36+ * MaxProgress must always be at least one to be displayed.
37+ */
38+ private bool $ maxProgressIsZero = false ;
39+
3440 /**
3541 * Initialize and set progress and maxProgress when available.
3642 * Use separate setProgress() and setMaxProgress() methods when undetermined during initialization.
@@ -204,7 +210,7 @@ private function setEstimatedTime(): ProgressBar
204210 $ this ->estimatedTime = round (
205211 (
206212 time () - $ this ->startTime
207- ) / $ this ->progress * ($ this ->maxProgress - $ this ->progress )
213+ ) / max ( 1 , $ this ->progress ) * ($ this ->maxProgress - $ this ->progress )
208214 );
209215
210216 return $ this ;
@@ -215,6 +221,10 @@ private function setEstimatedTime(): ProgressBar
215221 */
216222 public function setMaxProgress (int |float $ maxProgress ): ProgressBar
217223 {
224+ if ($ maxProgress == 0 ) {
225+ $ this ->maxProgressIsZero = true ;
226+ }
227+
218228 $ this ->maxProgress = max (1 , $ maxProgress );
219229
220230 return $ this ;
@@ -274,6 +284,12 @@ public function start(): void
274284 */
275285 public function tick (int $ progress = 1 ): void
276286 {
287+ if ($ progress == 0 && $ this ->maxProgressIsZero ) {
288+ $ this ->finish ();
289+
290+ return ;
291+ }
292+
277293 $ this ->setProgress ($ this ->progress + $ progress )
278294 ->setEstimatedTime ();
279295
0 commit comments