Skip to content

Commit 71bb846

Browse files
committed
perf(updater): offload version fetch to registry
1 parent cde65ae commit 71bb846

File tree

5 files changed

+13
-155
lines changed

5 files changed

+13
-155
lines changed

internal/lib/registry_parser/root.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type RegistryItemSource struct {
1919

2020
type RegistryItem struct {
2121
Name string `json:"name"`
22+
Version string `json:"version"`
2223
Description string `json:"description"`
2324
Homepage string `json:"homepage"`
2425
Licenses []string `json:"licenses"`
@@ -64,3 +65,8 @@ func GetBySourceId(sourceId string) RegistryItem {
6465
}
6566
return RegistryItem{}
6667
}
68+
69+
func GetLatestVersion(sourceId string) string {
70+
item := GetBySourceId(sourceId)
71+
return item.Version
72+
}
Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package updater
22

33
import (
4-
"encoding/json"
5-
"fmt"
6-
"io"
7-
"net/http"
84
"strings"
95

106
"github.com/charmbracelet/log"
@@ -19,59 +15,7 @@ func (g *GitHubProvider) getPackageId(sourceId string) string {
1915
return strings.Join(parts[1:], "/")
2016
}
2117

22-
// getWebUrl returns the GitHub web URL for a given source
23-
func (g *GitHubProvider) getWebUrl(sourceId string) string {
24-
return "https://github.com/" + g.getPackageId(sourceId)
25-
}
26-
27-
// getApiUrl returns the GitHub API URL for a given source
28-
func (g *GitHubProvider) getApiUrl(sourceId string) string {
29-
return "https://api.github.com/repos/" + g.getPackageId(sourceId)
30-
}
31-
3218
// Update updates a package via the GitHub provider
3319
func (g *GitHubProvider) Update(sourceId string) {
3420
log.Info("Updating via GitHub provider", "source", sourceId)
3521
}
36-
37-
func stripVersionPrefix(version string) string {
38-
return strings.TrimPrefix(version, "v")
39-
}
40-
41-
// GetLatestReleaseVersionNumber returns the latest release version number for a GitHub repository
42-
func (g *GitHubProvider) GetLatestReleaseVersionNumber(sourceId string) string {
43-
url := g.getApiUrl(sourceId) + "/releases/latest"
44-
45-
// Create an HTTP GET request
46-
resp, err := http.Get(url)
47-
if err != nil {
48-
fmt.Printf("Error making request: %v\n", err)
49-
return ""
50-
}
51-
defer resp.Body.Close()
52-
53-
// Check if the repository exists or if there was an error
54-
if resp.StatusCode != http.StatusOK {
55-
fmt.Printf("GitHub API returned status code %d\n", resp.StatusCode)
56-
return ""
57-
}
58-
59-
// Read and parse the JSON response
60-
body, err := io.ReadAll(resp.Body)
61-
if err != nil {
62-
fmt.Printf("Error reading response body: %v\n", err)
63-
return ""
64-
}
65-
66-
// Structure to hold the JSON response
67-
var release struct {
68-
TagName string `json:"tag_name"`
69-
}
70-
71-
if err := json.Unmarshal(body, &release); err != nil {
72-
fmt.Printf("Error parsing JSON: %v\n", err)
73-
return ""
74-
}
75-
76-
return stripVersionPrefix(release.TagName)
77-
}
Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package updater
22

33
import (
4-
"encoding/json"
5-
"fmt"
6-
"io"
7-
"net/http"
84
"strings"
95

106
"github.com/charmbracelet/log"
@@ -19,58 +15,6 @@ func (p *NPMProvider) getPackageId(sourceId string) string {
1915
return strings.Join(parts[1:], "/")
2016
}
2117

22-
// getWebUrl returns the NPM web URL for a given source
23-
func (p *NPMProvider) getWebUrl(sourceId string) string {
24-
return "https://github.com/" + p.getPackageId(sourceId)
25-
}
26-
27-
// getApiUrl returns the NPM API URL for a given source
28-
func (p *NPMProvider) getApiUrl(sourceId string) string {
29-
return "https://registry.npmjs.org/" + p.getPackageId(sourceId)
30-
}
31-
32-
func (p *NPMProvider) stripVersionPrefix(version string) string {
33-
return strings.TrimPrefix(version, "v")
34-
}
35-
3618
func (p *NPMProvider) Update(source string) {
3719
log.Info("Updating via NPM provider", "source", source)
3820
}
39-
40-
// GetLatestReleaseVersionNumber returns the latest release version number for a NPM package
41-
func (p *NPMProvider) GetLatestReleaseVersionNumber(sourceId string) string {
42-
url := p.getApiUrl(sourceId) + "/latest"
43-
44-
// Create an HTTP GET request
45-
resp, err := http.Get(url)
46-
if err != nil {
47-
fmt.Printf("Error making request: %v\n", err)
48-
return ""
49-
}
50-
defer resp.Body.Close()
51-
52-
// Check if the repository exists or if there was an error
53-
if resp.StatusCode != http.StatusOK {
54-
fmt.Printf("API returned status code %d\n", resp.StatusCode)
55-
return ""
56-
}
57-
58-
// Read and parse the JSON response
59-
body, err := io.ReadAll(resp.Body)
60-
if err != nil {
61-
fmt.Printf("Error reading response body: %v\n", err)
62-
return ""
63-
}
64-
65-
// Structure to hold the JSON response
66-
var release struct {
67-
Version string `json:"version"`
68-
}
69-
70-
if err := json.Unmarshal(body, &release); err != nil {
71-
fmt.Printf("Error parsing JSON: %v\n", err)
72-
return ""
73-
}
74-
75-
return p.stripVersionPrefix(release.Version)
76-
}

internal/lib/updater/root.go

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package updater
33
import (
44
"strings"
55

6+
"github.com/mistweaverco/zana-client/internal/lib/registry_parser"
67
"github.com/mistweaverco/zana-client/internal/lib/semver"
78
)
89

@@ -38,44 +39,17 @@ func detectProvider(sourceId string) Provider {
3839
return provider
3940
}
4041

41-
func GetLatestReleaseVersionNumber(sourceId string) string {
42-
provider := detectProvider(sourceId)
43-
switch provider {
44-
case ProviderGitHub:
45-
return gitHubProvider.GetLatestReleaseVersionNumber(sourceId)
46-
case ProviderNPM:
47-
return npmProvider.GetLatestReleaseVersionNumber(sourceId)
48-
case ProviderUnsupported:
49-
// Unsupported provider
50-
return ""
51-
default:
52-
return ""
53-
}
54-
}
55-
5642
// CheckIfUpdateIsAvailable checks if an update is available for a given package
5743
// and returns a boolean indicating if an update is available and the latest version number
5844
func CheckIfUpdateIsAvailable(version string, sourceId string) (bool, string) {
59-
provider := detectProvider(sourceId)
60-
switch provider {
61-
case ProviderGitHub:
62-
latestVersion := gitHubProvider.GetLatestReleaseVersionNumber(sourceId)
63-
if semver.IsGreater(version, latestVersion) {
64-
return true, latestVersion
65-
}
66-
return false, latestVersion
67-
case ProviderNPM:
68-
latestVersion := npmProvider.GetLatestReleaseVersionNumber(sourceId)
69-
if semver.IsGreater(version, latestVersion) {
70-
return true, latestVersion
71-
}
72-
return false, latestVersion
73-
case ProviderUnsupported:
74-
// Unsupported provider
75-
return false, ""
76-
default:
45+
latestVersion := registry_parser.GetLatestVersion(sourceId)
46+
if latestVersion == "" {
7747
return false, ""
7848
}
49+
if semver.IsGreater(version, latestVersion) {
50+
return true, latestVersion
51+
}
52+
return false, ""
7953
}
8054

8155
func Update(sourceId string) {

internal/lib/updater/source_parser.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,6 @@ import "strings"
44

55
type SourceParser struct{}
66

7-
func (sp *SourceParser) getLatestReleaseVersionNumber(source string) string {
8-
provider, packageId := sp.ParseSource(source)
9-
switch provider {
10-
case "github":
11-
return gitHubProvider.GetLatestReleaseVersionNumber(packageId)
12-
default:
13-
return ""
14-
}
15-
}
16-
177
func (sp *SourceParser) ParseSource(source string) (string, string) {
188
source = strings.TrimPrefix(source, "pkg:")
199
parts := strings.Split(source, "/")

0 commit comments

Comments
 (0)