Skip to content

Commit 2d59abc

Browse files
committed
fix(providers): golang provider
1 parent c73c194 commit 2d59abc

File tree

2 files changed

+88
-76
lines changed

2 files changed

+88
-76
lines changed

internal/lib/local_packages_parser/root.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func GetData(force bool) LocalPackageRoot {
6161
// GetDataForProvider returns the local packages data
6262
// for a specific provider
6363
func GetDataForProvider(provider string) LocalPackageRoot {
64-
localPackageRoot := GetData(false)
64+
localPackageRoot := GetData(true)
6565
filteredPackages := []LocalPackageItem{}
6666

6767
for _, item := range localPackageRoot.Packages {
@@ -150,4 +150,4 @@ func IsPackageInstalled(sourceId string) bool {
150150
}
151151
}
152152
return false
153-
}
153+
}

internal/lib/providers/golang_provider.go

Lines changed: 86 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ package providers
33
import (
44
"encoding/json"
55
"fmt"
6-
"log"
76
"os"
87
"path/filepath"
98
"regexp"
109
"strings"
1110

1211
"github.com/mistweaverco/zana-client/internal/lib/files"
1312
"github.com/mistweaverco/zana-client/internal/lib/local_packages_parser"
13+
"github.com/mistweaverco/zana-client/internal/lib/registry_parser"
1414
"github.com/mistweaverco/zana-client/internal/lib/shell_out"
1515
)
1616

@@ -72,90 +72,99 @@ func (p *GolangProvider) generatePackageJSON() bool {
7272
return found
7373
}
7474

75-
func (p *GolangProvider) createSymlinks() error {
75+
func (p *GolangProvider) createSymlink(sourceID string) error {
76+
registryItem := registry_parser.GetBySourceId(sourceID)
7677
golangBinDir := filepath.Join(p.APP_PACKAGES_DIR, "bin")
7778
zanaBinDir := files.GetAppBinPath()
78-
if _, err := os.Stat(golangBinDir); os.IsNotExist(err) {
79-
return nil
80-
}
81-
entries, err := os.ReadDir(golangBinDir)
82-
if err != nil {
83-
return err
79+
80+
if len(registryItem.Bin) == 0 {
81+
return fmt.Errorf("Error: no binary name found for package %s", sourceID)
8482
}
85-
for _, entry := range entries {
86-
if entry.IsDir() {
87-
continue
88-
}
89-
binaryName := entry.Name()
90-
binaryPath := filepath.Join(golangBinDir, binaryName)
91-
symlinkPath := filepath.Join(zanaBinDir, binaryName)
92-
if _, err := os.Lstat(symlinkPath); err == nil {
93-
if err := os.Remove(symlinkPath); err != nil {
94-
log.Printf("Warning: failed to remove existing symlink %s: %v", symlinkPath, err)
95-
}
83+
84+
for binName := range registryItem.Bin {
85+
symlink := filepath.Join(zanaBinDir, binName)
86+
// Remove any existing symlink with the same name to avoid conflicts
87+
if _, err := os.Lstat(symlink); err == nil {
88+
_ = os.Remove(symlink)
9689
}
97-
if err := os.Symlink(binaryPath, symlinkPath); err != nil {
98-
log.Printf("Error creating symlink for %s: %v", binaryName, err)
99-
continue
90+
binaryPath := filepath.Join(golangBinDir, binName)
91+
if _, err := os.Stat(binaryPath); os.IsNotExist(err) {
92+
return fmt.Errorf("Error: binary %s does not exist in %s", binName, golangBinDir)
10093
}
101-
if err := os.Chmod(symlinkPath, 0755); err != nil {
102-
log.Printf("Error setting executable permissions for %s: %v", binaryName, err)
94+
if err := os.Symlink(binaryPath, symlink); err != nil {
95+
return fmt.Errorf("Error creating symlink %s -> %s: %v", symlink, binaryPath, err)
10396
}
10497
}
98+
10599
return nil
106100
}
107101

108-
func (p *GolangProvider) removeAllSymlinks() error {
109-
zanaBinDir := files.GetAppBinPath()
110-
entries, err := os.ReadDir(zanaBinDir)
111-
if err != nil {
112-
return err
102+
func (p *GolangProvider) removeBin(sourceID string) error {
103+
registryItem := registry_parser.GetBySourceId(sourceID)
104+
golangBinDir := filepath.Join(p.APP_PACKAGES_DIR, "bin")
105+
106+
if len(registryItem.Bin) == 0 {
107+
return fmt.Errorf("Error: no binary name found for package %s", sourceID)
113108
}
114-
for _, entry := range entries {
115-
if entry.IsDir() {
116-
continue
117-
}
118-
symlinkPath := filepath.Join(zanaBinDir, entry.Name())
119-
if _, err := os.Lstat(symlinkPath); err == nil {
120-
if err := os.Remove(symlinkPath); err != nil {
121-
log.Printf("Warning: failed to remove symlink %s: %v", symlinkPath, err)
109+
110+
for binName := range registryItem.Bin {
111+
binPath := filepath.Join(golangBinDir, binName)
112+
if fi, err := os.Stat(binPath); err == nil && !fi.IsDir() {
113+
if err := os.Remove(binPath); err != nil {
114+
return fmt.Errorf("Error removing binary %s: %v", binPath, err)
122115
}
123116
}
124117
}
125118
return nil
126119
}
127120

128-
func (p *GolangProvider) removePackageSymlinks(packageName string) error {
121+
func (p *GolangProvider) removeSymlink(sourceID string) error {
122+
registryItem := registry_parser.GetBySourceId(sourceID)
129123
zanaBinDir := files.GetAppBinPath()
130-
binaryName := filepath.Base(packageName)
131-
symlinkPath := filepath.Join(zanaBinDir, binaryName)
132-
if _, err := os.Lstat(symlinkPath); err == nil {
133-
log.Printf("Golang Remove: Removing symlink %s for package %s", binaryName, packageName)
134-
if err := os.Remove(symlinkPath); err != nil {
135-
log.Printf("Warning: failed to remove symlink %s: %v", symlinkPath, err)
136-
}
124+
125+
if len(registryItem.Bin) == 0 {
126+
return fmt.Errorf("Error: no binary name found for package %s", sourceID)
137127
}
138-
for _, name := range []string{binaryName, "go-" + binaryName, "golang-" + binaryName} {
139-
symlinkPath := filepath.Join(zanaBinDir, name)
140-
if _, err := os.Lstat(symlinkPath); err == nil {
141-
log.Printf("Golang Remove: Removing symlink %s for package %s", name, packageName)
142-
if err := os.Remove(symlinkPath); err != nil {
143-
log.Printf("Warning: failed to remove symlink %s: %v", symlinkPath, err)
128+
129+
for binName := range registryItem.Bin {
130+
symlink := filepath.Join(zanaBinDir, binName)
131+
if _, err := os.Lstat(symlink); err == nil {
132+
if err := os.Remove(symlink); err != nil {
133+
return fmt.Errorf("Error removing symlink %s: %v", symlink, err)
144134
}
145135
}
146136
}
147137
return nil
148138
}
149139

150140
func (p *GolangProvider) Clean() bool {
151-
if err := p.removeAllSymlinks(); err != nil {
152-
log.Printf("Error removing symlinks: %v", err)
141+
data := local_packages_parser.GetDataForProvider("golang")
142+
if len(data.Packages) == 0 {
143+
Logger.Debug("Golang Clean: No packages to clean")
144+
return true
153145
}
154-
if err := os.RemoveAll(p.APP_PACKAGES_DIR); err != nil {
155-
log.Println("Error removing directory:", err)
156-
return false
146+
Logger.Debug("Golang Clean: Cleaning up packages")
147+
for _, pkg := range data.Packages {
148+
name := p.getRepo(pkg.SourceID)
149+
Logger.Debug(fmt.Sprintf("Golang Clean: Removing package %s", name))
150+
if err := p.removeSymlink(pkg.SourceID); err != nil {
151+
Logger.Error(fmt.Sprintf("Error removing symlink for package %s: %v", name, err))
152+
}
153+
for bin := range registry_parser.GetBySourceId(pkg.SourceID).Bin {
154+
binPath := filepath.Join(p.APP_PACKAGES_DIR, "bin", bin)
155+
if fi, err := os.Stat(binPath); err == nil && !fi.IsDir() {
156+
if err := os.Remove(binPath); err != nil {
157+
Logger.Error(fmt.Sprintf("Error removing binary %s: %v", binPath, err))
158+
}
159+
}
160+
}
161+
if err := local_packages_parser.RemoveLocalPackage(pkg.SourceID); err != nil {
162+
Logger.Error(fmt.Sprintf("Error removing package %s from local packages: %v", name, err))
163+
return false
164+
}
165+
Logger.Debug(fmt.Sprintf("Golang Clean: Package %s removed from local packages", name))
157166
}
158-
return p.Sync()
167+
return true
159168
}
160169

161170
func (p *GolangProvider) checkGoAvailable() bool {
@@ -171,20 +180,20 @@ func (p *GolangProvider) Sync() bool {
171180
}
172181
}
173182
if !p.checkGoAvailable() {
174-
log.Println("Error: Go is not available. Please install Go and ensure it's in your PATH.")
183+
Logger.Error("Golang Sync: Go is not available. Please install Go and ensure it's in your PATH.")
175184
return false
176185
}
177186
packagesFound := p.generatePackageJSON()
178187
if !packagesFound {
179188
return true
180189
}
181-
log.Printf("Golang Sync: Starting sync process")
190+
Logger.Info("Golang Sync: Generating package.json")
182191
desired := local_packages_parser.GetDataForProvider("golang").Packages
183192
goModPath := filepath.Join(p.APP_PACKAGES_DIR, "go.mod")
184193
if _, err := os.Stat(goModPath); os.IsNotExist(err) {
185194
initCode, err := shell_out.ShellOut("go", []string{"mod", "init", "zana-golang-packages"}, p.APP_PACKAGES_DIR, nil)
186195
if err != nil || initCode != 0 {
187-
log.Println("Error initializing Go module:", err)
196+
Logger.Error(fmt.Sprintf("Error initializing Go module: %v", err))
188197
return false
189198
}
190199
}
@@ -200,23 +209,23 @@ func (p *GolangProvider) Sync() bool {
200209
installed = true
201210
}
202211
if !installed {
203-
log.Printf("Golang Sync: Installing package %s@%s", name, pkg.Version)
212+
Logger.Info(fmt.Sprintf("Golang Sync: Package %s@%s not installed, installing...", name, pkg.Version))
204213
installCode, err := shell_out.ShellOut("go", []string{"install", name + "@" + pkg.Version}, p.APP_PACKAGES_DIR, []string{"GOBIN=" + gobin})
205214
if err != nil || installCode != 0 {
206-
log.Printf("Error installing %s@%s: %v", name, pkg.Version, err)
215+
Logger.Error(fmt.Sprintf("Error installing %s@%s: %v", name, pkg.Version, err))
207216
allOk = false
208217
} else {
209218
installedCount++
210-
if err := p.createSymlinks(); err != nil {
211-
log.Printf("Error creating symlinks for %s: %v", name, err)
219+
if err := p.createSymlink(pkg.SourceID); err != nil {
220+
Logger.Error(fmt.Sprintf("Error creating symlinks for %s: %v", name, err))
212221
}
213222
}
214223
} else {
215-
log.Printf("Golang Sync: Package %s@%s already installed, skipping", name, pkg.Version)
224+
Logger.Info(fmt.Sprintf("Golang Sync: Package %s@%s already installed, skipping", name, pkg.Version))
216225
skippedCount++
217226
}
218227
}
219-
log.Printf("Golang Sync: Completed - %d packages installed, %d packages skipped", installedCount, skippedCount)
228+
Logger.Debug(fmt.Sprintf("Golang Sync: %d packages installed, %d packages skipped", installedCount, skippedCount))
220229
return allOk
221230
}
222231

@@ -237,30 +246,33 @@ func (p *GolangProvider) Install(sourceID, version string) bool {
237246

238247
func (p *GolangProvider) Remove(sourceID string) bool {
239248
packageName := p.getRepo(sourceID)
240-
log.Printf("Golang Remove: Removing package %s", packageName)
241-
if err := p.removePackageSymlinks(packageName); err != nil {
242-
log.Printf("Error removing symlinks for %s: %v", packageName, err)
249+
Logger.Debug(fmt.Sprintf("Golang Remove: Removing package %s", packageName))
250+
if err := p.removeSymlink(sourceID); err != nil {
251+
Logger.Error(fmt.Sprintf("Error removing symlinks for package %s: %v", packageName, err))
252+
}
253+
if err := p.removeBin(sourceID); err != nil {
254+
Logger.Error(fmt.Sprintf("Error removing binaries for package %s: %v", packageName, err))
243255
}
244256
if err := local_packages_parser.RemoveLocalPackage(sourceID); err != nil {
245-
log.Printf("Error removing package %s from local packages: %v", packageName, err)
257+
Logger.Error(fmt.Sprintf("Error removing package %s from local packages: %v", packageName, err))
246258
return false
247259
}
248-
log.Printf("Golang Remove: Package %s removed successfully", packageName)
260+
Logger.Debug(fmt.Sprintf("Golang Remove: Package %s removed from local packages", packageName))
249261
return p.Sync()
250262
}
251263

252264
func (p *GolangProvider) Update(sourceID string) bool {
253265
repo := p.getRepo(sourceID)
254266
if repo == "" {
255-
log.Printf("Invalid source ID format for Golang provider")
267+
Logger.Error("Golang Update: Invalid source ID format")
256268
return false
257269
}
258270
latestVersion, err := p.getLatestVersion(repo)
259271
if err != nil {
260-
log.Printf("Error getting latest version for %s: %v", repo, err)
272+
Logger.Error(fmt.Sprintf("Error getting latest version for package %s: %v", repo, err))
261273
return false
262274
}
263-
log.Printf("Golang Update: Updating %s to version %s", repo, latestVersion)
275+
Logger.Debug(fmt.Sprintf("Golang Update: Latest version for %s is %s", repo, latestVersion))
264276
return p.Install(sourceID, latestVersion)
265277
}
266278

0 commit comments

Comments
 (0)