1*9a383d51SJohann Duscher<?php 2*9a383d51SJohann Duscher/** 3*9a383d51SJohann Duscher * Distribution Creator for Delete Page Guard Plugin 4*9a383d51SJohann Duscher * 5*9a383d51SJohann Duscher * Creates a distribution directory for DokuWiki plugin installation. 6*9a383d51SJohann Duscher * You can manually ZIP this directory later for upload. 7*9a383d51SJohann Duscher * 8*9a383d51SJohann Duscher * @license GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html) 9*9a383d51SJohann Duscher * @author Johann Duscher <jonny.dee@posteo.net> 10*9a383d51SJohann Duscher */ 11*9a383d51SJohann Duscher 12*9a383d51SJohann Duscher// Change to project root directory 13*9a383d51SJohann Duscherchdir(__DIR__ . '/..'); 14*9a383d51SJohann Duscher 15*9a383d51SJohann Duscher// Load version information 16*9a383d51SJohann Duscher$version_info = include 'version.php'; 17*9a383d51SJohann Duscher$version = $version_info['version']; 18*9a383d51SJohann Duscher$distDir = 'dist/deletepageguard-' . $version; 19*9a383d51SJohann Duscher$pluginDirName = 'deletepageguard'; // Must match 'base' in plugin.info.txt 20*9a383d51SJohann Duscher 21*9a383d51SJohann Duscherecho "Creating distribution package for version $version...\n"; 22*9a383d51SJohann Duscher 23*9a383d51SJohann Duscher// Files and directories to include 24*9a383d51SJohann Duscher$files = [ 25*9a383d51SJohann Duscher 'action.php', 26*9a383d51SJohann Duscher 'admin.php', 27*9a383d51SJohann Duscher 'plugin.info.txt', 28*9a383d51SJohann Duscher 'LICENSE.md', 29*9a383d51SJohann Duscher 'README.md', 30*9a383d51SJohann Duscher 'CHANGELOG.md', 31*9a383d51SJohann Duscher 'conf/', 32*9a383d51SJohann Duscher 'lang/' 33*9a383d51SJohann Duscher]; 34*9a383d51SJohann Duscher 35*9a383d51SJohann Duscher// Create dist directory structure 36*9a383d51SJohann Duscher$targetDir = $distDir . '/' . $pluginDirName; 37*9a383d51SJohann Duscherif (!is_dir($targetDir)) { 38*9a383d51SJohann Duscher mkdir($targetDir, 0755, true); 39*9a383d51SJohann Duscher} 40*9a383d51SJohann Duscher 41*9a383d51SJohann Duscher// Copy files to distribution directory 42*9a383d51SJohann Duscherfunction copyFileOrDir($source, $dest) { 43*9a383d51SJohann Duscher // Normalize paths for Windows 44*9a383d51SJohann Duscher $source = rtrim(str_replace('\\', '/', $source), '/'); 45*9a383d51SJohann Duscher $dest = rtrim(str_replace('\\', '/', $dest), '/'); 46*9a383d51SJohann Duscher 47*9a383d51SJohann Duscher if (is_file($source)) { 48*9a383d51SJohann Duscher $destDir = dirname($dest); 49*9a383d51SJohann Duscher if (!is_dir($destDir)) { 50*9a383d51SJohann Duscher mkdir($destDir, 0755, true); 51*9a383d51SJohann Duscher } 52*9a383d51SJohann Duscher copy($source, $dest); 53*9a383d51SJohann Duscher return true; 54*9a383d51SJohann Duscher } elseif (is_dir($source)) { 55*9a383d51SJohann Duscher if (!is_dir($dest)) { 56*9a383d51SJohann Duscher mkdir($dest, 0755, true); 57*9a383d51SJohann Duscher } 58*9a383d51SJohann Duscher 59*9a383d51SJohann Duscher $sourceLen = strlen($source); 60*9a383d51SJohann Duscher $iterator = new RecursiveIteratorIterator( 61*9a383d51SJohann Duscher new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), 62*9a383d51SJohann Duscher RecursiveIteratorIterator::SELF_FIRST 63*9a383d51SJohann Duscher ); 64*9a383d51SJohann Duscher 65*9a383d51SJohann Duscher foreach ($iterator as $fileObj) { 66*9a383d51SJohann Duscher // Normalize and get relative path 67*9a383d51SJohann Duscher $currentPath = str_replace('\\', '/', $fileObj->getPathname()); 68*9a383d51SJohann Duscher $relativePath = substr($currentPath, $sourceLen + 1); 69*9a383d51SJohann Duscher $destPath = $dest . '/' . $relativePath; 70*9a383d51SJohann Duscher 71*9a383d51SJohann Duscher if ($fileObj->isDir()) { 72*9a383d51SJohann Duscher if (!is_dir($destPath)) { 73*9a383d51SJohann Duscher mkdir($destPath, 0755, true); 74*9a383d51SJohann Duscher } 75*9a383d51SJohann Duscher } elseif ($fileObj->isFile()) { 76*9a383d51SJohann Duscher $destDir = dirname($destPath); 77*9a383d51SJohann Duscher if (!is_dir($destDir)) { 78*9a383d51SJohann Duscher mkdir($destDir, 0755, true); 79*9a383d51SJohann Duscher } 80*9a383d51SJohann Duscher copy($currentPath, $destPath); 81*9a383d51SJohann Duscher } 82*9a383d51SJohann Duscher } 83*9a383d51SJohann Duscher return true; 84*9a383d51SJohann Duscher } 85*9a383d51SJohann Duscher return false; 86*9a383d51SJohann Duscher} 87*9a383d51SJohann Duscher 88*9a383d51SJohann Duscher// Copy all files 89*9a383d51SJohann Duscher$fileCount = 0; 90*9a383d51SJohann Duscherforeach ($files as $file) { 91*9a383d51SJohann Duscher if (!file_exists($file)) { 92*9a383d51SJohann Duscher echo "⚠ Warning: File not found: $file\n"; 93*9a383d51SJohann Duscher continue; 94*9a383d51SJohann Duscher } 95*9a383d51SJohann Duscher 96*9a383d51SJohann Duscher $destPath = $targetDir . '/' . $file; 97*9a383d51SJohann Duscher if (copyFileOrDir($file, $destPath)) { 98*9a383d51SJohann Duscher echo "✓ Copied: $file\n"; 99*9a383d51SJohann Duscher $fileCount++; 100*9a383d51SJohann Duscher } 101*9a383d51SJohann Duscher} 102*9a383d51SJohann Duscher 103*9a383d51SJohann Duscherecho "\n✅ Successfully created distribution directory!\n"; 104*9a383d51SJohann Duscherecho " Location: $distDir/\n"; 105*9a383d51SJohann Duscherecho " Plugin directory: $pluginDirName/\n"; 106*9a383d51SJohann Duscherecho " Files copied: $fileCount\n"; 107*9a383d51SJohann Duscher 108*9a383d51SJohann Duscherecho "\n Next steps:\n"; 109*9a383d51SJohann Duscherecho " 1. Review the contents in: $distDir/\n"; 110*9a383d51SJohann Duscherecho " 2. Create ZIP file manually:\n"; 111*9a383d51SJohann Duscherecho " cd dist && zip -r deletepageguard-$version.zip deletepageguard-$version/\n"; 112*9a383d51SJohann Duscherecho " 3. Upload to GitHub Release or DokuWiki Extension Manager\n"; 113