@@ -49,7 +49,8 @@ type Scanner struct {
49
49
50
50
// pendingObject is used to detect if an object has been read, or still
51
51
// is waiting to be read
52
- pendingObject * ObjectHeader
52
+ pendingObject * ObjectHeader
53
+ version , objects uint32
53
54
}
54
55
55
56
// NewParser returns a new Parser that reads from the packfile represented by r.
@@ -70,6 +71,10 @@ func NewScanner(r io.ReadSeeker) *Scanner {
70
71
// It returns the version and the object count and performs checks on the
71
72
// validity of the signature and the version fields.
72
73
func (s * Scanner ) Header () (version , objects uint32 , err error ) {
74
+ if s .version != 0 {
75
+ return s .version , s .objects , nil
76
+ }
77
+
73
78
sig , err := s .readSignature ()
74
79
if err != nil {
75
80
if err == io .EOF {
@@ -85,6 +90,7 @@ func (s *Scanner) Header() (version, objects uint32, err error) {
85
90
}
86
91
87
92
version , err = s .readVersion ()
93
+ s .version = version
88
94
if err != nil {
89
95
return
90
96
}
@@ -95,6 +101,7 @@ func (s *Scanner) Header() (version, objects uint32, err error) {
95
101
}
96
102
97
103
objects , err = s .readCount ()
104
+ s .objects = objects
98
105
return
99
106
}
100
107
@@ -141,7 +148,7 @@ func (s *Scanner) readInt32() (uint32, error) {
141
148
142
149
// NextObjectHeader returns the ObjectHeader for the next object in the reader
143
150
func (s * Scanner ) NextObjectHeader () (* ObjectHeader , error ) {
144
- if err := s .discardObjectIfNeeded (); err != nil {
151
+ if err := s .doPending (); err != nil {
145
152
return nil , err
146
153
}
147
154
@@ -180,6 +187,18 @@ func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) {
180
187
return h , nil
181
188
}
182
189
190
+ func (s * Scanner ) doPending () error {
191
+ if s .version == 0 {
192
+ var err error
193
+ s .version , s .objects , err = s .Header ()
194
+ if err != nil {
195
+ return err
196
+ }
197
+ }
198
+
199
+ return s .discardObjectIfNeeded ()
200
+ }
201
+
183
202
func (s * Scanner ) discardObjectIfNeeded () error {
184
203
if s .pendingObject == nil {
185
204
return nil
@@ -275,6 +294,11 @@ func (s *Scanner) copyObject(w io.Writer) (int64, error) {
275
294
276
295
// Seek sets a new offset from start, returns the old position before the change
277
296
func (s * Scanner ) Seek (offset int64 ) (previous int64 , err error ) {
297
+ // if seeking we asume that you are not interested on the header
298
+ if s .version == 0 {
299
+ s .version = VersionSupported
300
+ }
301
+
278
302
previous , err = s .r .Seek (0 , io .SeekCurrent )
279
303
if err != nil {
280
304
return - 1 , err
0 commit comments