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  }