1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
package blobstore
import (
"fmt"
"hash"
"io"
"os"
"path"
)
type Writer struct {
path string
writer io.WriteCloser
target io.Writer
hash hash.Hash
}
// io.WriteCloser interface {{{
func (n Writer) Write(b []byte) (int, error) {
return n.target.Write(b)
}
func (n Writer) Close() error {
return n.writer.Close()
}
// }}}
// Commit {{{
func (s Store) Commit(w Writer) (*Object, error) {
err := w.writer.Close()
if err != nil {
return nil, err
}
oid := fmt.Sprintf("%x", w.hash.Sum(nil))
obj := Object{id: oid}
objPath := s.objToPath(obj)
if err := os.MkdirAll(path.Dir(objPath), 0755); err != nil {
return nil, err
}
err = os.Chmod(w.path, 0644)
if err != nil {
return nil, err
}
err = os.Rename(w.path, objPath)
if err != nil {
return nil, err
}
return &obj, nil
}
// }}}
// vim: foldmethod=marker
|