* Inital routes to git refs api * Git refs API implementation * Update swagger * Fix copyright * Make swagger happy add basic test * Fix test * Fix test again :)
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package sideband
|
|
|
|
import (
|
|
"io"
|
|
|
|
"gopkg.in/src-d/go-git.v4/plumbing/format/pktline"
|
|
)
|
|
|
|
// Muxer multiplex the packfile along with the progress messages and the error
|
|
// information. The multiplex is perform using pktline format.
|
|
type Muxer struct {
|
|
max int
|
|
e *pktline.Encoder
|
|
}
|
|
|
|
const chLen = 1
|
|
|
|
// NewMuxer returns a new Muxer for the given t that writes on w.
|
|
//
|
|
// If t is equal to `Sideband` the max pack size is set to MaxPackedSize, in any
|
|
// other value is given, max pack is set to MaxPackedSize64k, that is the
|
|
// maximum length of a line in pktline format.
|
|
func NewMuxer(t Type, w io.Writer) *Muxer {
|
|
max := MaxPackedSize64k
|
|
if t == Sideband {
|
|
max = MaxPackedSize
|
|
}
|
|
|
|
return &Muxer{
|
|
max: max - chLen,
|
|
e: pktline.NewEncoder(w),
|
|
}
|
|
}
|
|
|
|
// Write writes p in the PackData channel
|
|
func (m *Muxer) Write(p []byte) (int, error) {
|
|
return m.WriteChannel(PackData, p)
|
|
}
|
|
|
|
// WriteChannel writes p in the given channel. This method can be used with any
|
|
// channel, but is recommend use it only for the ProgressMessage and
|
|
// ErrorMessage channels and use Write for the PackData channel
|
|
func (m *Muxer) WriteChannel(t Channel, p []byte) (int, error) {
|
|
wrote := 0
|
|
size := len(p)
|
|
for wrote < size {
|
|
n, err := m.doWrite(t, p[wrote:])
|
|
wrote += n
|
|
|
|
if err != nil {
|
|
return wrote, err
|
|
}
|
|
}
|
|
|
|
return wrote, nil
|
|
}
|
|
|
|
func (m *Muxer) doWrite(ch Channel, p []byte) (int, error) {
|
|
sz := len(p)
|
|
if sz > m.max {
|
|
sz = m.max
|
|
}
|
|
|
|
return sz, m.e.Encode(ch.WithPayload(p[:sz]))
|
|
}
|