Skip to content

Commit 194f564

Browse files
committed
feat(provider): add golang + fix semver check
1 parent 6aec62a commit 194f564

File tree

5 files changed

+176
-7
lines changed

5 files changed

+176
-7
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ The packages are installed in the following directories:
110110
- [x] Install `pkg:pypi` packages
111111
- [x] Update `pkg:pypi` packages
112112
- [x] Remove `pkg:pypi` packages
113-
- [ ] Install `pkg:golang` packages
114-
- [ ] Update `pkg:golang` packages
115-
- [ ] Remove `pkg:golang` packages
113+
- [x] Install `pkg:golang` packages
114+
- [x] Update `pkg:golang` packages
115+
- [x] Remove `pkg:golang` packages
116116
- [ ] Install `pkg:cargo` packages
117117
- [ ] Update `pkg:cargo` packages
118118
- [ ] Remove `pkg:cargo` packages

internal/lib/semver/root.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package semver
22

33
import (
4-
"fmt"
4+
"log"
55
"strconv"
66
"strings"
77
)
88

9+
func trimVersion(version string) string {
10+
return strings.TrimPrefix(version, "v")
11+
}
12+
913
// IsGreater compares two semver version strings and
1014
// returns true if the second version is greater than the first.
1115
func IsGreater(v1, v2 string) bool {
16+
v1 = trimVersion(v1)
17+
v2 = trimVersion(v2)
1218
// Split version strings into parts (major, minor, patch)
1319
v1Parts := strings.Split(v1, ".")
1420
v2Parts := strings.Split(v2, ".")
@@ -27,9 +33,9 @@ func IsGreater(v1, v2 string) bool {
2733
v2Num, err2 := strconv.Atoi(v2Parts[i])
2834

2935
if err1 != nil || err2 != nil {
30-
fmt.Println("Invalid version format.")
31-
fmt.Println("v1: ", v1)
32-
fmt.Println("v2: ", v2)
36+
log.Println("Invalid version format.", err1, err2)
37+
log.Println("v1: ", v1)
38+
log.Println("v2: ", v2)
3339
return false
3440
}
3541

internal/lib/shell_out/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package shell_out
22

33
import (
4+
"os"
45
"os/exec"
56
)
67

78
func ShellOut(command string, args []string, dir string, env []string) (int, error) {
89
cmd := exec.Command(command, args...)
910
cmd.Dir = dir
1011
if env != nil {
12+
env = append(env, os.Environ()...)
1113
cmd.Env = append(cmd.Env, env...)
1214
}
1315
err := cmd.Run()
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package updater
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"log"
7+
"os"
8+
"path/filepath"
9+
"regexp"
10+
11+
"github.com/mistweaverco/zana-client/internal/lib/files"
12+
"github.com/mistweaverco/zana-client/internal/lib/local_packages_parser"
13+
"github.com/mistweaverco/zana-client/internal/lib/shell_out"
14+
)
15+
16+
type GolangProvider struct {
17+
APP_PACKAGES_DIR string
18+
PREFIX string
19+
}
20+
21+
func NewProviderGolang() *GolangProvider {
22+
p := &GolangProvider{}
23+
p.APP_PACKAGES_DIR = filepath.Join(files.GetAppPackagesPath(), "golang")
24+
p.PREFIX = "pkg:golang/"
25+
return p
26+
}
27+
28+
func (p *GolangProvider) getRepo(sourceID string) string {
29+
re := regexp.MustCompile("^" + p.PREFIX + "(.*)")
30+
matches := re.FindStringSubmatch(sourceID)
31+
if len(matches) > 1 {
32+
return matches[1]
33+
}
34+
return ""
35+
}
36+
37+
func (p *GolangProvider) generatePackageJSON() bool {
38+
found := false
39+
packageJSON := struct {
40+
Dependencies map[string]string `json:"dependencies"`
41+
}{
42+
Dependencies: make(map[string]string),
43+
}
44+
45+
localPackages := local_packages_parser.GetData(true).Packages
46+
for _, pkg := range localPackages {
47+
if detectProvider(pkg.SourceID) != ProviderGolang {
48+
continue
49+
}
50+
packageJSON.Dependencies[p.getRepo(pkg.SourceID)] = pkg.Version
51+
found = true
52+
}
53+
54+
filePath := filepath.Join(p.APP_PACKAGES_DIR, "package.json")
55+
file, err := os.Create(filePath)
56+
if err != nil {
57+
fmt.Println("Error creating package.json:", err)
58+
return false
59+
}
60+
defer file.Close()
61+
62+
encoder := json.NewEncoder(file)
63+
encoder.SetIndent("", " ")
64+
err = encoder.Encode(packageJSON)
65+
if err != nil {
66+
fmt.Println("Error encoding package.json:", err)
67+
return false
68+
}
69+
70+
return found
71+
}
72+
73+
func (p *GolangProvider) Clean() bool {
74+
err := os.RemoveAll(p.APP_PACKAGES_DIR)
75+
if err != nil {
76+
log.Println("Error removing directory:", err)
77+
return false
78+
}
79+
return p.Sync()
80+
}
81+
82+
func (p *GolangProvider) Sync() bool {
83+
if _, err := os.Stat(p.APP_PACKAGES_DIR); os.IsNotExist(err) {
84+
err := os.Mkdir(p.APP_PACKAGES_DIR, 0755)
85+
if err != nil {
86+
fmt.Println("Error creating directory:", err)
87+
return false
88+
}
89+
}
90+
91+
packagesFound := p.generatePackageJSON()
92+
93+
if !packagesFound {
94+
return true
95+
}
96+
97+
returnResult := true
98+
99+
filePath := filepath.Join(p.APP_PACKAGES_DIR, "package.json")
100+
packageJSON, err := os.ReadFile(filePath)
101+
if err != nil {
102+
log.Println("Error reading golang package.json:", err)
103+
return false
104+
}
105+
106+
pkgJSON := struct {
107+
Dependencies map[string]string `json:"dependencies"`
108+
}{
109+
Dependencies: make(map[string]string),
110+
}
111+
112+
err = json.Unmarshal(packageJSON, &pkgJSON)
113+
if err != nil {
114+
log.Println("Error unmarshalling golang package.json:", err)
115+
return false
116+
}
117+
118+
gobin := filepath.Join(p.APP_PACKAGES_DIR, "bin")
119+
120+
for pkg, version := range pkgJSON.Dependencies {
121+
installCode, err := shell_out.ShellOut("go", []string{
122+
"install",
123+
pkg + "@" + version,
124+
}, p.APP_PACKAGES_DIR,
125+
[]string{
126+
"GOBIN=" + gobin,
127+
})
128+
if err != nil || installCode != 0 {
129+
log.Println("Error running go install:", err)
130+
log.Println("Tried installing package:", pkg+"@"+version, "in:", gobin)
131+
returnResult = false
132+
}
133+
}
134+
135+
return returnResult
136+
}
137+
138+
func (p *GolangProvider) Install(sourceID, version string) bool {
139+
err := local_packages_parser.AddLocalPackage(sourceID, version)
140+
if err != nil {
141+
return false
142+
}
143+
return p.Sync()
144+
}
145+
146+
func (p *GolangProvider) Remove(sourceID string) bool {
147+
err := local_packages_parser.RemoveLocalPackage(sourceID)
148+
if err != nil {
149+
return false
150+
}
151+
return p.Sync()
152+
}

internal/lib/updater/root.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ type Provider int
1111
const (
1212
ProviderNPM Provider = iota
1313
ProviderPyPi
14+
ProviderGolang
1415
ProviderUnsupported
1516
)
1617

1718
var npmProvider NPMProvider = *NewProviderNPM()
1819
var pypiProvider PyPiProvider = *NewProviderPyPi()
20+
var golangProvider GolangProvider = *NewProviderGolang()
1921

2022
func detectProvider(sourceId string) Provider {
2123
var provider Provider
@@ -24,6 +26,8 @@ func detectProvider(sourceId string) Provider {
2426
provider = ProviderNPM
2527
case strings.HasPrefix(sourceId, pypiProvider.PREFIX):
2628
provider = ProviderPyPi
29+
case strings.HasPrefix(sourceId, golangProvider.PREFIX):
30+
provider = ProviderGolang
2731
default:
2832
provider = ProviderUnsupported
2933
}
@@ -42,6 +46,7 @@ func CheckIfUpdateIsAvailable(localVersion string, remoteVersion string) (bool,
4246
func SyncAll() {
4347
npmProvider.Sync()
4448
pypiProvider.Sync()
49+
golangProvider.Sync()
4550
}
4651

4752
func Install(sourceId string, version string) bool {
@@ -51,6 +56,8 @@ func Install(sourceId string, version string) bool {
5156
return npmProvider.Install(sourceId, version)
5257
case ProviderPyPi:
5358
return pypiProvider.Install(sourceId, version)
59+
case ProviderGolang:
60+
return golangProvider.Install(sourceId, version)
5461
case ProviderUnsupported:
5562
// Unsupported provider
5663
}
@@ -64,6 +71,8 @@ func Remove(sourceId string) bool {
6471
return npmProvider.Remove(sourceId)
6572
case ProviderPyPi:
6673
return pypiProvider.Remove(sourceId)
74+
case ProviderGolang:
75+
return golangProvider.Remove(sourceId)
6776
case ProviderUnsupported:
6877
// Unsupported provider
6978
}

0 commit comments

Comments
 (0)