summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2017-11-17 16:29:37 -0500
committerLuke Shumaker <lukeshu@lukeshu.com>2017-11-17 16:29:37 -0500
commitd9498148b860252c6f80eb6cd5acbd9fe07b2b8b (patch)
tree61ef914767f07df85688ccd7187da48efca25b64
parent5b3b19e1280ac879567f9299639f60e5b1dd0c14 (diff)
error callbacks
-rw-r--r--backend.go54
-rw-r--r--frontend.go5
2 files changed, 42 insertions, 17 deletions
diff --git a/backend.go b/backend.go
index 3bf07b5..b91ee88 100644
--- a/backend.go
+++ b/backend.go
@@ -13,58 +13,80 @@ type Backend struct {
w *bufio.Writer
fiw *textproto.FIWriter
cbr *textproto.CatBlobReader
+
+ onErr func(error) error
}
-func NewBackend(fastImport io.Writer, catBlob io.Reader) *Backend {
- ret := Backend{}
+func NewBackend(fastImport io.Writer, catBlob io.Reader, onErr func(error) error) *Backend {
+ ret := &Backend{}
ret.w = bufio.NewWriter(fastImport)
ret.fiw = textproto.NewFIWriter(ret.w)
if catBlob != nil {
ret.cbr = textproto.NewCatBlobReader(catBlob)
}
- return &ret
+ ret.onErr = onErr
+ return ret
}
func (b *Backend) Do(cmd Cmd) error {
err := cmd.fiWriteCmd(b.fiw)
if err != nil {
- return err
+ return b.onErr(err)
+ }
+ err = b.w.Flush()
+ if err != nil {
+ return b.onErr(err)
}
- return b.w.Flush()
+ return nil
}
-func (b *Backend) GetMark(cmd CmdGetMark) (string, error) {
- err := b.Do(cmd)
+func (b *Backend) GetMark(cmd CmdGetMark) (sha1 string, err error) {
+ err = b.Do(cmd)
if err != nil {
- return "", err
+ return
}
line, err := b.cbr.ReadLine()
if err != nil {
- return "", err
+ err = b.onErr(err)
+ return
+ }
+ sha1, err = cbpGetMark(line)
+ if err != nil {
+ err = b.onErr(err)
}
- return cbpGetMark(line)
+ return
}
func (b *Backend) CatBlob(cmd CmdCatBlob) (sha1 string, data string, err error) {
err = b.Do(cmd)
if err != nil {
- return "", "", err
+ return
}
line, err := b.cbr.ReadLine()
if err != nil {
- return "", "", err
+ err = b.onErr(err)
+ return
+ }
+ sha1, data, err = cbpCatBlob(line)
+ if err != nil {
+ err = b.onErr(err)
}
- return cbpCatBlob(line)
+ return
}
func (b *Backend) Ls(cmd CmdLs) (mode textproto.Mode, dataref string, path textproto.Path, err error) {
err = b.Do(cmd)
if err != nil {
- return 0, "", "", err
+ return
}
line, err := b.cbr.ReadLine()
if err != nil {
- return 0, "", "", err
+ err = b.onErr(err)
+ return
+ }
+ mode, dataref, path, err = cbpLs(line)
+ if err != nil {
+ err = b.onErr(err)
}
- return cbpLs(line)
+ return
}
diff --git a/frontend.go b/frontend.go
index 0b10f65..2150a35 100644
--- a/frontend.go
+++ b/frontend.go
@@ -38,7 +38,7 @@ type Frontend struct {
err error
}
-func NewFrontend(fastImport io.Reader, catBlob io.Writer) *Frontend {
+func NewFrontend(fastImport io.Reader, catBlob io.Writer, onErr func(error) error) *Frontend {
ret := &Frontend{}
ret.fir = textproto.NewFIReader(fastImport)
if catBlob == nil {
@@ -49,6 +49,9 @@ func NewFrontend(fastImport io.Reader, catBlob io.Writer) *Frontend {
ret.cmd = make(chan Cmd)
go func() {
ret.err = ret.parse()
+ if onErr != nil {
+ ret.err = onErr(ret.err)
+ }
close(ret.cmd)
}()
return ret