-
Notifications
You must be signed in to change notification settings - Fork 0
/
object.go
92 lines (81 loc) · 1.42 KB
/
object.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package git
import (
"errors"
"io"
)
type Object interface {
SHA1() SHA1
Parse([]byte) error
Resolve() error
Resolved() bool
Write() error
}
func newObject(typ string, id SHA1, repo *Repository) Object {
switch typ {
case "blob":
return newBlob(id, repo)
case "tree":
return newTree(id, repo)
case "commit":
return newCommit(id, repo)
case "tag":
return newTag(id, repo)
}
panic("Unknown object type: " + typ)
}
func objectType(obj Object) (string, error) {
switch obj.(type) {
case *Blob:
return "blob", nil
case *Tree:
return "tree", nil
case *Commit:
return "commit", nil
case *Tag:
return "tag", nil
}
return "", errors.New("Unknown object")
}
type objectEntry interface {
Type() string
ReadAll() ([]byte, error)
Close() error
}
type SparseObject struct {
id SHA1
obj Object
err error
repo *Repository
}
func newSparseObject(id SHA1, repo *Repository) *SparseObject {
return &SparseObject{
id: id,
repo: repo,
}
}
func (s *SparseObject) SHA1() SHA1 {
if s.obj != nil {
return s.obj.SHA1()
}
return s.id
}
func (s *SparseObject) Resolve() (Object, error) {
if s.obj == nil && s.err == nil {
s.obj, s.err = s.repo.Object(s.id)
}
return s.obj, s.err
}
func (s *SparseObject) Write() error {
if s.obj == nil {
return nil
}
if err := s.obj.Write(); err != nil {
return err
}
s.id = s.obj.SHA1()
return nil
}
type ObjectData interface {
io.Reader
Size() int64
}