packaging/notice_generator.php (95 lines of code) (raw):

<?php // Path to the composer.lock file $composerLockFile = 'composer.lock'; $separatorLen = 80; // Check if the file exists if (!file_exists($composerLockFile)) { die('The composer.lock file does not exist.'); } // Read and decode the composer.lock file $composerData = readAndDecodeComposerLock($composerLockFile); // Check if the 'packages' section exists if (!isset($composerData['packages']) || !is_array($composerData['packages'])) { die('The "packages" section is missing in the composer.lock file.'); } $packages = $composerData['packages']; foreach ($packages as $package) { $packageName = $package['name'] ?? 'Unknown package name'; $packageVersion = $package['version'] ?? 'Unknown version'; $authors = getAuthors($package); $licenses = $package['license'] ?? ['No license']; $url = $package['homepage'] ?? ($package['support']['source'] ?? 'No URL'); $sourceUrl = $package['support']['source'] ?? $url; // Generate URLs for NOTICE.txt and LICENSE using new method and fallback to old method $noticeContent = fetchFileContent(generateRawFileUrl($package), 'NOTICE') ?: fetchFileContent(filterUrl($sourceUrl), 'NOTICE'); $licenseContent = fetchFileContent(generateRawFileUrl($package), 'LICENSE') ?: fetchFileContent(filterUrl($sourceUrl), 'LICENSE'); // Display package information echo "Package name: $packageName\n"; echo "Version: $packageVersion\n"; echo "Authors: " . implode(', ', $authors) . "\n"; echo "Licenses: " . implode(', ', $licenses) . "\n"; echo "URL: $url\n"; echo "\n"; if ($noticeContent) { echo "NOTICE content:\n$noticeContent\n"; } else { echo "No NOTICE file found\n"; } if ($licenseContent) { echo "LICENSE content:\n$licenseContent\n"; } else { echo "No LICENSE file found\n"; } echo str_repeat('-', $separatorLen)."\n\n"; } function readAndDecodeComposerLock($filePath) { $content = file_get_contents($filePath); $data = json_decode($content, true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON decoding error: ' . json_last_error_msg()); } return $data; } function getAuthors($package) { $authors = []; if (isset($package['authors']) && is_array($package['authors'])) { foreach ($package['authors'] as $author) { $name = $author['name'] ?? 'Unknown name'; if (isset($author['email'])) { $email = $author['email']; $authors[] = "$name <$email>"; } else { $authors[] = "$name"; } } } return $authors; } function fetchFileContent($fileUrl, $fileName) { $fileUrl = $fileUrl . '/' . $fileName; if ($fileUrl !== 'No URL') { $headers = @get_headers($fileUrl); if ($headers && strpos($headers[0], '200')) { return file_get_contents($fileUrl); } } return ''; } function filterUrl($url) { if (strpos($url, 'https://github.com/') === 0) { if (strpos($url, 'https://github.com/') === 0) { $url = str_replace('https://github.com/', 'https://raw.githubusercontent.com/', $url); $url .= "/main"; } else { $url = str_replace('/tree/', '/', $url); } } return $url; } function generateRawFileUrl($package) { if (isset($package['source']['type']) && $package['source']['type'] === 'git' && isset($package['source']['url']) && isset($package['source']['reference'])) { $repoUrl = $package['source']['url']; $reference = $package['source']['reference']; if (strpos($repoUrl, 'https://github.com/') === 0) { $repoUrl = str_replace('https://github.com/', 'https://raw.githubusercontent.com/', $repoUrl); $repoUrl = substr($repoUrl, 0, -4); return $repoUrl . '/' . $reference; } } return 'No URL'; } ?>