Skip to content

Commit 1fe34af

Browse files
committed
ParseBatchHeader(): make function public and change its signature
1 parent c8151f9 commit 1fe34af

File tree

4 files changed

+80
-64
lines changed

4 files changed

+80
-64
lines changed

git/batch_header.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package git
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
8+
"github.com/github/git-sizer/counts"
9+
)
10+
11+
type BatchHeader struct {
12+
OID OID
13+
ObjectType ObjectType
14+
ObjectSize counts.Count32
15+
}
16+
17+
var missingHeader = BatchHeader{
18+
ObjectType: "missing",
19+
}
20+
21+
// Parse a `cat-file --batch[-check]` output header line (including
22+
// the trailing LF). `spec`, if not "", is used in error messages.
23+
func ParseBatchHeader(spec string, header string) (BatchHeader, error) {
24+
header = header[:len(header)-1]
25+
words := strings.Split(header, " ")
26+
if words[len(words)-1] == "missing" {
27+
if spec == "" {
28+
spec = words[0]
29+
}
30+
return missingHeader, fmt.Errorf("missing object %s", spec)
31+
}
32+
33+
oid, err := NewOID(words[0])
34+
if err != nil {
35+
return missingHeader, err
36+
}
37+
38+
size, err := strconv.ParseUint(words[2], 10, 0)
39+
if err != nil {
40+
return missingHeader, err
41+
}
42+
return BatchHeader{
43+
OID: oid,
44+
ObjectType: ObjectType(words[1]),
45+
ObjectSize: counts.NewCount32(size),
46+
}, nil
47+
}

git/batch_obj_iter.go

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@ package git
22

33
import (
44
"bufio"
5-
"fmt"
65
"io"
76
"os"
87
"os/exec"
9-
"strconv"
10-
"strings"
11-
12-
"github.com/github/git-sizer/counts"
138
)
149

1510
// BatchObjectIter iterates over objects whose names are fed into its
@@ -55,23 +50,23 @@ func (repo *Repository) NewBatchObjectIter() (*BatchObjectIter, io.WriteCloser,
5550

5651
// Next returns the next object: its OID, type, size, and contents.
5752
// When no more data are available, it returns an `io.EOF` error.
58-
func (iter *BatchObjectIter) Next() (OID, ObjectType, counts.Count32, []byte, error) {
53+
func (iter *BatchObjectIter) Next() (BatchHeader, []byte, error) {
5954
header, err := iter.f.ReadString('\n')
6055
if err != nil {
61-
return OID{}, "", 0, nil, err
56+
return missingHeader, nil, err
6257
}
63-
oid, objectType, objectSize, err := parseBatchHeader("", header)
58+
obj, err := ParseBatchHeader("", header)
6459
if err != nil {
65-
return OID{}, "", 0, nil, err
60+
return missingHeader, nil, err
6661
}
6762
// +1 for LF:
68-
data := make([]byte, objectSize+1)
63+
data := make([]byte, obj.ObjectSize+1)
6964
_, err = io.ReadFull(iter.f, data)
7065
if err != nil {
71-
return OID{}, "", 0, nil, err
66+
return missingHeader, nil, err
7267
}
7368
data = data[:len(data)-1]
74-
return oid, objectType, objectSize, data, nil
69+
return obj, data, nil
7570
}
7671

7772
// Close closes the iterator and frees up resources. If any iterator
@@ -84,27 +79,3 @@ func (iter *BatchObjectIter) Close() error {
8479
}
8580
return err
8681
}
87-
88-
// Parse a `cat-file --batch[-check]` output header line (including
89-
// the trailing LF). `spec`, if not "", is used in error messages.
90-
func parseBatchHeader(spec string, header string) (OID, ObjectType, counts.Count32, error) {
91-
header = header[:len(header)-1]
92-
words := strings.Split(header, " ")
93-
if words[len(words)-1] == "missing" {
94-
if spec == "" {
95-
spec = words[0]
96-
}
97-
return OID{}, "missing", 0, fmt.Errorf("missing object %s", spec)
98-
}
99-
100-
oid, err := NewOID(words[0])
101-
if err != nil {
102-
return OID{}, "missing", 0, err
103-
}
104-
105-
size, err := strconv.ParseUint(words[2], 10, 0)
106-
if err != nil {
107-
return OID{}, "missing", 0, err
108-
}
109-
return oid, ObjectType(words[1]), counts.NewCount32(size), nil
110-
}

git/obj_iter.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"io"
77
"os"
88
"os/exec"
9-
10-
"github.com/github/git-sizer/counts"
119
)
1210

1311
// ObjectIter iterates over objects in a Git repository.
@@ -105,13 +103,13 @@ func (repo *Repository) NewObjectIter(
105103

106104
// Next returns the next object: its OID, type, and size. When no more
107105
// data are available, it returns an `io.EOF` error.
108-
func (iter *ObjectIter) Next() (OID, ObjectType, counts.Count32, error) {
106+
func (iter *ObjectIter) Next() (BatchHeader, error) {
109107
line, err := iter.f.ReadString('\n')
110108
if err != nil {
111-
return OID{}, "", 0, err
109+
return missingHeader, err
112110
}
113111

114-
return parseBatchHeader("", line)
112+
return ParseBatchHeader("", line)
115113
}
116114

117115
// Close closes the iterator and frees up resources.

sizes/graph.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -192,25 +192,25 @@ func ScanRepositoryUsingGraph(
192192

193193
progressMeter.Start("Processing blobs: %d")
194194
for {
195-
oid, objectType, objectSize, err := iter.Next()
195+
obj, err := iter.Next()
196196
if err != nil {
197197
if err != io.EOF {
198198
return HistorySize{}, err
199199
}
200200
break
201201
}
202-
switch objectType {
202+
switch obj.ObjectType {
203203
case "blob":
204204
progressMeter.Inc()
205-
graph.RegisterBlob(oid, objectSize)
205+
graph.RegisterBlob(obj.OID, obj.ObjectSize)
206206
case "tree":
207-
trees = append(trees, ObjectHeader{oid, objectSize})
207+
trees = append(trees, ObjectHeader{obj.OID, obj.ObjectSize})
208208
case "commit":
209-
commits = append(commits, CommitHeader{ObjectHeader{oid, objectSize}, git.NullOID})
209+
commits = append(commits, CommitHeader{ObjectHeader{obj.OID, obj.ObjectSize}, git.NullOID})
210210
case "tag":
211-
tags = append(tags, ObjectHeader{oid, objectSize})
211+
tags = append(tags, ObjectHeader{obj.OID, obj.ObjectSize})
212212
default:
213-
return HistorySize{}, fmt.Errorf("unexpected object type: %s", objectType)
213+
return HistorySize{}, fmt.Errorf("unexpected object type: %s", obj.ObjectType)
214214
}
215215
}
216216
progressMeter.Done()
@@ -286,22 +286,22 @@ func ScanRepositoryUsingGraph(
286286

287287
progressMeter.Start("Processing trees: %d")
288288
for range trees {
289-
oid, objectType, _, data, err := objectIter.Next()
289+
obj, data, err := objectIter.Next()
290290
if err != nil {
291291
if err != io.EOF {
292292
return HistorySize{}, err
293293
}
294294
return HistorySize{}, errors.New("fewer trees read than expected")
295295
}
296-
if objectType != "tree" {
297-
return HistorySize{}, fmt.Errorf("expected tree; read %#v", objectType)
296+
if obj.ObjectType != "tree" {
297+
return HistorySize{}, fmt.Errorf("expected tree; read %#v", obj.ObjectType)
298298
}
299299
progressMeter.Inc()
300-
tree, err := git.ParseTree(oid, data)
300+
tree, err := git.ParseTree(obj.OID, data)
301301
if err != nil {
302302
return HistorySize{}, err
303303
}
304-
err = graph.RegisterTree(oid, tree)
304+
err = graph.RegisterTree(obj.OID, tree)
305305
if err != nil {
306306
return HistorySize{}, err
307307
}
@@ -313,26 +313,26 @@ func ScanRepositoryUsingGraph(
313313
// time:
314314
progressMeter.Start("Processing commits: %d")
315315
for i := len(commits); i > 0; i-- {
316-
oid, objectType, _, data, err := objectIter.Next()
316+
obj, data, err := objectIter.Next()
317317
if err != nil {
318318
if err != io.EOF {
319319
return HistorySize{}, err
320320
}
321321
return HistorySize{}, errors.New("fewer commits read than expected")
322322
}
323-
if objectType != "commit" {
324-
return HistorySize{}, fmt.Errorf("expected commit; read %#v", objectType)
323+
if obj.ObjectType != "commit" {
324+
return HistorySize{}, fmt.Errorf("expected commit; read %#v", obj.ObjectType)
325325
}
326-
commit, err := git.ParseCommit(oid, data)
326+
commit, err := git.ParseCommit(obj.OID, data)
327327
if err != nil {
328328
return HistorySize{}, err
329329
}
330-
if oid != commits[i-1].oid {
330+
if obj.OID != commits[i-1].oid {
331331
panic("commits not read in same order as requested")
332332
}
333333
commits[i-1].tree = commit.Tree
334334
progressMeter.Inc()
335-
graph.RegisterCommit(oid, commit)
335+
graph.RegisterCommit(obj.OID, commit)
336336
}
337337
progressMeter.Done()
338338

@@ -349,22 +349,22 @@ func ScanRepositoryUsingGraph(
349349

350350
progressMeter.Start("Processing annotated tags: %d")
351351
for range tags {
352-
oid, objectType, _, data, err := objectIter.Next()
352+
obj, data, err := objectIter.Next()
353353
if err != nil {
354354
if err != io.EOF {
355355
return HistorySize{}, err
356356
}
357357
return HistorySize{}, errors.New("fewer tags read than expected")
358358
}
359-
if objectType != "tag" {
360-
return HistorySize{}, fmt.Errorf("expected tag; read %#v", objectType)
359+
if obj.ObjectType != "tag" {
360+
return HistorySize{}, fmt.Errorf("expected tag; read %#v", obj.ObjectType)
361361
}
362-
tag, err := git.ParseTag(oid, data)
362+
tag, err := git.ParseTag(obj.OID, data)
363363
if err != nil {
364364
return HistorySize{}, err
365365
}
366366
progressMeter.Inc()
367-
graph.RegisterTag(oid, tag)
367+
graph.RegisterTag(obj.OID, tag)
368368
}
369369
progressMeter.Done()
370370

0 commit comments

Comments
 (0)