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  }