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