From 796bc13c19cffe505b03977bda4df35948459a6f Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 30 Mar 2026 14:11:36 +0530 Subject: [PATCH] Skip spec version prompt when creating SDK releases When --release=yes, the Appwrite spec version is not needed since the release flow uses the SDK version from config. This moves the version prompt and validation behind a !$createRelease guard and hoists the release block before the spec/SDK generation setup. --- src/Appwrite/Platform/Tasks/SDKs.php | 284 ++++++++++++++------------- 1 file changed, 146 insertions(+), 138 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index ab6528cfe2..63cab94017 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -102,7 +102,6 @@ class SDKs extends Action } else { $sdks = explode(',', $sdks); } - $version ??= Console::confirm('Choose an Appwrite version'); $createRelease = ($release === 'yes'); $commitRelease = ($commit === 'yes'); @@ -118,30 +117,34 @@ class SDKs extends Action $prUrls = []; } - if (! \in_array($version, [ - '0.6.x', - '0.7.x', - '0.8.x', - '0.9.x', - '0.10.x', - '0.11.x', - '0.12.x', - '0.13.x', - '0.14.x', - '0.15.x', - '1.0.x', - '1.1.x', - '1.2.x', - '1.3.x', - '1.4.x', - '1.5.x', - '1.6.x', - '1.7.x', - '1.8.x', - '1.9.x', - 'latest', - ])) { - throw new \Exception('Unknown version given'); + if (! $createRelease) { + $version ??= Console::confirm('Choose an Appwrite version'); + + if (! \in_array($version, [ + '0.6.x', + '0.7.x', + '0.8.x', + '0.9.x', + '0.10.x', + '0.11.x', + '0.12.x', + '0.13.x', + '0.14.x', + '0.15.x', + '1.0.x', + '1.1.x', + '1.2.x', + '1.3.x', + '1.4.x', + '1.5.x', + '1.6.x', + '1.7.x', + '1.8.x', + '1.9.x', + 'latest', + ])) { + throw new \Exception('Unknown version given'); + } } $selectedPlatforms = ($selectedPlatform === '*' || $selectedPlatform === null) ? null : \array_map('trim', \explode(',', $selectedPlatform)); @@ -173,6 +176,124 @@ class SDKs extends Action } Console::log(''); + + if ($createRelease && ! $examplesOnly) { + Console::info("━━━ {$language['name']} SDK ({$platform['name']}, {$language['version']}) ━━━"); + $changelog = $language['changelog'] ?? ''; + $changelog = ($changelog) ? \file_get_contents($changelog) : '# Change Log'; + + $repoName = $language['gitUserName'] . '/' . $language['gitRepoName']; + $releaseVersion = $language['version']; + $releaseNotes = $this->extractReleaseNotes($changelog, $releaseVersion); + + if (empty($releaseNotes)) { + $releaseNotes = "Release version {$releaseVersion}"; + } + + $releaseTitle = $releaseVersion; + $releaseTarget = $language['repoBranch'] ?? 'main'; + + if ($repoName === '/') { + Console::warning(' Not a releasable SDK, skipping'); + + continue; + } + + // Check if release already exists + $checkReleaseCommand = 'gh release view ' . \escapeshellarg($releaseVersion) . ' --repo ' . \escapeshellarg($repoName) . ' --json url --jq ".url" 2>/dev/null'; + $existingReleaseUrl = trim(\shell_exec($checkReleaseCommand) ?? ''); + + if (! empty($existingReleaseUrl)) { + Console::warning(" Release {$releaseVersion} already exists, skipping"); + Console::log(" {$existingReleaseUrl}"); + + continue; + } + + // Check if the latest commit on the target branch already has a release + $latestCommitCommand = 'gh api repos/' . $repoName . '/commits/' . $releaseTarget . ' --jq ".sha" 2>/dev/null'; + $latestCommitSha = trim(\shell_exec($latestCommitCommand) ?? ''); + + if (! empty($latestCommitSha)) { + $latestReleaseTagCommand = 'gh api repos/' . $repoName . '/releases --jq ".[0] | .tag_name" 2>/dev/null'; + $latestReleaseTag = trim(\shell_exec($latestReleaseTagCommand) ?? ''); + + if (! empty($latestReleaseTag)) { + $tagCommitCommand = 'gh api repos/' . $repoName . '/git/ref/tags/' . $latestReleaseTag . ' --jq ".object.sha" 2>/dev/null'; + $tagCommitSha = trim(\shell_exec($tagCommitCommand) ?? ''); + + if (! empty($tagCommitSha) && $latestCommitSha === $tagCommitSha) { + Console::warning(" Latest commit already released ({$latestReleaseTag}), skipping"); + + continue; + } + } + } + + $previousVersion = ''; + $tagListCommand = 'gh release list --repo ' . \escapeshellarg($repoName) . ' --limit 1 --json tagName --jq ".[0].tagName" 2>&1'; + $previousVersion = trim(\shell_exec($tagListCommand) ?? ''); + + $formattedNotes = "## What's Changed\n\n"; + $formattedNotes .= $releaseNotes . "\n\n"; + + if (! empty($previousVersion)) { + $formattedNotes .= '**Full Changelog**: https://github.com/' . $repoName . '/compare/' . $previousVersion . '...' . $releaseVersion; + } else { + $formattedNotes .= '**Full Changelog**: https://github.com/' . $repoName . '/releases/tag/' . $releaseVersion; + } + + if (! $commitRelease) { + Console::info(' [DRY RUN] Would create release:'); + Console::log(" Repository: {$repoName}"); + Console::log(" Version: {$releaseVersion}"); + Console::log(" Title: {$releaseTitle}"); + Console::log(" Target Branch: {$releaseTarget}"); + Console::log(' Previous Version: ' . ($previousVersion ?: 'N/A')); + Console::log(' Release Notes:'); + Console::log(' ' . str_replace("\n", "\n ", $formattedNotes)); + } else { + Console::log(" Creating release {$releaseVersion}..."); + + $tempNotesFile = \tempnam(\sys_get_temp_dir(), 'release_notes_'); + \file_put_contents($tempNotesFile, $formattedNotes); + + $releaseCommand = 'gh release create ' . \escapeshellarg($releaseVersion) . ' \ + --repo ' . \escapeshellarg($repoName) . ' \ + --title ' . \escapeshellarg($releaseTitle) . ' \ + --notes-file ' . \escapeshellarg($tempNotesFile) . ' \ + --target ' . \escapeshellarg($releaseTarget) . ' \ + 2>&1'; + + $releaseOutput = []; + $releaseReturnCode = 0; + \exec($releaseCommand, $releaseOutput, $releaseReturnCode); + + \unlink($tempNotesFile); + + if ($releaseReturnCode === 0) { + // Extract release URL from output + $releaseUrl = ''; + foreach ($releaseOutput as $line) { + if (strpos($line, 'https://github.com/') !== false) { + $releaseUrl = trim($line); + break; + } + } + + Console::success(" Release {$releaseVersion} created"); + if (! empty($releaseUrl)) { + Console::log(" {$releaseUrl}"); + } + } else { + $errorMessage = implode("\n", $releaseOutput); + Console::error(" Failed to create release: " . $errorMessage); + } + } + + continue; + } + Console::info("━━━ {$language['name']} SDK ({$platform['name']}, {$version}) ━━━"); $specFormat = $language['spec'] ?? 'swagger2'; $spec = null; @@ -330,119 +451,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND throw new \Exception('Language "' . $language['key'] . '" not supported'); } - if ($createRelease && ! $examplesOnly) { - $repoName = $language['gitUserName'] . '/' . $language['gitRepoName']; - $releaseVersion = $language['version']; - $releaseNotes = $this->extractReleaseNotes($changelog, $releaseVersion); - - if (empty($releaseNotes)) { - $releaseNotes = "Release version {$releaseVersion}"; - } - - $releaseTitle = $releaseVersion; - $releaseTarget = $language['repoBranch'] ?? 'main'; - - if ($repoName === '/') { - Console::warning(' Not a releasable SDK, skipping'); - - continue; - } - - // Check if release already exists - $checkReleaseCommand = 'gh release view ' . \escapeshellarg($releaseVersion) . ' --repo ' . \escapeshellarg($repoName) . ' --json url --jq ".url" 2>/dev/null'; - $existingReleaseUrl = trim(\shell_exec($checkReleaseCommand) ?? ''); - - if (! empty($existingReleaseUrl)) { - Console::warning(" Release {$releaseVersion} already exists, skipping"); - Console::log(" {$existingReleaseUrl}"); - - continue; - } - - // Check if the latest commit on the target branch already has a release - $latestCommitCommand = 'gh api repos/' . $repoName . '/commits/' . $releaseTarget . ' --jq ".sha" 2>/dev/null'; - $latestCommitSha = trim(\shell_exec($latestCommitCommand) ?? ''); - - if (! empty($latestCommitSha)) { - $latestReleaseTagCommand = 'gh api repos/' . $repoName . '/releases --jq ".[0] | .tag_name" 2>/dev/null'; - $latestReleaseTag = trim(\shell_exec($latestReleaseTagCommand) ?? ''); - - if (! empty($latestReleaseTag)) { - $tagCommitCommand = 'gh api repos/' . $repoName . '/git/ref/tags/' . $latestReleaseTag . ' --jq ".object.sha" 2>/dev/null'; - $tagCommitSha = trim(\shell_exec($tagCommitCommand) ?? ''); - - if (! empty($tagCommitSha) && $latestCommitSha === $tagCommitSha) { - Console::warning(" Latest commit already released ({$latestReleaseTag}), skipping"); - - continue; - } - } - } - - $previousVersion = ''; - $tagListCommand = 'gh release list --repo ' . \escapeshellarg($repoName) . ' --limit 1 --json tagName --jq ".[0].tagName" 2>&1'; - $previousVersion = trim(\shell_exec($tagListCommand) ?? ''); - - $formattedNotes = "## What's Changed\n\n"; - $formattedNotes .= $releaseNotes . "\n\n"; - - if (! empty($previousVersion)) { - $formattedNotes .= '**Full Changelog**: https://github.com/' . $repoName . '/compare/' . $previousVersion . '...' . $releaseVersion; - } else { - $formattedNotes .= '**Full Changelog**: https://github.com/' . $repoName . '/releases/tag/' . $releaseVersion; - } - - if (! $commitRelease) { - Console::info(' [DRY RUN] Would create release:'); - Console::log(" Repository: {$repoName}"); - Console::log(" Version: {$releaseVersion}"); - Console::log(" Title: {$releaseTitle}"); - Console::log(" Target Branch: {$releaseTarget}"); - Console::log(' Previous Version: ' . ($previousVersion ?: 'N/A')); - Console::log(' Release Notes:'); - Console::log(' ' . str_replace("\n", "\n ", $formattedNotes)); - } else { - Console::log(" Creating release {$releaseVersion}..."); - - $tempNotesFile = \tempnam(\sys_get_temp_dir(), 'release_notes_'); - \file_put_contents($tempNotesFile, $formattedNotes); - - $releaseCommand = 'gh release create ' . \escapeshellarg($releaseVersion) . ' \ - --repo ' . \escapeshellarg($repoName) . ' \ - --title ' . \escapeshellarg($releaseTitle) . ' \ - --notes-file ' . \escapeshellarg($tempNotesFile) . ' \ - --target ' . \escapeshellarg($releaseTarget) . ' \ - 2>&1'; - - $releaseOutput = []; - $releaseReturnCode = 0; - \exec($releaseCommand, $releaseOutput, $releaseReturnCode); - - \unlink($tempNotesFile); - - if ($releaseReturnCode === 0) { - // Extract release URL from output - $releaseUrl = ''; - foreach ($releaseOutput as $line) { - if (strpos($line, 'https://github.com/') !== false) { - $releaseUrl = trim($line); - break; - } - } - - Console::success(" Release {$releaseVersion} created"); - if (! empty($releaseUrl)) { - Console::log(" {$releaseUrl}"); - } - } else { - $errorMessage = implode("\n", $releaseOutput); - Console::error(" Failed to create release: " . $errorMessage); - } - } - - continue; - } - Console::log($examplesOnly ? ' Generating examples...' : ' Generating SDK...');