5
5
package dep
6
6
7
7
import (
8
- "bytes"
9
8
"encoding/hex"
10
- "fmt"
11
9
"io"
12
10
"sort"
13
11
@@ -24,48 +22,62 @@ type Lock struct {
24
22
}
25
23
26
24
type rawLock struct {
27
- Memo string
28
- P [] lockedDep
25
+ Memo string
26
+ Projects [] rawLockedProject
29
27
}
30
28
31
- type lockedDep struct {
29
+ type rawLockedProject struct {
32
30
Name string
33
- Version string
34
31
Branch string
35
32
Revision string
33
+ Version string
36
34
Source string
37
35
Packages []string
38
36
}
39
37
40
38
func readLock (r io.Reader ) (* Lock , error ) {
41
- rl := rawLock {}
42
- err := json .NewDecoder (r ).Decode (& rl )
39
+ tree , err := toml .LoadReader (r )
43
40
if err != nil {
44
- return nil , err
41
+ return nil , errors . Wrap ( err , "Unable to parse the lock as TOML" )
45
42
}
46
43
47
- b , err := hex .DecodeString (rl .Memo )
48
- if err != nil {
49
- return nil , fmt .Errorf ("invalid hash digest in lock's memo field" )
44
+ mapper := & tomlMapper {Tree : tree }
45
+
46
+ raw := rawLock {
47
+ Memo : readKeyAsString (mapper , "memo" ),
48
+ Projects : readTableAsLockedProjects (mapper , "projects" ),
49
+ }
50
+
51
+ if mapper .Error != nil {
52
+ return nil , errors .Wrap (mapper .Error , "Invalid lock structure" )
50
53
}
54
+ return fromRawLock (raw )
55
+ }
56
+
57
+ func fromRawLock (raw rawLock ) (* Lock , error ) {
58
+ var err error
51
59
l := & Lock {
52
- Memo : b ,
53
- P : make ([]gps.LockedProject , len (rl .P )),
60
+ P : make ([]gps.LockedProject , len (raw .Projects )),
61
+ }
62
+
63
+ l .Memo , err = hex .DecodeString (raw .Memo )
64
+ if err != nil {
65
+ return nil , errors .Errorf ("invalid hash digest in lock's memo field" )
54
66
}
55
67
56
- for i , ld := range rl . P {
68
+ for i , ld := range raw . Projects {
57
69
r := gps .Revision (ld .Revision )
58
70
59
71
var v gps.Version = r
60
72
if ld .Version != "" {
61
73
if ld .Branch != "" {
62
- return nil , fmt .Errorf ("lock file specified both a branch (%s) and version (%s) for %s" , ld .Branch , ld .Version , ld .Name )
74
+ return nil , errors .Errorf ("lock file specified both a branch (%s) and version (%s) for %s" , ld .Branch , ld .Version , ld .Name )
63
75
}
64
76
v = gps .NewVersion (ld .Version ).Is (r )
65
77
} else if ld .Branch != "" {
66
78
v = gps .NewBranch (ld .Branch ).Is (r )
67
79
} else if r == "" {
68
- return nil , fmt .Errorf ("lock file has entry for %s, but specifies no branch or version" , ld .Name )
80
+ return nil , errors .Errorf ("lock file has entry for %s, but specifies no branch or version" , ld .Name )
69
81
}
70
82
71
83
id := gps.ProjectIdentifier {
@@ -74,7 +86,6 @@ func readLock(r io.Reader) (*Lock, error) {
74
86
}
75
87
l .P [i ] = gps .NewLockedProject (id , v , ld .Packages )
76
88
}
77
-
78
89
return l , nil
79
90
}
80
91
@@ -89,15 +100,15 @@ func (l *Lock) Projects() []gps.LockedProject {
89
100
// toRaw converts the manifest into a representation suitable to write to the lock file
90
101
func (l * Lock ) toRaw () rawLock {
91
102
raw := rawLock {
92
- Memo : hex .EncodeToString (l .Memo ),
93
- P : make ([]lockedDep , len (l .P )),
103
+ Memo : hex .EncodeToString (l .Memo ),
104
+ Projects : make ([]rawLockedProject , len (l .P )),
94
105
}
95
106
96
107
sort .Sort (SortedLockedProjects (l .P ))
97
108
98
109
for k , lp := range l .P {
99
110
id := lp .Ident ()
100
- ld := lockedDep {
111
+ ld := rawLockedProject {
101
112
Name : string (id .ProjectRoot ),
102
113
Source : id .Source ,
103
114
Packages : lp .Packages (),
@@ -106,7 +117,7 @@ func (l *Lock) toRaw() rawLock {
106
117
v := lp .Version ()
107
118
ld .Revision , ld .Branch , ld .Version = getVersionInfo (v )
108
119
109
- raw .P [k ] = ld
120
+ raw .Projects [k ] = ld
110
121
}
111
122
112
123
// TODO sort output - #15
@@ -117,12 +128,11 @@ func (l *Lock) toRaw() rawLock {
117
128
func (l * Lock ) MarshalTOML () (string , error ) {
118
129
raw := l .toRaw ()
119
130
120
- // TODO(carolynvs) Consider adding reflection-based marshal functionality to go-toml
121
131
m := make (map [string ]interface {})
122
132
m ["memo" ] = raw .Memo
123
- p := make ([]map [string ]interface {}, len (raw .P ))
133
+ p := make ([]map [string ]interface {}, len (raw .Projects ))
124
134
for i := 0 ; i < len (p ); i ++ {
125
- srcPrj := raw .P [i ]
135
+ srcPrj := raw .Projects [i ]
126
136
prj := make (map [string ]interface {})
127
137
prj ["name" ] = srcPrj .Name
128
138
prj ["revision" ] = srcPrj .Revision
0 commit comments