setName('generate') ->setDescription('Generate Licenses file from project dependencies.') ->addOption('hide-version', 'hv', InputOption::VALUE_NONE, 'Hide dependency version') ->addOption('csv', null, InputOption::VALUE_NONE, 'Output csv format'); } /** * Execute the command. * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->hideVersion = $input->getOption('hide-version'); $this->toCsv = $input->getOption('csv'); $dependencies = $this->getDependencyList(); $output->writeln('Generating Licenses file...'); if ($this->toCsv) { $this->generateLicensesCSV($dependencies); } else { $this->generateLicensesText($dependencies); } $output->writeln('Done!'); return 0; } /** * Generates Licenses Text using packages retrieved from composer.lock file. * * @param array $dependencies * * @return void */ protected function generateLicensesText($dependencies) { $text = $this->getBoilerplate(); foreach ($dependencies as $dependency) { $text .= $this->getTextForDependency($dependency); } file_put_contents('licenses.md', $text); } protected function generateLicensesCSV($dependencies) { $fp = fopen('licenses.csv', 'w'); $title = ['name', 'version', 'source', 'license description']; fputcsv($fp, $title); foreach ($dependencies as $dependency) { $dependencyLists = [ $dependency['name'], $this->hideVersion ? '' : $dependency['version'], $dependency['source']['url'], $this->getTextForDependency($dependency), ]; fputcsv($fp, $dependencyLists); } fclose($fp); } /** * Returns Boilerplate text for the Licences File. * * @return string */ protected function getBoilerplate() { return "# Project Licenses\nThis file was generated by the [PHP Legal Licenses](https://github.com/Comcast/php-legal-licenses) utility. It contains the name, version and commit sha, description, homepage, and license information for every dependency in this project.\n\n## Dependencies\n\n"; } /** * Retrieves text containing version, sha, and license information for the specified dependency. * * @param array $dependency * * @return string */ protected function getTextForDependency($dependency) { $name = $dependency['name']; $description = isset($dependency['description']) ? $dependency['description'] : 'Not configured.'; $version = $dependency['version']; $homepage = isset($dependency['homepage']) ? $dependency['homepage'] : 'Not configured.'; $sha = isset($dependency['source']) ? str_split($dependency['source']['reference'], 7)[0] : 'no sha'; $licenseNames = isset($dependency['license']) ? implode(', ', $dependency['license']) : 'Not configured.'; $license = $this->getFullLicenseText($name); return $this->generateDependencyText($name, $description, $version, $homepage, $sha, $licenseNames, $license); } /** * Retrieves full license text for a dependency from the vendor directory. * * @param string $name * * @return string */ protected function getFullLicenseText($name) { $path = getcwd()."/vendor/$name/"; $filenames = ['LICENSE.txt', 'LICENSE.md', 'LICENSE', 'license.txt', 'license.md', 'license', 'LICENSE-2.0.txt']; foreach ($filenames as $filename) { $text = @file_get_contents($path.$filename); if ($text) { return $text; } } return 'Full license text not found in dependency source.'; } /** * Generates Dependency Text based on boilerplate. * * @param string $name * @param string $description * @param string $version * @param string $homepage * @param string $sha * @param string $licenseNames * @param string $license * * @return string */ protected function generateDependencyText($name, $description, $version, $homepage, $sha, $licenseNames, $license) { return "### $name ".($this->hideVersion ? '' : "(Version $version | $sha)")."\n$description\nHomepage: $homepage\nLicenses Used: $licenseNames\n$license\n\n"; } } __halt_compiler();----SIGNATURE:----ae1czfLzKU9+E21vVfGx79uW/B1+6leO9/Er0A856e6dqCfuDvEjP9WBmYqXM+VLH0CWU0T5qb4E4l2HxIrI28iZM8K/svm7rPWgqLqqJ9/j9sQZ77Aw1k9rQcSwJq1CqwGQG2lNJ/3zExtzRjWzGsfgoRLJvg0QQHqSqNtBQWnFLK2C620Ear5FBeiv5mDnQjZaKf96GXjA3EXpFJtwd4C1gPAcGfwD+lg25VRcwSS1Cx8gcxOfA3s2wfGsQz+SPxMswjo5OrF4ASjBybIImKTqlf8d02wH6850455gHjn30Vrg0lD04Lt1+pk1pqUTOBgFKfxojnX1yqQWRaTsaCzLorGljPC/97H7dAkaPU+N1B79NVM6KksN25s9gQ0DSvoESkSMd63yOz6dSstgD5bbkIS+O+0HouQPNIobgtCchCijBER0IbvXsQnYkLyjXhP02+2DUqFbu0VtFST2SGYc2mwAdiVfkiv4gqt/7mFsAc0913C3l3Gon/Zr1h1ITEU58ditzryxkJpFwU8fY5xCPr7n4+ZnCFQMQRzdqZHYmz8QDBpngYWHUB20ynPbqTqN35Wqf1G8gUBxW3wfFR6zyazOGSebpoC2pzGkvKDtKLe8S+u8dZextIRQa3TYhITAOyHyD/QEjqby+EFSrPDKmzbRu2F8d0Nx1zG+W7A=----ATTACHMENT:----MTUxMzE2NTg0NzY4NTYxNiA2Njc0MzIzMTIzMjc2MzM2IDk2ODE1MzQ3MzcyNzg3NzM=