github.com/octohelm/cuekit@v0.0.0-20240424021256-e7df8d743066/pkg/mod/modmem/registry.go (about) 1 package modmem 2 3 import ( 4 "fmt" 5 "github.com/octohelm/cuekit/pkg/mod/modfile" 6 "io" 7 "io/fs" 8 "os" 9 "path/filepath" 10 11 "github.com/octohelm/cuekit/pkg/mod/module" 12 "github.com/pkg/errors" 13 ) 14 15 var DefaultRegistry = Registry{} 16 17 type Registry map[string]*Module 18 19 func (r Registry) Register(m *Module) { 20 r[m.Module] = m 21 } 22 23 func (r Registry) Dump(cacheDir string) error { 24 for _, m := range r { 25 if err := r.dumpModuleToCache(cacheDir, m); err != nil { 26 return err 27 } 28 } 29 return nil 30 } 31 32 func (r Registry) Resolve(mpath string) (*module.Module, bool) { 33 path := module.BasePath(mpath) 34 35 for p, m := range r { 36 if module.BasePath(p) == path { 37 return &module.Module{ 38 File: m.File, 39 Overwrites: &modfile.FileOverwrites{ 40 Version: m.Version, 41 }, 42 }, true 43 } 44 } 45 return nil, false 46 } 47 48 func (r Registry) dumpModuleToCache(cacheDir string, m *Module) error { 49 dist := r.CacheDir(cacheDir, m.Module, m.Version) 50 51 if err := os.RemoveAll(dist); err != nil { 52 return errors.Wrapf(err, "clean dest failed: %s", dist) 53 } 54 55 return fs.WalkDir(m.FS, ".", func(path string, d fs.DirEntry, err error) error { 56 if d.IsDir() { 57 return os.MkdirAll(filepath.Join(dist, path), os.ModePerm) 58 } 59 src, err := m.FS.Open(path) 60 if err != nil { 61 return err 62 } 63 defer src.Close() 64 65 dest, err := os.OpenFile(filepath.Join(dist, path), os.O_TRUNC|os.O_CREATE|os.O_WRONLY, os.ModePerm) 66 if err != nil { 67 return err 68 } 69 70 defer dest.Close() 71 72 _, err = io.Copy(dest, src) 73 return err 74 }) 75 } 76 77 func (r Registry) CacheDir(cacheDir string, mpath string, version string) string { 78 base, _, ok := module.SplitPathVersion(mpath) 79 if !ok { 80 base = mpath 81 } 82 return filepath.Join(cacheDir, fmt.Sprintf("%s@%s", base, version)) 83 }