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  }