]> BookStack Code Mirror - bookstack/blobdiff - dev/licensing/gen-php-licenses
ZIP Imports: Added API examples, finished testing
[bookstack] / dev / licensing / gen-php-licenses
index 0c922e281d8cc74c5fbbc1446ce65969e58e6d28..79f4c2ff69631244a7c06e3d163540988c31709a 100644 (file)
@@ -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