Skip to content

Commit a4085e9

Browse files
committed
feat: support diffing against empty composer.lock files
1 parent 8907711 commit a4085e9

5 files changed

Lines changed: 57 additions & 2 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ composer diff --help # Display detailed usage instructions
8383
```shell script
8484
composer diff master # Compare current composer.lock with the one on master branch
8585
composer diff master:composer.lock develop:composer.lock -p # Compare master and develop branches, including platform dependencies
86+
composer diff /path/to/empty/composer.lock composer.lock # Compare a new lock file against an empty base
8687
composer diff --no-dev # ignore dev dependencies
8788
composer diff -p # include platform dependencies
8889
composer diff -f json # Output as JSON instead of table

src/PackageDiff.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ private function getFileContents($path, $lockFile = true)
210210

211211
if (filter_var($localPath, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) || file_exists($localPath)) {
212212
// @phpstan-ignore return.type
213-
return file_get_contents($localPath);
213+
return $this->normalizeFileContents(file_get_contents($localPath));
214214
}
215215

216216
if (false === strpos($originalPath, self::GIT_SEPARATOR)) {
@@ -234,7 +234,21 @@ private function getFileContents($path, $lockFile = true)
234234
return '{}'; // Do not throw exception for composer.json as it might not exist and that's fine
235235
}
236236

237-
return $outputString;
237+
return $this->normalizeFileContents($outputString);
238+
}
239+
240+
/**
241+
* @param string $contents
242+
*
243+
* @return string
244+
*/
245+
private function normalizeFileContents($contents)
246+
{
247+
if ('' === trim($contents)) {
248+
return '{}';
249+
}
250+
251+
return $contents;
238252
}
239253

240254
/**

tests/PackageDiffTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,31 @@ public function testLoadFromEmptyArray()
152152
$this->assertInstanceOf('Composer\Repository\ArrayRepository', $diff->loadPackagesFromArray(array(), true, true));
153153
}
154154

155+
public function testDiffAgainstEmptyBaseLockFile()
156+
{
157+
$diff = new PackageDiff();
158+
159+
$prodOperations = $diff->getPackageDiff(
160+
__DIR__.'/fixtures/empty/composer.lock',
161+
__DIR__.'/fixtures/empty-target/composer.lock',
162+
false,
163+
false
164+
);
165+
$devOperations = $diff->getPackageDiff(
166+
__DIR__.'/fixtures/empty/composer.lock',
167+
__DIR__.'/fixtures/empty-target/composer.lock',
168+
true,
169+
false
170+
);
171+
172+
$this->assertSame(array(
173+
'install example/package 1.2.3',
174+
), array_map(array($this, 'entryToString'), $prodOperations->getArrayCopy()));
175+
$this->assertSame(array(
176+
'install example/dev-package 2.3.4',
177+
), array_map(array($this, 'entryToString'), $devOperations->getArrayCopy()));
178+
}
179+
155180
public function diffOperationsProvider()
156181
{
157182
return array(

tests/fixtures/empty-target/composer.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/fixtures/empty/composer.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)