Progressbar Symfony Process с git-клоном - PullRequest
0 голосов
/ 18 октября 2018

Я использую компоненты процесса Symfonie, я запускаю команду git clone и хотел бы показать ее индикатор выполнения. До сих пор я делал это:

protected function cloneRepo(String $name)
{
    $process = new Process(
        "git clone {$this->getGitUrl(true)} {$name}" // does clone the repo works
    );

    $output = new ConsoleOutput();
    // creates a new progress bar (100 units)
    $progressBar = new ProgressBar($output, 100);

    $process->run();
    // starts and displays the progress bar
    $progressBar->start();

    $files = array_filter(explode("\n", $process->getOutput()), 'strlen');

    for ($i = 0; $i < count($files); $i++) {
        $progressBar->advance();
    }

    // ensures that the progress bar is at 100%
    $progressBar->finish();

    // executes after the command finishes
    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }

    echo $process->getOutput();
}

Но это показывает только готовый индикатор выполнения.после того, как клон уже закончен

1 Ответ

0 голосов
/ 18 октября 2018

Я не думаю, что есть простой способ нарисовать индикатор выполнения, потому что, насколько я могу судить, невозможно определить, какая часть данных обрабатывается.Вообще говоря, вы можете запустить процесс, а затем использовать обратный вызов в wait(), чтобы попытаться получить текущий вывод и рассчитать прогресс по нему.Так что ваш код может выглядеть примерно так.Вам все еще нужно заменить TODO реальной логикой, чтобы определить, сколько нужно продвигать.

$process new Process(
    "git clone {$this->getGitUrl(true)} {$name}" // does clone the repo works
);
$progressBar = new ProgressBar($output, 100);
$process->start();
$progressBar->start();

$process->wait(function($type, $buffer) use ($progressBar) {
    // TODO: Read the current output from buffer and determine progress
    $progressBar->advance();
});
$progressBar->finish();
...