From ae5afea4be8ca56e3fb7963fea5e337332e50a1f Mon Sep 17 00:00:00 2001 From: bnewbold Date: Tue, 17 Apr 2012 23:15:34 -0400 Subject: basic dumping in several formats --- store.go | 137 ++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 69 insertions(+), 68 deletions(-) (limited to 'store.go') diff --git a/store.go b/store.go index 105890c..182f97d 100644 --- a/store.go +++ b/store.go @@ -4,7 +4,7 @@ import ( "encoding/json" "log" "os" - "path" + "path" ) var bomstore BomStore @@ -27,7 +27,7 @@ type JSONFileBomStore struct { func NewJSONFileBomStore(fpath string) (*JSONFileBomStore, error) { err := os.MkdirAll(fpath, os.ModePerm|os.ModeDir) if err != nil && !os.IsExist(err) { - return nil, err + return nil, err } return &JSONFileBomStore{Rootfpath: fpath}, nil } @@ -35,7 +35,7 @@ func NewJSONFileBomStore(fpath string) (*JSONFileBomStore, error) { func OpenJSONFileBomStore(fpath string) (*JSONFileBomStore, error) { _, err := os.Open(fpath) if err != nil && !os.IsExist(err) { - return nil, err + return nil, err } return &JSONFileBomStore{Rootfpath: fpath}, nil } @@ -49,16 +49,17 @@ func (jfbs *JSONFileBomStore) GetStub(user, name ShortName) (*BomStub, error) { return &bs, nil } -func (jfbs *JSONFileBomStore) GetHead(user, name ShortName) (*Bom, error) { +func (jfbs *JSONFileBomStore) GetHead(user, name ShortName) (*BomStub, *Bom, error) { bs, err := jfbs.GetStub(user, name) if err != nil { - return nil, err + return nil, nil, err } version := bs.HeadVersion if version == "" { log.Fatal("Tried to read undefined HEAD for " + string(user) + "/" + string(name)) } - return jfbs.GetBom(user, name, ShortName(version)) + b, err := jfbs.GetBom(user, name, ShortName(version)) + return bs, b, err } func (jfbs *JSONFileBomStore) GetBom(user, name, version ShortName) (*Bom, error) { @@ -71,73 +72,73 @@ func (jfbs *JSONFileBomStore) GetBom(user, name, version ShortName) (*Bom, error } func (jfbs *JSONFileBomStore) ListBoms(user ShortName) ([]BomStub, error) { - if user != "" { - return jfbs.listBomsForUser(user) - } - // else iterator over all users... - rootDir, err := os.Open(jfbs.Rootfpath) - if err != nil { - log.Fatal(err) - } - defer rootDir.Close() - bsList := []BomStub{} - dirInfo, err := rootDir.Readdir(0) - for _, node := range dirInfo { - if !node.IsDir() || !isShortName(node.Name()) { - continue - } - uList, err := jfbs.listBomsForUser(ShortName(node.Name())) - if err != nil { - log.Fatal(err) - } - bsList = append(bsList, uList...) - } - return bsList, nil + if user != "" { + return jfbs.listBomsForUser(user) + } + // else iterator over all users... + rootDir, err := os.Open(jfbs.Rootfpath) + if err != nil { + log.Fatal(err) + } + defer rootDir.Close() + bsList := []BomStub{} + dirInfo, err := rootDir.Readdir(0) + for _, node := range dirInfo { + if !node.IsDir() || !isShortName(node.Name()) { + continue + } + uList, err := jfbs.listBomsForUser(ShortName(node.Name())) + if err != nil { + log.Fatal(err) + } + bsList = append(bsList, uList...) + } + return bsList, nil } func (jfbs *JSONFileBomStore) listBomsForUser(user ShortName) ([]BomStub, error) { - bsList := []BomStub{} - uDirPath:= jfbs.Rootfpath + "/" + string(user) - uDir, err := os.Open(uDirPath) - if err != nil { - if e, ok := err.(*os.PathError); ok && e.Err.Error() == "no such file or directory" { - // XXX: should probably check for a specific syscall error? same below - return bsList, nil - } - return nil, err - } - defer uDir.Close() - dirContents , err := uDir.Readdir(0) - if err != nil { - return nil, err - } - for _, node := range dirContents { - if !node.IsDir() || !isShortName(node.Name()) { - continue - } - fpath := jfbs.Rootfpath + "/" + string(user) + "/" + node.Name() + "/_meta.json" - bs := BomStub{} - if err := readJsonBomStub(fpath, &bs); err != nil { - if e, ok := err.(*os.PathError); ok && e.Err.Error() == "no such file or directory" { - // no _meta.json in there - continue - } - return nil, err - } - bsList = append(bsList, bs) - } + bsList := []BomStub{} + uDirPath := jfbs.Rootfpath + "/" + string(user) + uDir, err := os.Open(uDirPath) + if err != nil { + if e, ok := err.(*os.PathError); ok && e.Err.Error() == "no such file or directory" { + // XXX: should probably check for a specific syscall error? same below + return bsList, nil + } + return nil, err + } + defer uDir.Close() + dirContents, err := uDir.Readdir(0) + if err != nil { + return nil, err + } + for _, node := range dirContents { + if !node.IsDir() || !isShortName(node.Name()) { + continue + } + fpath := jfbs.Rootfpath + "/" + string(user) + "/" + node.Name() + "/_meta.json" + bs := BomStub{} + if err := readJsonBomStub(fpath, &bs); err != nil { + if e, ok := err.(*os.PathError); ok && e.Err.Error() == "no such file or directory" { + // no _meta.json in there + continue + } + return nil, err + } + bsList = append(bsList, bs) + } return bsList, nil } func (jfbs *JSONFileBomStore) Persist(bs *BomStub, b *Bom, version ShortName) error { b_fpath := jfbs.Rootfpath + "/" + string(bs.Owner) + "/" + string(bs.Name) + "/" + string(version) + ".json" bs_fpath := jfbs.Rootfpath + "/" + string(bs.Owner) + "/" + string(bs.Name) + "/_meta.json" - if err := writeJsonBomStub(bs_fpath, bs); err != nil { - log.Fatal(err) - } - if err := writeJsonBom(b_fpath, b); err != nil { - log.Fatal(err) - } + if err := writeJsonBomStub(bs_fpath, bs); err != nil { + log.Fatal(err) + } + if err := writeJsonBom(b_fpath, b); err != nil { + log.Fatal(err) + } return nil } @@ -155,10 +156,10 @@ func readJsonBomStub(fpath string, bs *BomStub) error { } func writeJsonBomStub(fpath string, bs *BomStub) error { - err := os.MkdirAll(path.Dir(fpath), os.ModePerm|os.ModeDir) - if err != nil && !os.IsExist(err) { - return err - } + err := os.MkdirAll(path.Dir(fpath), os.ModePerm|os.ModeDir) + if err != nil && !os.IsExist(err) { + return err + } f, err := os.Create(fpath) if err != nil { return err -- cgit v1.2.3