From f0aa2c3034db78ffb943353be5f83f8a5f4b94df Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 4 Jun 2026 12:14:29 -0500 Subject: [PATCH] fix(updateserver): extract version from asset filename, omit client for packages - Version now extracted from the zip asset filename first (most accurate), falling back to tag name then release title. Fixes mismatch where title version was updated but asset was stale. - Omit element for package extension types (packages manage their own sub-extension clients per Joomla spec). - Make Client field omitempty so empty string doesn't render empty tag. Co-Authored-By: Claude Opus 4.6 (1M context) --- services/updateserver/joomla.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/services/updateserver/joomla.go b/services/updateserver/joomla.go index 9d8e7fad5b..0d7ffd3bec 100644 --- a/services/updateserver/joomla.go +++ b/services/updateserver/joomla.go @@ -37,7 +37,7 @@ type xmlUpdate struct { TargetPlatform xmlTargetPlat `xml:"targetplatform"` SHA256 string `xml:"sha256,omitempty"` SHA512 string `xml:"sha512,omitempty"` - Client string `xml:"client"` + Client string `xml:"client,omitempty"` PHPMinimum string `xml:"php_minimum,omitempty"` Description string `xml:"description,omitempty"` CreationDate string `xml:"creationDate,omitempty"` @@ -286,7 +286,15 @@ func GenerateJoomlaXML(ctx context.Context, repo *repo_model.Repository, require downloadURL = fmt.Sprintf("%s/archive/%s.zip", repoLink, rel.TagName) } - version := extractVersion(rel.TagName) + // Extract version from the asset filename first (most accurate), + // then fall back to tag name, then release title. + version := "" + if zipName != "" { + version = extractVersion(zipName) + } + if version == "" { + version = extractVersion(rel.TagName) + } // If the tag is a stream name (not a version), try the release title instead. if version == "" || isStreamName(rel.TagName, streams) { version = extractVersion(rel.Title) @@ -313,12 +321,19 @@ func GenerateJoomlaXML(ctx context.Context, repo *repo_model.Repository, require infoURL = cfg.InfoURL } + // Joomla element: only relevant for plugins/modules (site vs administrator). + // Packages manage their own sub-extension clients; omit for package type. + client := "site" + if extType == "package" { + client = "" + } + u := xmlUpdate{ Name: displayName, Description: desc, Element: element, Type: extType, - Client: "site", + Client: client, Version: version, CreationDate: time.Unix(int64(rel.CreatedUnix), 0).Format("2006-01-02"), InfoURL: xmlInfoURL{ -- 2.52.0