xref: /plugin/deletepageguard/build/update-version.php (revision 9a383d51b90310842e2a3f0f9d693178d0875b32)
1*9a383d51SJohann Duscher#!/usr/bin/env php
2*9a383d51SJohann Duscher<?php
3*9a383d51SJohann Duscher/**
4*9a383d51SJohann Duscher * Version Update Script for Delete Page Guard Plugin
5*9a383d51SJohann Duscher *
6*9a383d51SJohann Duscher * Updates version information across all plugin files.
7*9a383d51SJohann Duscher * Usage: php build/update-version.php [new-version] [new-date]
8*9a383d51SJohann Duscher *
9*9a383d51SJohann Duscher * @license GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html) - see LICENSE.md
10*9a383d51SJohann Duscher * @author  Johann Duscher <jonny.dee@posteo.net>
11*9a383d51SJohann Duscher * @copyright 2025 Johann Duscher
12*9a383d51SJohann Duscher */
13*9a383d51SJohann Duscher
14*9a383d51SJohann Duscher$baseDir = dirname(__DIR__);
15*9a383d51SJohann Duscher$versionFile = $baseDir . '/version.php';
16*9a383d51SJohann Duscher
17*9a383d51SJohann Duscher// Load current version info
18*9a383d51SJohann Duscherif (!file_exists($versionFile)) {
19*9a383d51SJohann Duscher    die("Error: version.php not found\n");
20*9a383d51SJohann Duscher}
21*9a383d51SJohann Duscher
22*9a383d51SJohann Duscher$versionInfo = include $versionFile;
23*9a383d51SJohann Duscher$currentVersion = $versionInfo['version'];
24*9a383d51SJohann Duscher$currentDate = $versionInfo['date'];
25*9a383d51SJohann Duscher
26*9a383d51SJohann Duscher// Parse command line arguments
27*9a383d51SJohann Duscher$newVersion = $argv[1] ?? null;
28*9a383d51SJohann Duscher$newDate = $argv[2] ?? date('Y-m-d');
29*9a383d51SJohann Duscher
30*9a383d51SJohann Duscherif (!$newVersion) {
31*9a383d51SJohann Duscher    echo "Delete Page Guard Plugin - Version Update Script\n";
32*9a383d51SJohann Duscher    echo "Current version: {$currentVersion} ({$currentDate})\n\n";
33*9a383d51SJohann Duscher    echo "Usage: php build/update-version.php <new-version> [new-date]\n";
34*9a383d51SJohann Duscher    echo "Example: php build/update-version.php 1.1.0 2025-02-01\n";
35*9a383d51SJohann Duscher    exit(1);
36*9a383d51SJohann Duscher}
37*9a383d51SJohann Duscher
38*9a383d51SJohann Duscher// Validate version format (semantic versioning)
39*9a383d51SJohann Duscherif (!preg_match('/^\d+\.\d+\.\d+(-[a-zA-Z0-9\-\.]+)?$/', $newVersion)) {
40*9a383d51SJohann Duscher    die("Error: Invalid version format. Use semantic versioning (e.g., 1.0.0)\n");
41*9a383d51SJohann Duscher}
42*9a383d51SJohann Duscher
43*9a383d51SJohann Duscher// Validate date format
44*9a383d51SJohann Duscherif (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $newDate)) {
45*9a383d51SJohann Duscher    die("Error: Invalid date format. Use YYYY-MM-DD\n");
46*9a383d51SJohann Duscher}
47*9a383d51SJohann Duscher
48*9a383d51SJohann Duscherecho "Updating version from {$currentVersion} to {$newVersion}\n";
49*9a383d51SJohann Duscherecho "Updating date from {$currentDate} to {$newDate}\n\n";
50*9a383d51SJohann Duscher
51*9a383d51SJohann Duscher// Update version.php
52*9a383d51SJohann Duscher$newVersionInfo = $versionInfo;
53*9a383d51SJohann Duscher$newVersionInfo['version'] = $newVersion;
54*9a383d51SJohann Duscher$newVersionInfo['date'] = $newDate;
55*9a383d51SJohann Duscher
56*9a383d51SJohann Duscher$versionContent = "<?php\n/**\n * Delete Page Guard Plugin - Version Information\n *\n * Centralized version management for the plugin.\n * This file is used by build scripts to maintain consistent versioning.\n *\n * @license GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html) - see LICENSE.md\n * @author  Johann Duscher <jonny.dee@posteo.net>\n * @copyright 2025 Johann Duscher\n */\n\n// Protect against direct call, but allow build scripts\nif (!defined('DOKU_INC') && php_sapi_name() !== 'cli') die();\n\nreturn " . var_export($newVersionInfo, true) . ";\n";
57*9a383d51SJohann Duscher
58*9a383d51SJohann Duscherfile_put_contents($versionFile, $versionContent);
59*9a383d51SJohann Duscherecho "✓ Updated version.php\n";
60*9a383d51SJohann Duscher
61*9a383d51SJohann Duscher// Update plugin.info.txt
62*9a383d51SJohann Duscher$pluginInfoFile = $baseDir . '/plugin.info.txt';
63*9a383d51SJohann Duscherif (file_exists($pluginInfoFile)) {
64*9a383d51SJohann Duscher    $content = file_get_contents($pluginInfoFile);
65*9a383d51SJohann Duscher    $content = preg_replace('/^version\s+.*$/m', "version {$newVersion}", $content);
66*9a383d51SJohann Duscher    $content = preg_replace('/^date\s+.*$/m', "date    {$newDate}", $content);
67*9a383d51SJohann Duscher    file_put_contents($pluginInfoFile, $content);
68*9a383d51SJohann Duscher    echo "✓ Updated plugin.info.txt\n";
69*9a383d51SJohann Duscher}
70*9a383d51SJohann Duscher
71*9a383d51SJohann Duscher// Update CHANGELOG.md header (if it exists and is unreleased)
72*9a383d51SJohann Duscher$changelogFile = $baseDir . '/CHANGELOG.md';
73*9a383d51SJohann Duscherif (file_exists($changelogFile)) {
74*9a383d51SJohann Duscher    $content = file_get_contents($changelogFile);
75*9a383d51SJohann Duscher    // Replace [Unreleased] with actual version
76*9a383d51SJohann Duscher    if (strpos($content, '## [Unreleased]') !== false) {
77*9a383d51SJohann Duscher        $content = str_replace('## [Unreleased]', "## [{$newVersion}] - {$newDate}", $content);
78*9a383d51SJohann Duscher        file_put_contents($changelogFile, $content);
79*9a383d51SJohann Duscher        echo "✓ Updated CHANGELOG.md (marked release)\n";
80*9a383d51SJohann Duscher    } else {
81*9a383d51SJohann Duscher        echo "ℹ CHANGELOG.md - no [Unreleased] section found\n";
82*9a383d51SJohann Duscher    }
83*9a383d51SJohann Duscher}
84*9a383d51SJohann Duscher
85*9a383d51SJohann Duscher// Update dokuwiki-plugin-page.txt (plugin template)
86*9a383d51SJohann Duscher$pluginPageFile = $baseDir . '/dokuwiki-plugin-page.txt';
87*9a383d51SJohann Duscherif (file_exists($pluginPageFile)) {
88*9a383d51SJohann Duscher    $content = file_get_contents($pluginPageFile);
89*9a383d51SJohann Duscher
90*9a383d51SJohann Duscher    // Update lastupdate date
91*9a383d51SJohann Duscher    $content = preg_replace('/^lastupdate\s*:\s*\d{4}-\d{2}-\d{2}\s*$/m', "lastupdate : {$newDate}", $content);
92*9a383d51SJohann Duscher
93*9a383d51SJohann Duscher    // Update downloadurl with new version (more robust pattern)
94*9a383d51SJohann Duscher    $content = preg_replace(
95*9a383d51SJohann Duscher        '#downloadurl:\s*https://github\.com/jonnydee/deletepageguard/releases/download/v\d+\.\d+\.\d+/deletepageguard-\d+\.\d+\.\d+\.zip#',
96*9a383d51SJohann Duscher        "downloadurl: https://github.com/jonnydee/deletepageguard/releases/download/v{$newVersion}/deletepageguard-{$newVersion}.zip",
97*9a383d51SJohann Duscher        $content
98*9a383d51SJohann Duscher    );
99*9a383d51SJohann Duscher
100*9a383d51SJohann Duscher    // Update changelog section with new version entry (add at top of changelog)
101*9a383d51SJohann Duscher    $changelogEntry = "  * **{$newDate}**\n    * Release v{$newVersion}\n    * ";
102*9a383d51SJohann Duscher    if (strpos($content, "Release v{$newVersion}") === false) {
103*9a383d51SJohann Duscher        // Find the changelog section and add new entry
104*9a383d51SJohann Duscher        $content = preg_replace(
105*9a383d51SJohann Duscher            '/(===== Changelog =====.*?)(  \* \*\*\d{4}-\d{2}-\d{2}\*\*)/s',
106*9a383d51SJohann Duscher            "\$1{$changelogEntry}See CHANGELOG.md for details\n\n\$2",
107*9a383d51SJohann Duscher            $content
108*9a383d51SJohann Duscher        );
109*9a383d51SJohann Duscher    }
110*9a383d51SJohann Duscher
111*9a383d51SJohann Duscher    file_put_contents($pluginPageFile, $content);
112*9a383d51SJohann Duscher    echo "✓ Updated dokuwiki-plugin-page.txt (download URL and date)\n";
113*9a383d51SJohann Duscher}
114*9a383d51SJohann Duscher
115*9a383d51SJohann Duscherecho "\n✅ Version update completed successfully!\n";
116*9a383d51SJohann Duscherecho "\nNext steps:\n";
117*9a383d51SJohann Duscherecho "1. Review the changes\n";
118*9a383d51SJohann Duscherecho "2. Update CHANGELOG.md if needed\n";
119*9a383d51SJohann Duscherecho "3. Run 'make dist' to create distribution package\n";
120*9a383d51SJohann Duscherecho "4. Commit and tag the release\n";