Skip to content

Commit

Permalink
Keep same amount of newlines as before
Browse files Browse the repository at this point in the history
  • Loading branch information
VasekPurchart committed Apr 28, 2022
1 parent a714a4c commit e944e72
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 8 deletions.
6 changes: 5 additions & 1 deletion src/Command/AnalyseCommand.php
Expand Up @@ -11,6 +11,7 @@
use PHPStan\Command\Symfony\SymfonyOutput;
use PHPStan\Command\Symfony\SymfonyStyle;
use PHPStan\File\CouldNotWriteFileException;
use PHPStan\File\FileReader;
use PHPStan\File\FileWriter;
use PHPStan\File\ParentDirectoryRelativePathHelper;
use PHPStan\File\PathNotFoundException;
Expand All @@ -32,6 +33,7 @@
use function is_array;
use function is_bool;
use function is_dir;
use function is_file;
use function is_string;
use function mkdir;
use function pathinfo;
Expand Down Expand Up @@ -279,10 +281,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$baselineFileDirectory = dirname($generateBaselineFile);
$baselineErrorFormatter = new BaselineNeonErrorFormatter(new ParentDirectoryRelativePathHelper($baselineFileDirectory));

$existingBaselineContent = is_file($generateBaselineFile) ? FileReader::read($generateBaselineFile) : '';

$streamOutput = $this->createStreamOutput();
$errorConsoleStyle = new ErrorsConsoleStyle(new StringInput(''), $streamOutput);
$baselineOutput = new SymfonyOutput($streamOutput, new SymfonyStyle($errorConsoleStyle));
$baselineErrorFormatter->formatErrors($analysisResult, $baselineOutput);
$baselineErrorFormatter->formatErrors($analysisResult, $baselineOutput, $existingBaselineContent);

$stream = $streamOutput->getStream();
rewind($stream);
Expand Down
19 changes: 15 additions & 4 deletions src/Command/ErrorFormatter/BaselineNeonErrorFormatter.php
Expand Up @@ -4,6 +4,7 @@

use Nette\DI\Helpers;
use Nette\Neon\Neon;
use Nette\Utils\Strings;
use PHPStan\Command\AnalysisResult;
use PHPStan\Command\Output;
use PHPStan\File\RelativePathHelper;
Expand All @@ -23,10 +24,11 @@ public function __construct(private RelativePathHelper $relativePathHelper)
public function formatErrors(
AnalysisResult $analysisResult,
Output $output,
string $existingBaselineContent,
): int
{
if (!$analysisResult->hasErrors()) {
$output->writeRaw($this->getNeon([]));
$output->writeRaw($this->getNeon([], $existingBaselineContent));
return 0;
}

Expand Down Expand Up @@ -61,15 +63,15 @@ public function formatErrors(
}
}

$output->writeRaw($this->getNeon($errorsToOutput));
$output->writeRaw($this->getNeon($errorsToOutput, $existingBaselineContent));

return 1;
}

/**
* @param array<int, array{message: string, count: int, path: string}> $ignoreErrors
*/
private function getNeon(array $ignoreErrors): string
private function getNeon(array $ignoreErrors, string $existingBaselineContent): string
{
$neon = Neon::encode([
'parameters' => [
Expand All @@ -81,7 +83,16 @@ private function getNeon(array $ignoreErrors): string
throw new ShouldNotHappenException();
}

return substr($neon, 0, -1);
if ($existingBaselineContent === '') {
return substr($neon, 0, -1);
}

$existingBaselineContentEndOfFileNewlinesMatches = Strings::match($existingBaselineContent, "~(\n)+$~");
$existingBaselineContentEndOfFileNewlines = $existingBaselineContentEndOfFileNewlinesMatches !== null
? $existingBaselineContentEndOfFileNewlinesMatches[0]
: '';

return substr($neon, 0, -2) . $existingBaselineContentEndOfFileNewlines;
}

}
Expand Up @@ -20,6 +20,7 @@
use function rewind;
use function shuffle;
use function sprintf;
use function str_repeat;
use function stream_get_contents;
use function substr;
use function trim;
Expand Down Expand Up @@ -128,6 +129,7 @@ public function testFormatErrors(
$this->assertSame($exitCode, $formatter->formatErrors(
$this->getAnalysisResult($numFileErrors, $numGenericErrors),
$this->getOutput(),
'',
), sprintf('%s: response code do not match', $message));

$this->assertSame(trim(Neon::encode(['parameters' => ['ignoreErrors' => $expected]], Neon::BLOCK)), trim($this->getOutputContent()), sprintf('%s: output do not match', $message));
Expand All @@ -150,6 +152,7 @@ public function testFormatErrorMessagesRegexEscape(): void
$formatter->formatErrors(
$result,
$this->getOutput(),
'',
);

self::assertSame(
Expand Down Expand Up @@ -186,6 +189,7 @@ public function testEscapeDiNeon(): void
$formatter->formatErrors(
$result,
$this->getOutput(),
'',
);
self::assertSame(
trim(
Expand Down Expand Up @@ -248,6 +252,7 @@ public function testOutputOrdering(array $errors): void
$formatter->formatErrors(
$result,
$this->getOutput(),
'',
);
self::assertSame(
trim(Neon::encode([
Expand Down Expand Up @@ -300,14 +305,63 @@ public function testOutputOrdering(array $errors): void
*/
public function endOfFileNewlinesProvider(): Generator
{
$existingBaselineContentWithoutEndNewlines = 'parameters:
ignoreErrors:
-
message: "#^Existing error$#"
count: 1
path: TestfileA';

yield 'one error' => [
'errors' => [
new Error('Error #1', 'TestfileA', 1),
],
'existingBaselineContent' => $existingBaselineContentWithoutEndNewlines . "\n",
'expectedNewlinesCount' => 1,
];

yield 'no errors' => [
'errors' => [],
'existingBaselineContent' => $existingBaselineContentWithoutEndNewlines . "\n",
'expectedNewlinesCount' => 1,
];

yield 'one error with 2 newlines' => [
'errors' => [
new Error('Error #1', 'TestfileA', 1),
],
'existingBaselineContent' => $existingBaselineContentWithoutEndNewlines . "\n\n",
'expectedNewlinesCount' => 2,
];

yield 'no errors with 2 newlines' => [
'errors' => [],
'existingBaselineContent' => $existingBaselineContentWithoutEndNewlines . "\n\n",
'expectedNewlinesCount' => 2,
];

yield 'one error with 0 newlines' => [
'errors' => [
new Error('Error #1', 'TestfileA', 1),
],
'existingBaselineContent' => $existingBaselineContentWithoutEndNewlines,
'expectedNewlinesCount' => 0,
];

yield 'one error with 3 newlines' => [
'errors' => [
new Error('Error #1', 'TestfileA', 1),
],
'existingBaselineContent' => $existingBaselineContentWithoutEndNewlines . "\n\n\n",
'expectedNewlinesCount' => 3,
];

yield 'empty existing baseline' => [
'errors' => [
new Error('Error #1', 'TestfileA', 1),
],
'existingBaselineContent' => '',
'expectedNewlinesCount' => 1,
];
}

Expand All @@ -316,7 +370,11 @@ public function endOfFileNewlinesProvider(): Generator
*
* @param list<Error> $errors
*/
public function testEndOfFileNewlines(array $errors): void
public function testEndOfFileNewlines(
array $errors,
string $existingBaselineContent,
int $expectedNewlinesCount,
): void
{
$formatter = new BaselineNeonErrorFormatter(new SimpleRelativePathHelper(self::DIRECTORY_PATH));
$result = new AnalysisResult(
Expand All @@ -341,6 +399,7 @@ public function testEndOfFileNewlines(array $errors): void
$formatter->formatErrors(
$result,
$output,
$existingBaselineContent,
);

rewind($outputStream->getStream());
Expand All @@ -350,8 +409,10 @@ public function testEndOfFileNewlines(array $errors): void
throw new ShouldNotHappenException();
}

Assert::assertSame("\n", substr($content, -1));
Assert::assertNotSame("\n", substr($content, -2, 1));
if ($expectedNewlinesCount > 0) {
Assert::assertSame(str_repeat("\n", $expectedNewlinesCount), substr($content, -$expectedNewlinesCount));
}
Assert::assertNotSame("\n", substr($content, -($expectedNewlinesCount + 1), 1));
}

}

0 comments on commit e944e72

Please sign in to comment.