@@ -3,14 +3,14 @@ package providers
3
3
import (
4
4
"encoding/json"
5
5
"fmt"
6
- "log"
7
6
"os"
8
7
"path/filepath"
9
8
"regexp"
10
9
"strings"
11
10
12
11
"github.com/mistweaverco/zana-client/internal/lib/files"
13
12
"github.com/mistweaverco/zana-client/internal/lib/local_packages_parser"
13
+ "github.com/mistweaverco/zana-client/internal/lib/registry_parser"
14
14
"github.com/mistweaverco/zana-client/internal/lib/shell_out"
15
15
)
16
16
@@ -72,90 +72,99 @@ func (p *GolangProvider) generatePackageJSON() bool {
72
72
return found
73
73
}
74
74
75
- func (p * GolangProvider ) createSymlinks () error {
75
+ func (p * GolangProvider ) createSymlink (sourceID string ) error {
76
+ registryItem := registry_parser .GetBySourceId (sourceID )
76
77
golangBinDir := filepath .Join (p .APP_PACKAGES_DIR , "bin" )
77
78
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 )
84
82
}
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 )
96
89
}
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 )
100
93
}
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 )
103
96
}
104
97
}
98
+
105
99
return nil
106
100
}
107
101
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 )
113
108
}
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 )
122
115
}
123
116
}
124
117
}
125
118
return nil
126
119
}
127
120
128
- func (p * GolangProvider ) removePackageSymlinks (packageName string ) error {
121
+ func (p * GolangProvider ) removeSymlink (sourceID string ) error {
122
+ registryItem := registry_parser .GetBySourceId (sourceID )
129
123
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 )
137
127
}
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 )
144
134
}
145
135
}
146
136
}
147
137
return nil
148
138
}
149
139
150
140
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
153
145
}
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 ))
157
166
}
158
- return p . Sync ()
167
+ return true
159
168
}
160
169
161
170
func (p * GolangProvider ) checkGoAvailable () bool {
@@ -171,20 +180,20 @@ func (p *GolangProvider) Sync() bool {
171
180
}
172
181
}
173
182
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." )
175
184
return false
176
185
}
177
186
packagesFound := p .generatePackageJSON ()
178
187
if ! packagesFound {
179
188
return true
180
189
}
181
- log . Printf ("Golang Sync: Starting sync process " )
190
+ Logger . Info ("Golang Sync: Generating package.json " )
182
191
desired := local_packages_parser .GetDataForProvider ("golang" ).Packages
183
192
goModPath := filepath .Join (p .APP_PACKAGES_DIR , "go.mod" )
184
193
if _ , err := os .Stat (goModPath ); os .IsNotExist (err ) {
185
194
initCode , err := shell_out .ShellOut ("go" , []string {"mod" , "init" , "zana-golang-packages" }, p .APP_PACKAGES_DIR , nil )
186
195
if err != nil || initCode != 0 {
187
- log . Println ( "Error initializing Go module:" , err )
196
+ Logger . Error ( fmt . Sprintf ( "Error initializing Go module: %v " , err ) )
188
197
return false
189
198
}
190
199
}
@@ -200,23 +209,23 @@ func (p *GolangProvider) Sync() bool {
200
209
installed = true
201
210
}
202
211
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 ) )
204
213
installCode , err := shell_out .ShellOut ("go" , []string {"install" , name + "@" + pkg .Version }, p .APP_PACKAGES_DIR , []string {"GOBIN=" + gobin })
205
214
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 ) )
207
216
allOk = false
208
217
} else {
209
218
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 ) )
212
221
}
213
222
}
214
223
} 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 ) )
216
225
skippedCount ++
217
226
}
218
227
}
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 ) )
220
229
return allOk
221
230
}
222
231
@@ -237,30 +246,33 @@ func (p *GolangProvider) Install(sourceID, version string) bool {
237
246
238
247
func (p * GolangProvider ) Remove (sourceID string ) bool {
239
248
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 ))
243
255
}
244
256
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 ) )
246
258
return false
247
259
}
248
- log . Printf ( "Golang Remove: Package %s removed successfully " , packageName )
260
+ Logger . Debug ( fmt . Sprintf ( "Golang Remove: Package %s removed from local packages " , packageName ) )
249
261
return p .Sync ()
250
262
}
251
263
252
264
func (p * GolangProvider ) Update (sourceID string ) bool {
253
265
repo := p .getRepo (sourceID )
254
266
if repo == "" {
255
- log . Printf ( " Invalid source ID format for Golang provider " )
267
+ Logger . Error ( "Golang Update: Invalid source ID format" )
256
268
return false
257
269
}
258
270
latestVersion , err := p .getLatestVersion (repo )
259
271
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 ) )
261
273
return false
262
274
}
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 ) )
264
276
return p .Install (sourceID , latestVersion )
265
277
}
266
278
0 commit comments