summaryrefslogtreecommitdiff
path: root/vendor/symfony/console/Helper/ProgressBar.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/symfony/console/Helper/ProgressBar.php')
-rw-r--r--vendor/symfony/console/Helper/ProgressBar.php150
1 files changed, 73 insertions, 77 deletions
diff --git a/vendor/symfony/console/Helper/ProgressBar.php b/vendor/symfony/console/Helper/ProgressBar.php
index e7717a52..247b5913 100644
--- a/vendor/symfony/console/Helper/ProgressBar.php
+++ b/vendor/symfony/console/Helper/ProgressBar.php
@@ -14,6 +14,7 @@ namespace Symfony\Component\Console\Helper;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\Console\Terminal;
/**
* The ProgressBar provides helpers to display progress output.
@@ -21,9 +22,8 @@ use Symfony\Component\Console\Exception\LogicException;
* @author Fabien Potencier <fabien@symfony.com>
* @author Chris Jones <leeked@gmail.com>
*/
-class ProgressBar
+final class ProgressBar
{
- // options
private $barWidth = 28;
private $barChar;
private $emptyBarChar = '-';
@@ -31,10 +31,6 @@ class ProgressBar
private $format;
private $internalFormat;
private $redrawFreq = 1;
-
- /**
- * @var OutputInterface
- */
private $output;
private $step = 0;
private $max;
@@ -42,15 +38,15 @@ class ProgressBar
private $stepWidth;
private $percent = 0.0;
private $formatLineCount;
- private $messages;
+ private $messages = array();
private $overwrite = true;
+ private $terminal;
+ private $firstRun = true;
private static $formatters;
private static $formats;
/**
- * Constructor.
- *
* @param OutputInterface $output An OutputInterface instance
* @param int $max Maximum steps (0 if unknown)
*/
@@ -62,6 +58,7 @@ class ProgressBar
$this->output = $output;
$this->setMaxSteps($max);
+ $this->terminal = new Terminal();
if (!$this->output->isDecorated()) {
// disable overwrite when output does not support ANSI codes.
@@ -82,7 +79,7 @@ class ProgressBar
* @param string $name The placeholder name (including the delimiter char like %)
* @param callable $callable A PHP callable
*/
- public static function setPlaceholderFormatterDefinition($name, $callable)
+ public static function setPlaceholderFormatterDefinition($name, callable $callable)
{
if (!self::$formatters) {
self::$formatters = self::initPlaceholderFormatters();
@@ -140,6 +137,16 @@ class ProgressBar
return isset(self::$formats[$name]) ? self::$formats[$name] : null;
}
+ /**
+ * Associates a text with a named placeholder.
+ *
+ * The text is displayed when the progress bar is rendered but only
+ * when the corresponding placeholder is part of the custom format line
+ * (by wrapping the name with %).
+ *
+ * @param string $message The text to associate with the placeholder
+ * @param string $name The name of the placeholder
+ */
public function setMessage($message, $name = 'message')
{
$this->messages[$name] = $message;
@@ -171,20 +178,6 @@ class ProgressBar
}
/**
- * Gets the progress bar step.
- *
- * @deprecated since version 2.6, to be removed in 3.0. Use {@link getProgress()} instead.
- *
- * @return int The progress bar step
- */
- public function getStep()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the getProgress() method instead.', E_USER_DEPRECATED);
-
- return $this->getProgress();
- }
-
- /**
* Gets the current step position.
*
* @return int The progress bar step
@@ -197,11 +190,9 @@ class ProgressBar
/**
* Gets the progress bar step width.
*
- * @internal This method is public for PHP 5.3 compatibility, it should not be used.
- *
* @return int The progress bar step width
*/
- public function getStepWidth()
+ private function getStepWidth()
{
return $this->stepWidth;
}
@@ -223,7 +214,7 @@ class ProgressBar
*/
public function setBarWidth($size)
{
- $this->barWidth = (int) $size;
+ $this->barWidth = max(1, (int) $size);
}
/**
@@ -343,8 +334,6 @@ class ProgressBar
* Advances the progress output X steps.
*
* @param int $step Number of steps to advance
- *
- * @throws LogicException
*/
public function advance($step = 1)
{
@@ -352,22 +341,6 @@ class ProgressBar
}
/**
- * Sets the current progress.
- *
- * @deprecated since version 2.6, to be removed in 3.0. Use {@link setProgress()} instead.
- *
- * @param int $step The current progress
- *
- * @throws LogicException
- */
- public function setCurrent($step)
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the setProgress() method instead.', E_USER_DEPRECATED);
-
- $this->setProgress($step);
- }
-
- /**
* Sets whether to overwrite the progressbar, false for new line.
*
* @param bool $overwrite
@@ -381,18 +354,15 @@ class ProgressBar
* Sets the current progress.
*
* @param int $step The current progress
- *
- * @throws LogicException
*/
public function setProgress($step)
{
$step = (int) $step;
- if ($step < $this->step) {
- throw new LogicException('You can\'t regress the progress bar.');
- }
if ($this->max && $step > $this->max) {
$this->max = $step;
+ } elseif ($step < 0) {
+ $step = 0;
}
$prevPeriod = (int) ($this->step / $this->redrawFreq);
@@ -434,25 +404,7 @@ class ProgressBar
$this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
}
- // these 3 variables can be removed in favor of using $this in the closure when support for PHP 5.3 will be dropped.
- $self = $this;
- $output = $this->output;
- $messages = $this->messages;
- $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self, $output, $messages) {
- if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) {
- $text = call_user_func($formatter, $self, $output);
- } elseif (isset($messages[$matches[1]])) {
- $text = $messages[$matches[1]];
- } else {
- return $matches[0];
- }
-
- if (isset($matches[2])) {
- $text = sprintf('%'.$matches[2], $text);
- }
-
- return $text;
- }, $this->format));
+ $this->overwrite($this->buildLine());
}
/**
@@ -513,20 +465,24 @@ class ProgressBar
private function overwrite($message)
{
if ($this->overwrite) {
- // Move the cursor to the beginning of the line
- $this->output->write("\x0D");
+ if (!$this->firstRun) {
+ // Move the cursor to the beginning of the line
+ $this->output->write("\x0D");
- // Erase the line
- $this->output->write("\x1B[2K");
+ // Erase the line
+ $this->output->write("\x1B[2K");
- // Erase previous lines
- if ($this->formatLineCount > 0) {
- $this->output->write(str_repeat("\x1B[1A\x1B[2K", $this->formatLineCount));
+ // Erase previous lines
+ if ($this->formatLineCount > 0) {
+ $this->output->write(str_repeat("\x1B[1A\x1B[2K", $this->formatLineCount));
+ }
}
} elseif ($this->step > 0) {
$this->output->writeln('');
}
+ $this->firstRun = false;
+
$this->output->write($message);
}
@@ -618,4 +574,44 @@ class ProgressBar
'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%',
);
}
+
+ /**
+ * @return string
+ */
+ private function buildLine()
+ {
+ $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i";
+ $callback = function ($matches) {
+ if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) {
+ $text = call_user_func($formatter, $this, $this->output);
+ } elseif (isset($this->messages[$matches[1]])) {
+ $text = $this->messages[$matches[1]];
+ } else {
+ return $matches[0];
+ }
+
+ if (isset($matches[2])) {
+ $text = sprintf('%'.$matches[2], $text);
+ }
+
+ return $text;
+ };
+ $line = preg_replace_callback($regex, $callback, $this->format);
+
+ // gets string length for each sub line with multiline format
+ $linesLength = array_map(function ($subLine) {
+ return Helper::strlenWithoutDecoration($this->output->getFormatter(), rtrim($subLine, "\r"));
+ }, explode("\n", $line));
+
+ $linesWidth = max($linesLength);
+
+ $terminalWidth = $this->terminal->getWidth();
+ if ($linesWidth <= $terminalWidth) {
+ return $line;
+ }
+
+ $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth);
+
+ return preg_replace_callback($regex, $callback, $this->format);
+ }
}