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 | // This script reads the project composer.lock file to generate | ||||||
| // clear license details for our PHP dependencies. | // clear license details for our PHP dependencies. | ||||||
| 
 | 
 | ||||||
|  | declare(strict_types=1); | ||||||
|  | require "gen-licenses-shared.php"; | ||||||
|  | 
 | ||||||
| $rootPath = dirname(__DIR__, 2); | $rootPath = dirname(__DIR__, 2); | ||||||
| $outputPath = "{$rootPath}/dev/licensing/js-library-licenses.txt"; | $outputPath = "{$rootPath}/dev/licensing/js-library-licenses.txt"; | ||||||
| $outputSeparator = "\n-----------\n"; | $outputSeparator = "\n-----------\n"; | ||||||
| $warnings = []; |  | ||||||
| 
 | 
 | ||||||
| $packages = [ | $packages = [ | ||||||
|     ...glob("{$rootPath}/node_modules/*/package.json"), |     ...glob("{$rootPath}/node_modules/*/package.json"), | ||||||
|  | @ -20,12 +22,7 @@ $licenseInfo = implode($outputSeparator, $packageOutput) . "\n"; | ||||||
| file_put_contents($outputPath, $licenseInfo); | file_put_contents($outputPath, $licenseInfo); | ||||||
| 
 | 
 | ||||||
| echo "License information written to {$outputPath}\n"; | echo "License information written to {$outputPath}\n"; | ||||||
| echo implode("\n", $warnings); | echo implode("\n", getWarnings()); | ||||||
| 
 |  | ||||||
| function dd(mixed $data): never { |  | ||||||
|     print_r($data); |  | ||||||
|     exit(0); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| function packageToOutput(string $packagePath): string | function packageToOutput(string $packagePath): string | ||||||
| { | { | ||||||
|  | @ -64,58 +61,3 @@ function packageToOutput(string $packagePath): string | ||||||
| 
 | 
 | ||||||
|     return implode("\n", $output); |     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); | 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 | // This script reads the project composer.lock file to generate | ||||||
| // clear license details for our PHP dependencies. | // clear license details for our PHP dependencies. | ||||||
| 
 | 
 | ||||||
|  | declare(strict_types=1); | ||||||
|  | require "gen-licenses-shared.php"; | ||||||
|  | 
 | ||||||
| $rootPath = dirname(__DIR__, 2); | $rootPath = dirname(__DIR__, 2); | ||||||
| $outputPath = "{$rootPath}/dev/licensing/php-library-licenses.txt"; | $outputPath = "{$rootPath}/dev/licensing/php-library-licenses.txt"; | ||||||
| $composerLock = json_decode(file_get_contents($rootPath . "/composer.lock")); | $composerLock = json_decode(file_get_contents($rootPath . "/composer.lock")); | ||||||
| $outputSeparator = "\n-----------\n"; | $outputSeparator = "\n-----------\n"; | ||||||
| $warnings = []; |  | ||||||
| 
 | 
 | ||||||
| $packages = $composerLock->packages; | $packages = $composerLock->packages; | ||||||
| $packageOutput = array_map(packageToOutput(...), $packages); | $packageOutput = array_map(packageToOutput(...), $packages); | ||||||
|  | @ -17,22 +19,25 @@ $licenseInfo =  implode($outputSeparator, $packageOutput) . "\n"; | ||||||
| file_put_contents($outputPath, $licenseInfo); | file_put_contents($outputPath, $licenseInfo); | ||||||
| 
 | 
 | ||||||
| echo "License information written to {$outputPath}\n"; | echo "License information written to {$outputPath}\n"; | ||||||
| echo implode("\n", $warnings); | echo implode("\n", getWarnings()); | ||||||
| 
 | 
 | ||||||
| function packageToOutput(stdClass $package) : string { | function packageToOutput(stdClass $package) : string { | ||||||
|  |     global $rootPath; | ||||||
|     $output = ["{$package->name}"]; |     $output = ["{$package->name}"]; | ||||||
| 
 | 
 | ||||||
|     $licenses = is_array($package->license) ? $package->license : [$package->license]; |     $licenses = is_array($package->license) ? $package->license : [$package->license]; | ||||||
|     $output[] = "License: " . implode(' ', $licenses); |     $output[] = "License: " . implode(' ', $licenses); | ||||||
| 
 | 
 | ||||||
|     $licenseFile = findLicenseFile($package->name); |     $packagePath = "{$rootPath}/vendor/{$package->name}/package.json"; | ||||||
|  |     $licenseFile = findLicenseFile($package->name, $packagePath); | ||||||
|     if ($licenseFile) { |     if ($licenseFile) { | ||||||
|         $output[] = "License File: {$licenseFile}"; |         $relLicenseFile = str_replace("{$rootPath}/", '', $licenseFile); | ||||||
|  |         $output[] = "License File: {$relLicenseFile}"; | ||||||
|         $copyright = findCopyright($licenseFile); |         $copyright = findCopyright($licenseFile); | ||||||
|         if ($copyright) { |         if ($copyright) { | ||||||
|             $output[] = "Copyright: {$copyright}"; |             $output[] = "Copyright: {$copyright}"; | ||||||
|         } else { |         } 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); |     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: |     excludePaths: | ||||||
|         - ./Config/**/*.php |         - ./Config/**/*.php | ||||||
|  |         - ./dev/**/*.php | ||||||
| 
 | 
 | ||||||
|     checkMissingIterableValueType: false |     checkMissingIterableValueType: false | ||||||
		Loading…
	
		Reference in New Issue