X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/f7893598865abe24df04c3fc60e22429818709e3..refs/pull/5681/head:/dev/licensing/gen-php-licenses diff --git a/dev/licensing/gen-php-licenses b/dev/licensing/gen-php-licenses index 0c922e281..79f4c2ff6 100644 --- a/dev/licensing/gen-php-licenses +++ b/dev/licensing/gen-php-licenses @@ -4,11 +4,13 @@ // This script reads the project composer.lock file to generate // clear license details for our PHP dependencies. +declare(strict_types=1); +require "gen-licenses-shared.php"; + $rootPath = dirname(__DIR__, 2); $outputPath = "{$rootPath}/dev/licensing/php-library-licenses.txt"; $composerLock = json_decode(file_get_contents($rootPath . "/composer.lock")); $outputSeparator = "\n-----------\n"; -$warnings = []; $packages = $composerLock->packages; $packageOutput = array_map(packageToOutput(...), $packages); @@ -17,22 +19,25 @@ $licenseInfo = implode($outputSeparator, $packageOutput) . "\n"; file_put_contents($outputPath, $licenseInfo); echo "License information written to {$outputPath}\n"; -echo implode("\n", $warnings); +echo implode("\n", getWarnings()) . "\n"; function packageToOutput(stdClass $package) : string { + global $rootPath; $output = ["{$package->name}"]; $licenses = is_array($package->license) ? $package->license : [$package->license]; $output[] = "License: " . implode(' ', $licenses); - $licenseFile = findLicenseFile($package->name); + $packagePath = "{$rootPath}/vendor/{$package->name}/package.json"; + $licenseFile = findLicenseFile($package->name, $packagePath); if ($licenseFile) { - $output[] = "License File: {$licenseFile}"; + $relLicenseFile = str_replace("{$rootPath}/", '', $licenseFile); + $output[] = "License File: {$relLicenseFile}"; $copyright = findCopyright($licenseFile); if ($copyright) { $output[] = "Copyright: {$copyright}"; } else { - warn("Package {$package->name} has no copyright found in its license"); + warn("Package {$package->name}: no copyright found in its license"); } } @@ -47,50 +52,4 @@ function packageToOutput(stdClass $package) : string { } return implode("\n", $output); -} - -function findLicenseFile(string $packageName): string { - global $rootPath; - $licenseNameOptions = ['license', 'LICENSE', 'license.*', 'LICENSE.*']; - - $packagePath = "vendor/{$packageName}"; - $filePath = "{$rootPath}/{$packagePath}"; - - $foundLicenses = []; - foreach ($licenseNameOptions as $option) { - $search = glob("{$filePath}/$option"); - array_push($foundLicenses, ...$search); - } - - if (count($foundLicenses) > 1) { - warn("Package {$packagePath} has more than one license file found"); - } - - if (count($foundLicenses) > 0) { - $fileName = basename($foundLicenses[0]); - return "{$packagePath}/{$fileName}"; - } - - warn("Package {$packageName} has no license files found"); - return ''; -} - -function findCopyright(string $licenseFile): string { - $fileContents = file_get_contents($licenseFile); - $pattern = '/^.*?copyright (\(c\)|\d{4})[\s\S]*?(\n\n|\.\n)/mi'; - $matches = []; - preg_match($pattern, $fileContents, $matches); - $copyright = trim($matches[0] ?? ''); - - $emailPattern = '/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i'; - return preg_replace_callback($emailPattern, obfuscateEmail(...), $copyright); -} - -function obfuscateEmail(array $matches): string { - return preg_replace('/[^@.]/', '*', $matches[1]); -} - -function warn(string $text): void { - global $warnings; - $warnings[] = "WARN:" . $text; } \ No newline at end of file