Public Access
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 84259c6636 |
@@ -250,6 +250,14 @@ class ReleasePackageCli extends CliFramework
|
|||||||
}
|
}
|
||||||
$subZipPath = "{$outputDir}/{$subName}.zip";
|
$subZipPath = "{$outputDir}/{$subName}.zip";
|
||||||
|
|
||||||
|
// Use pre-built ZIP if staged in the output directory
|
||||||
|
if (file_exists($subZipPath) && filesize($subZipPath) > 0) {
|
||||||
|
$zip->addFile($subZipPath, "packages/{$subName}.zip");
|
||||||
|
$sizeKb = number_format(filesize($subZipPath) / 1024, 1);
|
||||||
|
echo " Sub-package: {$subName}.zip (pre-built, {$sizeKb} KB)\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// If sub-package is a full repo checkout (e.g. git submodule),
|
// If sub-package is a full repo checkout (e.g. git submodule),
|
||||||
// look for a source/ or src/ subdirectory containing a Joomla manifest XML
|
// look for a source/ or src/ subdirectory containing a Joomla manifest XML
|
||||||
// and zip that instead of the repo root.
|
// and zip that instead of the repo root.
|
||||||
@@ -270,6 +278,16 @@ class ReleasePackageCli extends CliFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If source dir has no manifest, the submodule may be empty.
|
||||||
|
// Try to download the pre-built release from Gitea.
|
||||||
|
$hasManifest = !empty(glob("{$subSourceDir}/*.xml") ?: []);
|
||||||
|
if (!$hasManifest && $token !== '' && $this->downloadSubmoduleRelease($root, $subName, $subZipPath, $token)) {
|
||||||
|
$zip->addFile($subZipPath, "packages/{$subName}.zip");
|
||||||
|
$sizeKb = number_format(filesize($subZipPath) / 1024, 1);
|
||||||
|
echo " Sub-package: {$subName}.zip (downloaded release, {$sizeKb} KB)\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$subZip = new \ZipArchive();
|
$subZip = new \ZipArchive();
|
||||||
if ($subZip->open($subZipPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) !== true) {
|
if ($subZip->open($subZipPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) !== true) {
|
||||||
$this->log('ERROR', "Failed to create sub-package ZIP: {$subZipPath}");
|
$this->log('ERROR', "Failed to create sub-package ZIP: {$subZipPath}");
|
||||||
@@ -527,6 +545,103 @@ class ReleasePackageCli extends CliFramework
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Download a pre-built release ZIP for a sub-package that is a git submodule
|
||||||
|
* with an empty or missing source directory.
|
||||||
|
*
|
||||||
|
* Reads .gitmodules to find the submodule's remote URL, derives the Gitea
|
||||||
|
* API path, and downloads the latest stable release asset.
|
||||||
|
*/
|
||||||
|
private function downloadSubmoduleRelease(string $root, string $subName, string $destPath, string $token): bool
|
||||||
|
{
|
||||||
|
$gitmodulesPath = "{$root}/.gitmodules";
|
||||||
|
if (!file_exists($gitmodulesPath)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$gitmodules = file_get_contents($gitmodulesPath);
|
||||||
|
if ($gitmodules === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the submodule URL by matching the subName in the path
|
||||||
|
if (!preg_match('/\[submodule\s[^\]]*\]\s*\n\s*path\s*=\s*[^\n]*' . preg_quote($subName, '/') . '\s*\n\s*url\s*=\s*(\S+)/m', $gitmodules, $matches)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$remoteUrl = preg_replace('/\.git$/', '', $matches[1]);
|
||||||
|
|
||||||
|
// Extract org/repo from the URL
|
||||||
|
if (!preg_match('#[/:]([^/]+)/([^/]+)$#', $remoteUrl, $parts)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$org = $parts[1];
|
||||||
|
$repo = $parts[2];
|
||||||
|
|
||||||
|
// Derive the Gitea API base from the remote URL
|
||||||
|
$parsed = parse_url($remoteUrl);
|
||||||
|
$scheme = $parsed['scheme'] ?? 'https';
|
||||||
|
$host = $parsed['host'] ?? '';
|
||||||
|
if ($host === '') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$apiBase = "{$scheme}://{$host}/api/v1/repos/{$org}/{$repo}";
|
||||||
|
|
||||||
|
echo " Submodule {$subName}: source empty, downloading release from {$org}/{$repo}...\n";
|
||||||
|
|
||||||
|
// Get the stable release
|
||||||
|
$result = $this->giteaApiRequest("{$apiBase}/releases/tags/stable", $token);
|
||||||
|
if ($result['data'] === null || !isset($result['data']['assets'])) {
|
||||||
|
echo " WARNING: No stable release found for {$org}/{$repo}\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the ZIP asset (not .sha256)
|
||||||
|
$downloadUrl = '';
|
||||||
|
foreach ($result['data']['assets'] as $asset) {
|
||||||
|
if (!is_array($asset)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$name = $asset['name'] ?? '';
|
||||||
|
if (str_ends_with($name, '.zip') && !str_ends_with($name, '.sha256')) {
|
||||||
|
$downloadUrl = $asset['browser_download_url'] ?? '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($downloadUrl === '') {
|
||||||
|
echo " WARNING: No ZIP asset in {$org}/{$repo} stable release\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download the ZIP
|
||||||
|
$ch = curl_init($downloadUrl);
|
||||||
|
if ($ch === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
curl_setopt_array($ch, [
|
||||||
|
CURLOPT_RETURNTRANSFER => true,
|
||||||
|
CURLOPT_FOLLOWLOCATION => true,
|
||||||
|
CURLOPT_HTTPHEADER => ["Authorization: token {$token}"],
|
||||||
|
CURLOPT_TIMEOUT => 120,
|
||||||
|
]);
|
||||||
|
$content = curl_exec($ch);
|
||||||
|
$httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
if ($httpCode < 200 || $httpCode >= 300 || !is_string($content) || $content === '') {
|
||||||
|
echo " WARNING: Download failed (HTTP {$httpCode})\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_put_contents($destPath, $content) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively add files from a directory to a ZipArchive.
|
* Recursively add files from a directory to a ZipArchive.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user