github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/pkg/buildinfostore/filestore.go (about) 1 package buildinfostore 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 10 "github.com/benchkram/bob/bobtask/buildinfo" 11 "github.com/benchkram/bob/pkg/file" 12 "github.com/benchkram/errz" 13 ) 14 15 // var ErrBuildInfoDoesNotExist = fmt.Errorf("build info does not exist") 16 17 type s struct { 18 // dir is the base directory of the store 19 dir string 20 } 21 22 // New creates a filestore. The caller is responsible to pass a 23 // existing directory. 24 func New(dir string) Store { 25 s := &s{ 26 dir: dir, 27 } 28 29 // for _, opt := range opts { 30 // if opt == nil { 31 // continue 32 // } 33 // opt(s) 34 // } 35 36 return s 37 } 38 39 // NewBuildInfo creates a new build info file. 40 func (s *s) NewBuildInfo(id string, info *buildinfo.I) (err error) { 41 defer errz.Recover(&err) 42 43 b, err := json.Marshal(info) 44 errz.Fatal(err) 45 46 err = os.WriteFile(filepath.Join(s.dir, id), b, 0666) 47 errz.Fatal(err) 48 49 return nil 50 } 51 52 // GetArtifact opens a file 53 func (s *s) GetBuildInfo(id string) (info *buildinfo.I, err error) { 54 defer errz.Recover(&err) 55 56 info = &buildinfo.I{} 57 58 f, err := os.Open(filepath.Join(s.dir, id)) 59 if err != nil { 60 return nil, ErrBuildInfoDoesNotExist 61 } 62 defer f.Close() 63 64 b, err := io.ReadAll(f) 65 errz.Fatal(err) 66 67 err = json.Unmarshal(b, info) 68 errz.Fatal(err) 69 70 return info, nil 71 } 72 73 func (s *s) GetBuildInfos() (_ []*buildinfo.I, err error) { 74 defer errz.Recover(&err) 75 76 buildinfos := []*buildinfo.I{} 77 78 entrys, err := os.ReadDir(s.dir) 79 errz.Fatal(err) 80 81 for _, entry := range entrys { 82 if entry.IsDir() { 83 continue 84 } 85 86 b, err := os.ReadFile(filepath.Join(s.dir, entry.Name())) 87 errz.Fatal(err) 88 89 bi := &buildinfo.I{} 90 err = json.Unmarshal(b, bi) 91 errz.Fatal(err) 92 93 buildinfos = append(buildinfos, bi) 94 } 95 96 return buildinfos, nil 97 } 98 99 func (s *s) Clean() (err error) { 100 defer errz.Recover(&err) 101 102 homeDir, err := os.UserHomeDir() 103 errz.Fatal(err) 104 if s.dir == "/" || s.dir == homeDir { 105 return fmt.Errorf("Cleanup of %s is not allowed", s.dir) 106 } 107 108 entrys, err := os.ReadDir(s.dir) 109 errz.Fatal(err) 110 111 for _, entry := range entrys { 112 if entry.IsDir() { 113 continue 114 } 115 _ = os.Remove(filepath.Join(s.dir, entry.Name())) 116 } 117 118 return nil 119 } 120 121 func (s *s) BuildInfoExists(id string) bool { 122 return file.Exists(filepath.Join(s.dir, id)) 123 }