Skip to content

Commit

Permalink
populate metadata.tools.tool.externalReferences #171
Browse files Browse the repository at this point in the history
Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
  • Loading branch information
jkowalleck committed Dec 10, 2022
1 parent f5b4553 commit f9d8fe7
Show file tree
Hide file tree
Showing 12 changed files with 155 additions and 49 deletions.
1 change: 1 addition & 0 deletions .composer-require-checker.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"Composer\\Package\\PackageInterface",
"Composer\\Package\\RootPackage",
"Composer\\Package\\RootPackageInterface",
"Composer\\PartialComposer",
"Composer\\Plugin\\Capability\\CommandProvider",
"Composer\\Plugin\\Capable",
"Composer\\Plugin\\PluginInterface",
Expand Down
2 changes: 2 additions & 0 deletions HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ All notable changes to this project will be documented in this file.
* Support for CycloneDX Spec v1.4 (via [#250])
* SBOM results
* might have `metadata.timestamp` populated ([#112] via [#250])
* might have `metadata.tools.tool.eexternalReferences` populated ([#171] via [#250])
* might have `component.author` populated ([#261] via [#250])
* CLI
* New option `omit` (via [#250])
Expand All @@ -37,6 +38,7 @@ All notable changes to this project will be documented in this file.
[#128]: https://github.com/CycloneDX/cyclonedx-php-composer/issues/128
[#153]: https://github.com/CycloneDX/cyclonedx-php-composer/issues/153
[#154]: https://github.com/CycloneDX/cyclonedx-php-composer/issues/154
[#171]: https://github.com/CycloneDX/cyclonedx-php-composer/issues/171
[#250]: https://github.com/CycloneDX/cyclonedx-php-composer/pull/250
[#261]: https://github.com/CycloneDX/cyclonedx-php-composer/issues/261

Expand Down
19 changes: 18 additions & 1 deletion demo/devReq/results/bom.1.4.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions demo/devReq/results/bom.1.4.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 18 additions & 1 deletion demo/laravel-7.12.0/results/bom.1.4.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions demo/laravel-7.12.0/results/bom.1.4.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 18 additions & 1 deletion demo/local/results/bom.1.4.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions demo/local/results/bom.1.4.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 19 additions & 2 deletions demo/symfony/example-results/bom.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 15 additions & 1 deletion demo/symfony/example-results/bom.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 6 additions & 38 deletions src/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
use Generator;
use PackageUrl\PackageUrl;
use RuntimeException;
use stdClass;

/**
* @internal
Expand Down Expand Up @@ -283,44 +282,9 @@ private function createExternalReferencesFromPackage(CompletePackageInterface $p
}

/**
* @psalm-param null|non-empty-string $versionOverride
*
* @psalm-suppress MissingThrowsDocblock
*/
public function createThisTool(?string $versionOverride): Models\Tool
{
// TODO load from actual package ... if available and locked
// use $this->createToolFromPackage()

/** @var stdClass */
$thisPackageManifest = json_decode(file_get_contents(__DIR__.'/../composer.json'), false, 512, \JSON_THROW_ON_ERROR);

$thisPackageManifest->version = $versionOverride
?? trim(file_get_contents(__DIR__.'/../semver.txt'));

return $this->createToolFromManifest($thisPackageManifest);
}

private function createToolFromManifest(stdClass $package): Models\Tool
{
\assert(\is_string($package->name));
\assert(null === $package->version || \is_string($package->version));

[$group, $name] = $this->getGroupAndName($package->name);

$tool = new Models\Tool();
$tool->setName($name);
$tool->setVendor($group);
$tool->setVersion($package->version);
$tool->getExternalReferences()->addItems();

return $tool;
}

/**
* @psalm-suppress MissingThrowsDocblock
*/
private function createToolFromPackage(PackageInterface $package): Models\Tool
public function createToolFromPackage(PackageInterface $package): Models\Tool
{
[$group, $name] = $this->getGroupAndName($package->getName());
$distUrl = $package->getDistUrl();
Expand All @@ -331,7 +295,11 @@ private function createToolFromPackage(PackageInterface $package): Models\Tool
$tool->setName($name);
$tool->setVendor($group);
$tool->setVersion($package->getFullPrettyVersion());
$tool->getExternalReferences()->addItems();
if ($package instanceof CompletePackageInterface) {
$tool->getExternalReferences()->addItems(
...iterator_to_array($this->createExternalReferencesFromPackage($package))
);
}
if ($distUrl) {
$tool->getExternalReferences()->addItems(
new Models\ExternalReference(
Expand Down
21 changes: 16 additions & 5 deletions src/MakeBom/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,18 +118,29 @@ private function generateBom(IOInterface $io, Spec $spec): string
$this->options->mainComponentVersion,
);

$composer = (new ComposerFactory())->createComposer($io, $this->options->composerFile, fullLoad: true);
$subjectComposer = (new ComposerFactory())->createComposer($io, $this->options->composerFile, fullLoad: true);
/** @psalm-suppress RedundantConditionGivenDocblockType -- as with lowest-compatible dependencies this is needed */
\assert($composer instanceof \Composer\Composer);
$bom = $builder->createBomFromComposer($composer);
unset($composer);
\assert($subjectComposer instanceof \Composer\Composer);
$bom = $builder->createBomFromComposer($subjectComposer);
unset($subjectComposer);

if (!$this->options->outputReproducible) {
$bom->getMetadata()->setTimestamp(new DateTime());
}

$selfComposer = (new ComposerFactory())->createComposer($io, __DIR__.'/../../composer.json',
fullLoad: false, disablePlugins: true, disableScripts: true);
/** @psalm-suppress RedundantConditionGivenDocblockType -- as with lowest-compatible dependencies this is needed */
\assert($selfComposer instanceof \Composer\PartialComposer);
$bom->getMetadata()->getTools()->addItems(
$builder->createThisTool($this->options->getToolVersionOverride())
$builder->createToolFromPackage(
$selfComposer->getPackage()
)->setVersion(
$this->options->getToolVersionOverride()
?? trim(file_get_contents(__DIR__.'/../../semver.txt')
))
);
unset($selfComposer);

$io->writeError('<info>serialize BOM...</info>', verbosity: IOInterface::VERBOSE);
/** @var Serialization\Serializer */
Expand Down

0 comments on commit f9d8fe7

Please sign in to comment.