@@ -88,13 +88,28 @@ func (v *vndrImporter) convert(pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, er
88
88
var (
89
89
manifest = dep .NewManifest ()
90
90
lock = & dep.Lock {}
91
- err error
92
91
)
93
92
94
93
for _ , pkg := range v .packages {
95
- // ImportPath must not be empty
96
94
if pkg .importPath == "" {
97
- err := errors .New ("Invalid vndr configuration, missing import path" )
95
+ err := errors .New ("Invalid vndr configuration, import path is required" )
96
+ return nil , nil , err
97
+ }
98
+
99
+ // Obtain ProjectRoot. Required for avoiding sub-package imports.
100
+ ip , err := v .sm .DeduceProjectRoot (pkg .importPath )
101
+ if err != nil {
102
+ return nil , nil , err
103
+ }
104
+ pkg .importPath = string (ip )
105
+
106
+ // Check if it already existing in locked projects
107
+ if projectExistsInLock (lock , ip ) {
108
+ continue
109
+ }
110
+
111
+ if pkg .reference == "" {
112
+ err := errors .New ("Invalid vndr configuration, revision is required" )
98
113
return nil , nil , err
99
114
}
100
115
@@ -103,10 +118,28 @@ func (v *vndrImporter) convert(pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, er
103
118
ProjectRoot : gps .ProjectRoot (pkg .importPath ),
104
119
Source : pkg .repository ,
105
120
},
121
+ Constraint : gps .Any (),
106
122
}
107
- pc .Constraint , err = v .sm .InferConstraint (pkg .revision , pc .Ident )
123
+
124
+ // A vndr entry could contain either a version or a revision
125
+ isVersion , version , err := isVersion (pc .Ident , pkg .reference , v .sm )
108
126
if err != nil {
109
- return nil , nil , errors .Wrapf (err , "Unable to interpret revision specifier '%s' for package %s" , pkg .importPath , pkg .revision )
127
+ return nil , nil , err
128
+ }
129
+
130
+ // If the reference is a revision, check if it is tagged with a version
131
+ if ! isVersion {
132
+ revision := gps .Revision (pkg .reference )
133
+ version , err = lookupVersionForLockedProject (pc .Ident , nil , revision , v .sm )
134
+ if err != nil {
135
+ v .logger .Println (err .Error ())
136
+ }
137
+ }
138
+
139
+ // Try to build a constraint from the version
140
+ pp := getProjectPropertiesFromVersion (version )
141
+ if pp .Constraint != nil {
142
+ pc .Constraint = pp .Constraint
110
143
}
111
144
112
145
manifest .Constraints [pc .Ident .ProjectRoot ] = gps.ProjectProperties {
@@ -115,14 +148,7 @@ func (v *vndrImporter) convert(pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, er
115
148
}
116
149
fb .NewConstraintFeedback (pc , fb .DepTypeImported ).LogFeedback (v .logger )
117
150
118
- revision := gps .Revision (pkg .revision )
119
- version , err := lookupVersionForLockedProject (pc .Ident , pc .Constraint , revision , v .sm )
120
- if err != nil {
121
- v .logger .Println (err .Error ())
122
- }
123
-
124
151
lp := gps .NewLockedProject (pc .Ident , version , nil )
125
-
126
152
lock .P = append (lock .P , lp )
127
153
fb .NewLockedProjectFeedback (lp , fb .DepTypeImported ).LogFeedback (v .logger )
128
154
}
@@ -132,7 +158,7 @@ func (v *vndrImporter) convert(pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, er
132
158
133
159
type vndrPackage struct {
134
160
importPath string
135
- revision string
161
+ reference string
136
162
repository string
137
163
}
138
164
@@ -155,7 +181,7 @@ func parseVndrLine(line string) (*vndrPackage, error) {
155
181
156
182
pkg := & vndrPackage {
157
183
importPath : parts [0 ],
158
- revision : parts [1 ],
184
+ reference : parts [1 ],
159
185
}
160
186
if len (parts ) == 3 {
161
187
pkg .repository = parts [2 ]
0 commit comments