@@ -53,14 +53,30 @@ type Scanner struct {
53
53
IsSeekable bool
54
54
}
55
55
56
- // NewScanner returns a new Scanner based on a reader, if the given reader
57
- // implements io.ReadSeeker the Scanner will be also Seekable
58
- func NewScanner (r io.Reader ) * Scanner {
56
+ // ScannerOptions specifies options for use by NewScannerWithOptions
57
+ type ScannerOptions struct {
58
+ // Avoid calculating the CRC checksums
59
+ NoChecksum bool
60
+ }
61
+
62
+ // NewScannerWithOptions returns a new Scanner based on a reader, if
63
+ // the given reader implements io.ReadSeeker the Scanner will be also
64
+ // Seekable. Additional options can be specified to disable checksum
65
+ // calculation.
66
+ func NewScannerWithOptions (r io.Reader , ops ScannerOptions ) * Scanner {
59
67
seeker , ok := r .(io.ReadSeeker )
60
68
if ! ok {
61
69
seeker = & trackableReader {Reader : r }
62
70
}
63
71
72
+ if ops .NoChecksum {
73
+ return & Scanner {
74
+ r : newByteReadSeeker (seeker ),
75
+ crc : nil ,
76
+ IsSeekable : ok ,
77
+ }
78
+ }
79
+
64
80
crc := crc32 .NewIEEE ()
65
81
return & Scanner {
66
82
r : newTeeReader (newByteReadSeeker (seeker ), crc ),
@@ -69,6 +85,12 @@ func NewScanner(r io.Reader) *Scanner {
69
85
}
70
86
}
71
87
88
+ // NewScanner returns a new Scanner based on a reader, if the given reader
89
+ // implements io.ReadSeeker the Scanner will be also Seekable
90
+ func NewScanner (r io.Reader ) * Scanner {
91
+ return NewScannerWithOptions (r , ScannerOptions {})
92
+ }
93
+
72
94
// Header reads the whole packfile header (signature, version and object count).
73
95
// It returns the version and the object count and performs checks on the
74
96
// validity of the signature and the version fields.
@@ -184,7 +206,9 @@ func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) {
184
206
func (s * Scanner ) nextObjectHeader () (* ObjectHeader , error ) {
185
207
defer s .Flush ()
186
208
187
- s .crc .Reset ()
209
+ if s .crc != nil {
210
+ s .crc .Reset ()
211
+ }
188
212
189
213
h := & ObjectHeader {}
190
214
s .pendingObject = h
@@ -304,12 +328,18 @@ func (s *Scanner) readLength(first byte) (int64, error) {
304
328
// NextObject writes the content of the next object into the reader, returns
305
329
// the number of bytes written, the CRC32 of the content and an error, if any
306
330
func (s * Scanner ) NextObject (w io.Writer ) (written int64 , crc32 uint32 , err error ) {
307
- defer s .crc .Reset ()
331
+ if s .crc != nil {
332
+ s .crc .Reset ()
333
+ }
308
334
309
335
s .pendingObject = nil
310
336
written , err = s .copyObject (w )
311
337
s .Flush ()
312
- crc32 = s .crc .Sum32 ()
338
+ if s .crc != nil {
339
+ crc32 = s .crc .Sum32 ()
340
+ } else {
341
+ crc32 = 0
342
+ }
313
343
return
314
344
}
315
345
0 commit comments