This PR was squashed before being merged into the 4.1-dev branch (closes #24363).
Discussion
----------
[Console] Modify console output and print multiple modifyable sections
| Q | A
| ------------- | ---
| Branch? | 4.1
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | TBD
| Fixed tickets |
| License | MIT
| Doc PR | symfony/symfony-docs#9304
Add support to create different output sections for the console output.
Each section is it's own 'stream' of output, where the output can be modified (even if there are other output after it). This allows you to modify previous output in the console, either by appending new lines, modifying previous lines or clearing the output. Modifying a sections output doesn't affect the output after that or in other sections.
Some examples of what can be done:
**Overwriting content in a previous section:**
Code:
```php
$section1 = $output->section();
$section2 = $output->section();
$section1->writeln("<comment>Doing something</comment>\n");
usleep(500000);
$section2->writeln('<info>Result of first operation</info>');
usleep(500000);
$section1->overwrite("<comment>Doing something else</comment>\n");
usleep(500000);
$section2->writeln('<info>Result of second operation</info>');
usleep(500000);
$section1->overwrite("<comment>Finishing</comment>\n");
usleep(500000);
$section2->writeln('<info>Last Result</info>');
```
Result:
![overwrite-append](https://user-images.githubusercontent.com/144858/30975030-769f2c46-a471-11e7-819f-c3698b43f0af.gif)
**Multiple Progress Bars:**
Code:
```php
$section1 = $output->section();
$section2 = $output->section();
$progress = new ProgressBar($section1);
$progress2 = new ProgressBar($section2);
$progress->start(100);
$progress2->start(100);
$c = 0;
while (++$c < 100) {
$progress->advance();
if ($c % 2 === 0) {
$progress2->advance(4);
}
usleep(500000);
}
```
Result:
![multiple-progress](https://user-images.githubusercontent.com/144858/30975119-b63222be-a471-11e7-89aa-a555cdf3d2e0.gif)
**Modifying content of a table & updating a progress bar:**
Code:
```php
$section1 = $output->section();
$section2 = $output->section();
$progress = new ProgressBar($section1);
$table = new Table($section2);
$table->addRow(['Row 1']);
$table->render();
$progress->start(5);
$c = 0;
while (++$c < 5) {
$table->appendRow(['Row '.($c + 1)]);
$progress->advance();
usleep(500000);
}
$progress->finish();
$section1->clear();
```
Result:
![progress-table](https://user-images.githubusercontent.com/144858/30975176-e332499c-a471-11e7-9d4f-f58b464a53c2.gif)
**Example with Symfony Installer:***
Before:
![sf-installer-old](https://user-images.githubusercontent.com/144858/30975291-40f22106-a472-11e7-8836-bc39139c2d30.gif)
After:
![sf-installer](https://user-images.githubusercontent.com/144858/30975302-4a00acf4-a472-11e7-83ba-88ea9d0f0f3f.gif)
TODO:
- [x] Add unit tests
Commits
-------
|
||
---|---|---|
.. | ||
Bridge | ||
Bundle | ||
Component |