fork of go-git with some jj specific features
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

plumbing: packfile, Add a buffer to crc writer.

crc update with block smaller than 16 bytes uses a slower version of the
function. ReadByte is heavily used by zlib inflate so most of the time
crc is update byte by byte.

A new Flush method is added to the scanner to flush this crc writer
cache. It is only called when the Scanner reader is a teeReader.

Signed-off-by: Javi Fontan <jfontan@gmail.com>

+31 -9
+31 -9
plumbing/format/packfile/scanner.go
··· 63 63 64 64 crc := crc32.NewIEEE() 65 65 return &Scanner{ 66 - r: &teeReader{ 67 - newByteReadSeeker(seeker), 68 - crc, 69 - }, 66 + r: newTeeReader(newByteReadSeeker(seeker), crc), 70 67 crc: crc, 71 68 IsSeekable: ok, 72 69 } ··· 143 140 144 141 // NextObjectHeader returns the ObjectHeader for the next object in the reader 145 142 func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) { 143 + defer s.Flush() 144 + 146 145 if err := s.doPending(); err != nil { 147 146 return nil, err 148 147 } ··· 271 270 272 271 s.pendingObject = nil 273 272 written, err = s.copyObject(w) 273 + s.Flush() 274 274 crc32 = s.crc.Sum32() 275 275 return 276 276 } ··· 339 339 return err 340 340 } 341 341 342 + // Flush finishes writing the buffer to crc hasher in case we are using 343 + // a teeReader. Otherwise it is a no-op. 344 + func (s *Scanner) Flush() error { 345 + tee, ok := s.r.(*teeReader) 346 + if ok { 347 + return tee.Flush() 348 + } 349 + return nil 350 + } 351 + 342 352 type trackableReader struct { 343 353 count int64 344 354 io.Reader ··· 400 410 401 411 type teeReader struct { 402 412 reader 403 - w hash.Hash32 413 + w hash.Hash32 414 + bufWriter *bufio.Writer 415 + } 416 + 417 + func newTeeReader(r reader, h hash.Hash32) *teeReader { 418 + return &teeReader{ 419 + reader: r, 420 + w: h, 421 + bufWriter: bufio.NewWriter(h), 422 + } 404 423 } 405 424 406 425 func (r *teeReader) Read(p []byte) (n int, err error) { 426 + r.Flush() 427 + 407 428 n, err = r.reader.Read(p) 408 429 if n > 0 { 409 430 if n, err := r.w.Write(p[:n]); err != nil { ··· 416 437 func (r *teeReader) ReadByte() (b byte, err error) { 417 438 b, err = r.reader.ReadByte() 418 439 if err == nil { 419 - _, err := r.w.Write([]byte{b}) 420 - if err != nil { 421 - return 0, err 422 - } 440 + return b, r.bufWriter.WriteByte(b) 423 441 } 424 442 425 443 return 426 444 } 445 + 446 + func (r *teeReader) Flush() (err error) { 447 + return r.bufWriter.Flush() 448 + }