@@ -72,22 +72,23 @@ func VerifyPack(pack io.ReadSeeker, idx io.Reader) ([]*packObject, error) {
72
72
objects , err := parsePack (errReadSeeker {pack , nil }, idx )
73
73
for _ , object := range objects {
74
74
if object .err != nil {
75
- log .Printf ("Found %s (%d) %s %s " , object .Name , object .size , object . Type , object .err )
75
+ log .Printf ("Found %s (%d) %s" , object .Name , object .size , object .err )
76
76
}
77
77
78
- if object .Type == OBJ_OFS_DELTA {
79
- var base * packObject
78
+ if object .Type == OBJ_OFS_DELTA && object .err != nil {
80
79
// TODO improve this
81
80
// linear search to find the right offset
81
+ var base * packObject
82
82
for _ , o := range objects {
83
- log .Print (o .Offset )
84
83
if o .Offset == object .Offset - object .negativeOffset {
85
84
base = o
86
85
break
87
86
}
88
87
}
89
88
if base == nil {
90
- return nil , fmt .Errorf ("Could not find object with negative offset %d - %d" , object .Offset , object .negativeOffset )
89
+ object .err = fmt .Errorf ("could not find object with negative offset %d - %d for %s" , object .Offset , object .negativeOffset , object .Name )
90
+ } else {
91
+ log .Printf ("SUCCESS with %s" , object .Name )
91
92
}
92
93
}
93
94
@@ -104,13 +105,10 @@ func parsePack(pack errReadSeeker, idx io.Reader) (objects []*packObject, err er
104
105
if err != nil {
105
106
return nil , err
106
107
}
107
- log .Printf ("signature %+v" , signature )
108
-
109
108
version := make ([]byte , 4 )
110
109
pack .read (version )
111
110
112
111
// TODO use encoding/binary here
113
- log .Printf ("version is %+v" , version )
114
112
v := version [3 ]
115
113
switch v {
116
114
case 2 :
@@ -125,8 +123,6 @@ func parsePack(pack errReadSeeker, idx io.Reader) (objects []*packObject, err er
125
123
default :
126
124
return nil , fmt .Errorf ("cannot parse packfile with version %d" , v )
127
125
}
128
-
129
- return nil , nil
130
126
}
131
127
132
128
func Clone (r io.Reader ) (* bufio.Reader , * bufio.Reader ) {
@@ -156,6 +152,7 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
156
152
}
157
153
158
154
for _ , object := range objects {
155
+
159
156
var btsread int
160
157
r .Seek (int64 (object .Offset ), os .SEEK_SET )
161
158
_bytes := make ([]byte , 1 )
@@ -210,6 +207,7 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
210
207
if err != nil {
211
208
return nil , err
212
209
}
210
+
213
211
n , err := zr .Read (object .Data )
214
212
if err != nil {
215
213
if err == io .EOF {
@@ -233,12 +231,11 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
233
231
// for n >= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1))
234
232
// to the result."
235
233
236
- log .Printf ("encountered ofs delta" )
237
-
238
234
var offset int
239
235
MSB := (_byte & 128 ) // will be either 128 or 0
240
236
var shift uint = 0
241
- for MSB > 0 {
237
+
238
+ for {
242
239
// Keep reading the size until the MSB is 0
243
240
_bytes := make ([]byte , 1 )
244
241
r .read (_bytes )
@@ -248,14 +245,16 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
248
245
249
246
offset += int ((uint (_byte ) & 127 ) << shift )
250
247
shift += 7
248
+
249
+ if MSB == 0 {
250
+ break
251
+ }
251
252
}
252
253
object .negativeOffset = offset
253
254
object .Data = make ([]byte , objectSize )
254
255
255
256
zr , err := zlib .NewReader (r .r )
256
257
if err != nil {
257
- log .Printf ("Shift is %d" , shift )
258
- log .Printf ("Object size is %d" , objectSize )
259
258
object .err = err
260
259
continue
261
260
}
@@ -266,7 +265,9 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
266
265
}
267
266
object .Data = object .Data [:n ]
268
267
zr .Close ()
269
- log .Printf ("Ofs data is %q" , object .Data )
268
+ if len (object .Data ) != objectSize {
269
+ object .err = fmt .Errorf ("received wrong object size: %d (expected %d)" , object .Data , objectSize )
270
+ }
270
271
271
272
case object .Type == OBJ_REF_DELTA :
272
273
r .Seek (int64 (object .Offset ), os .SEEK_SET )
@@ -296,7 +297,7 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
296
297
297
298
func parseIdx (idx io.Reader , version int ) (objects []* packObject , err error ) {
298
299
if version != 2 {
299
- return nil , fmt .Errorf ("cannot parse IDX with version %d" )
300
+ return nil , fmt .Errorf ("cannot parse IDX with version %d" , version )
300
301
}
301
302
// parse version 2 idxfile
302
303
0 commit comments