Licensing: Updated license gen scripts to share logic
This commit is contained in:
		
							parent
							
								
									55a2a6db88
								
							
						
					
					
						commit
						ed956a4cf0
					
				|  | @ -4,10 +4,12 @@ | |||
| // 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/js-library-licenses.txt"; | ||||
| $outputSeparator = "\n-----------\n"; | ||||
| $warnings = []; | ||||
| 
 | ||||
| $packages = [ | ||||
|     ...glob("{$rootPath}/node_modules/*/package.json"), | ||||
|  | @ -20,12 +22,7 @@ $licenseInfo = implode($outputSeparator, $packageOutput) . "\n"; | |||
| file_put_contents($outputPath, $licenseInfo); | ||||
| 
 | ||||
| echo "License information written to {$outputPath}\n"; | ||||
| echo implode("\n", $warnings); | ||||
| 
 | ||||
| function dd(mixed $data): never { | ||||
|     print_r($data); | ||||
|     exit(0); | ||||
| } | ||||
| echo implode("\n", getWarnings()); | ||||
| 
 | ||||
| function packageToOutput(string $packagePath): string | ||||
| { | ||||
|  | @ -64,58 +61,3 @@ function packageToOutput(string $packagePath): string | |||
| 
 | ||||
|     return implode("\n", $output); | ||||
| } | ||||
| 
 | ||||
| function findLicenseFile(string $packageName, string $packagePath): string | ||||
| { | ||||
|     $licenseNameOptions = [ | ||||
|         'license', 'LICENSE', 'License', | ||||
|         'license.*', 'LICENSE.*', 'License.*', | ||||
|         'license-*.*', 'LICENSE-*.*', 'License-*.*', | ||||
|     ]; | ||||
|     $packageDir = dirname($packagePath); | ||||
| 
 | ||||
|     $foundLicenses = []; | ||||
|     foreach ($licenseNameOptions as $option) { | ||||
|         $search = glob("{$packageDir}/$option"); | ||||
|         array_push($foundLicenses, ...$search); | ||||
|     } | ||||
| 
 | ||||
|     if (count($foundLicenses) > 1) { | ||||
|         warn("Package {$packageName}: more than one license file found"); | ||||
|     } | ||||
| 
 | ||||
|     if (count($foundLicenses) > 0) { | ||||
|         $fileName = basename($foundLicenses[0]); | ||||
|         return "{$packageDir}/{$fileName}"; | ||||
|     } | ||||
| 
 | ||||
|     warn("Package {$packageName}: 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] ?? ''); | ||||
| 
 | ||||
|     if (str_contains($copyright, 'i.e.')) { | ||||
|         return ''; | ||||
|     } | ||||
| 
 | ||||
|     $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; | ||||
| } | ||||
|  | @ -2,3 +2,65 @@ | |||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| $warnings = []; | ||||
| 
 | ||||
| function findLicenseFile(string $packageName, string $packagePath): string | ||||
| { | ||||
|     $licenseNameOptions = [ | ||||
|         'license', 'LICENSE', 'License', | ||||
|         'license.*', 'LICENSE.*', 'License.*', | ||||
|         'license-*.*', 'LICENSE-*.*', 'License-*.*', | ||||
|     ]; | ||||
|     $packageDir = dirname($packagePath); | ||||
| 
 | ||||
|     $foundLicenses = []; | ||||
|     foreach ($licenseNameOptions as $option) { | ||||
|         $search = glob("{$packageDir}/$option"); | ||||
|         array_push($foundLicenses, ...$search); | ||||
|     } | ||||
| 
 | ||||
|     if (count($foundLicenses) > 1) { | ||||
|         warn("Package {$packageName}: more than one license file found"); | ||||
|     } | ||||
| 
 | ||||
|     if (count($foundLicenses) > 0) { | ||||
|         $fileName = basename($foundLicenses[0]); | ||||
|         return "{$packageDir}/{$fileName}"; | ||||
|     } | ||||
| 
 | ||||
|     warn("Package {$packageName}: 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] ?? ''); | ||||
| 
 | ||||
|     if (str_contains($copyright, 'i.e.')) { | ||||
|         return ''; | ||||
|     } | ||||
| 
 | ||||
|     $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; | ||||
| } | ||||
| 
 | ||||
| function getWarnings(): array | ||||
| { | ||||
|     global $warnings; | ||||
|     return $warnings; | ||||
| } | ||||
|  |  | |||
|  | @ -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()); | ||||
| 
 | ||||
| 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"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -48,49 +53,3 @@ 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; | ||||
| } | ||||
|  | @ -19,5 +19,6 @@ parameters: | |||
| 
 | ||||
|     excludePaths: | ||||
|         - ./Config/**/*.php | ||||
|         - ./dev/**/*.php | ||||
| 
 | ||||
|     checkMissingIterableValueType: false | ||||
		Loading…
	
		Reference in New Issue