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