util.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package gig
  2. import (
  3. "io"
  4. "bytes"
  5. "strings"
  6. "compress/zlib"
  7. )
  8. func readUntilNul(r io.Reader) (string, error) {
  9. buf := bytes.NewBuffer(make([]byte, 0))
  10. for {
  11. var b [1]byte
  12. _, err := r.Read(b[:])
  13. if err != nil {
  14. return "", err
  15. } else if b[0] == 0 {
  16. break
  17. }
  18. buf.WriteByte(b[0])
  19. }
  20. return buf.String(), nil
  21. }
  22. func split2(s, sep string) (head, tail string) {
  23. comps := strings.SplitN(s, sep, 2)
  24. head = comps[0]
  25. if len(comps) > 1 {
  26. tail = comps[1]
  27. }
  28. return
  29. }
  30. type zlibReadCloser struct {
  31. io.LimitedReader //R of io.LimitedReader is the zlib reader
  32. source io.ReadCloser //the underlying source
  33. }
  34. func (r *zlibReadCloser) Close() error {
  35. var e1, e2 error
  36. // this shouldn't fail ever actually, since the wrapped
  37. // object should have been an io.ReadCloser
  38. if rc, ok := r.LimitedReader.R.(io.Closer); ok {
  39. e1 = rc.Close()
  40. }
  41. e2 = r.source.Close()
  42. if e1 == nil && e2 == nil {
  43. return nil
  44. } else if e2 != nil {
  45. return e2
  46. }
  47. return e1
  48. }
  49. func (o *gitObject) wrapSourceWithDeflate() error {
  50. r, err := zlib.NewReader(o.source)
  51. if err != nil {
  52. return err
  53. }
  54. o.source = &zlibReadCloser{io.LimitedReader{R: r, N: o.size}, o.source}
  55. return nil
  56. }
  57. func (o *gitObject) wrapSource(rc io.ReadCloser) {
  58. o.source = &zlibReadCloser{io.LimitedReader{R: rc, N: o.size}, o.source}
  59. }