Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit 6ec3f52

Browse files
committed
cmd/dep: Move importers under internal/importers
1 parent 28fb6b0 commit 6ec3f52

28 files changed

+1018
-879
lines changed

cmd/dep/base_importer_test.go

-574
This file was deleted.

cmd/dep/gopath_scanner.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ func contains(a []string, b string) bool {
150150
return false
151151
}
152152

153-
// getProjectPropertiesFromVersion takes a gps.Version and returns a proper
154-
// gps.ProjectProperties with Constraint value based on the provided version.
153+
// getProjectPropertiesFromVersion takes a Version and returns a proper
154+
// ProjectProperties with Constraint value based on the provided version.
155155
func getProjectPropertiesFromVersion(v gps.Version) gps.ProjectProperties {
156156
pp := gps.ProjectProperties{}
157157

cmd/dep/gopath_scanner_test.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package main
66

77
import (
8+
"io/ioutil"
9+
"log"
810
"reflect"
911
"testing"
1012

@@ -16,12 +18,25 @@ import (
1618
const testProject1 string = "github.com/sdboyer/deptest"
1719
const testProject2 string = "github.com/sdboyer/deptestdos"
1820

21+
// NewTestContext creates a unique context with its own GOPATH for a single test.
22+
func NewTestContext(h *test.Helper) *dep.Ctx {
23+
h.TempDir("src")
24+
pwd := h.Path(".")
25+
discardLogger := log.New(ioutil.Discard, "", 0)
26+
27+
return &dep.Ctx{
28+
GOPATH: pwd,
29+
Out: discardLogger,
30+
Err: discardLogger,
31+
}
32+
}
33+
1934
func TestGopathScanner_OverlayManifestConstraints(t *testing.T) {
2035
h := test.NewHelper(t)
2136
h.Parallel()
2237
defer h.Cleanup()
2338

24-
ctx := newTestContext(h)
39+
ctx := NewTestContext(h)
2540

2641
pi1 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject1)}
2742
pi2 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject2)}
@@ -74,7 +89,7 @@ func TestGopathScanner_OverlayLockProjects(t *testing.T) {
7489
h.Parallel()
7590
defer h.Cleanup()
7691

77-
ctx := newTestContext(h)
92+
ctx := NewTestContext(h)
7893

7994
rootM := dep.NewManifest()
8095
pi1 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject1)}

cmd/dep/init_test.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
package main
66

77
import (
8-
"testing"
9-
108
"path/filepath"
9+
"testing"
1110

1211
"github.com/golang/dep"
1312
"github.com/golang/dep/internal/gps"
@@ -18,7 +17,7 @@ func TestGetDirectDependencies_ConsolidatesRootProjects(t *testing.T) {
1817
h := test.NewHelper(t)
1918
defer h.Cleanup()
2019

21-
ctx := newTestContext(h)
20+
ctx := NewTestContext(h)
2221
sm, err := ctx.SourceManager()
2322
h.Must(err)
2423
defer sm.Release()

cmd/dep/prune_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package main
66

77
import (
8+
"io/ioutil"
9+
"log"
810
"path/filepath"
911
"reflect"
1012
"sort"
@@ -27,6 +29,8 @@ func TestCalculatePrune(t *testing.T) {
2729
filepath.FromSlash("github.com/keep/pkg/sub"),
2830
}
2931

32+
discardLogger := log.New(ioutil.Discard, "", 0)
33+
3034
got, err := calculatePrune(h.Path(vendorDir), toKeep, discardLogger)
3135
if err != nil {
3236
t.Fatal(err)

cmd/dep/root_analyzer.go

+2-16
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,9 @@ import (
1111
"github.com/golang/dep"
1212
fb "github.com/golang/dep/internal/feedback"
1313
"github.com/golang/dep/internal/gps"
14+
"github.com/golang/dep/internal/importers"
1415
)
1516

16-
// importer handles importing configuration from other dependency managers into
17-
// the dep configuration format.
18-
type importer interface {
19-
Name() string
20-
Import(path string, pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, error)
21-
HasDepMetadata(dir string) bool
22-
}
23-
2417
// rootAnalyzer supplies manifest/lock data from both dep and external tool's
2518
// configuration files.
2619
// * When used on the root project, it imports only from external tools.
@@ -66,14 +59,7 @@ func (a *rootAnalyzer) importManifestAndLock(dir string, pr gps.ProjectRoot, sup
6659
logger = log.New(ioutil.Discard, "", 0)
6760
}
6861

69-
importers := []importer{
70-
newGlideImporter(logger, a.ctx.Verbose, a.sm),
71-
newGodepImporter(logger, a.ctx.Verbose, a.sm),
72-
newVndrImporter(logger, a.ctx.Verbose, a.sm),
73-
newGovendImporter(logger, a.ctx.Verbose, a.sm),
74-
}
75-
76-
for _, i := range importers {
62+
for _, i := range importers.BuildAll(logger, a.ctx.Verbose, a.sm) {
7763
if i.HasDepMetadata(dir) {
7864
a.ctx.Err.Printf("Importing configuration from %s. These are only initial constraints, and are further refined during the solve process.", i.Name())
7965
m, l, err := i.Import(dir, pr)

cmd/dep/base_importer.go internal/importers/base/base_importer.go

+53-37
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
package main
5+
package base
66

77
import (
88
"log"
@@ -13,29 +13,30 @@ import (
1313
"github.com/pkg/errors"
1414
)
1515

16-
// baseImporter provides a common implementation for importing from other
16+
// Importer provides a common implementation for importing from other
1717
// dependency managers.
18-
type baseImporter struct {
19-
logger *log.Logger
20-
verbose bool
21-
sm gps.SourceManager
22-
manifest *dep.Manifest
23-
lock *dep.Lock
18+
type Importer struct {
19+
sm gps.SourceManager
20+
21+
Logger *log.Logger
22+
Verbose bool
23+
Manifest *dep.Manifest
24+
Lock *dep.Lock
2425
}
2526

26-
// newBaseImporter creates a new baseImporter for embedding in an importer.
27-
func newBaseImporter(logger *log.Logger, verbose bool, sm gps.SourceManager) *baseImporter {
28-
return &baseImporter{
29-
logger: logger,
30-
verbose: verbose,
31-
manifest: dep.NewManifest(),
32-
lock: &dep.Lock{},
27+
// NewImporter creates a new Importer for embedding in an importer.
28+
func NewImporter(logger *log.Logger, verbose bool, sm gps.SourceManager) *Importer {
29+
return &Importer{
30+
Logger: logger,
31+
Verbose: verbose,
32+
Manifest: dep.NewManifest(),
33+
Lock: &dep.Lock{},
3334
sm: sm,
3435
}
3536
}
3637

3738
// isTag determines if the specified value is a tag (plain or semver).
38-
func (i *baseImporter) isTag(pi gps.ProjectIdentifier, value string) (bool, gps.Version, error) {
39+
func (i *Importer) isTag(pi gps.ProjectIdentifier, value string) (bool, gps.Version, error) {
3940
versions, err := i.sm.ListVersions(pi)
4041
if err != nil {
4142
return false, nil, errors.Wrapf(err, "unable to list versions for %s(%s)", pi.ProjectRoot, pi.Source)
@@ -58,7 +59,7 @@ func (i *baseImporter) isTag(pi gps.ProjectIdentifier, value string) (bool, gps.
5859
// project based on the locked revision and the constraint from the manifest.
5960
// First try matching the revision to a version, then try the constraint from the
6061
// manifest, then finally the revision.
61-
func (i *baseImporter) lookupVersionForLockedProject(pi gps.ProjectIdentifier, c gps.Constraint, rev gps.Revision) (gps.Version, error) {
62+
func (i *Importer) lookupVersionForLockedProject(pi gps.ProjectIdentifier, c gps.Constraint, rev gps.Revision) (gps.Version, error) {
6263
// Find the version that goes with this revision, if any
6364
versions, err := i.sm.ListVersions(pi)
6465
if err != nil {
@@ -98,9 +99,9 @@ func (i *baseImporter) lookupVersionForLockedProject(pi gps.ProjectIdentifier, c
9899
return rev, nil
99100
}
100101

101-
// importedPackage is a common intermediate representation of a package imported
102+
// ImportedPackage is a common intermediate representation of a package imported
102103
// from an external tool's configuration.
103-
type importedPackage struct {
104+
type ImportedPackage struct {
104105
// Required. The package path, not necessarily the project root.
105106
Name string
106107

@@ -118,11 +119,11 @@ type importedPackage struct {
118119
// for the same project root.
119120
type importedProject struct {
120121
Root gps.ProjectRoot
121-
importedPackage
122+
ImportedPackage
122123
}
123124

124125
// loadPackages consolidates all package references into a set of project roots.
125-
func (i *baseImporter) loadPackages(packages []importedPackage) ([]importedProject, error) {
126+
func (i *Importer) loadPackages(packages []ImportedPackage) ([]importedProject, error) {
126127
// preserve the original order of the packages so that messages that
127128
// are printed as they are processed are in a consistent order.
128129
orderedProjects := make([]importedProject, 0, len(packages))
@@ -161,7 +162,7 @@ func (i *baseImporter) loadPackages(packages []importedPackage) ([]importedProje
161162
return orderedProjects, nil
162163
}
163164

164-
// importPackages loads imported packages into the manifest and lock.
165+
// ImportPackages loads imported packages into the manifest and lock.
165166
// - defaultConstraintFromLock specifies if a constraint should be defaulted
166167
// based on the locked version when there wasn't a constraint hint.
167168
//
@@ -172,7 +173,7 @@ func (i *baseImporter) loadPackages(packages []importedPackage) ([]importedProje
172173
// * Revision constraints are ignored.
173174
// * Versions that don't satisfy the constraint, drop the constraint.
174175
// * Untagged revisions ignore non-branch constraint hints.
175-
func (i *baseImporter) importPackages(packages []importedPackage, defaultConstraintFromLock bool) (err error) {
176+
func (i *Importer) ImportPackages(packages []ImportedPackage, defaultConstraintFromLock bool) (err error) {
176177
projects, err := i.loadPackages(packages)
177178
if err != nil {
178179
return err
@@ -206,54 +207,54 @@ func (i *baseImporter) importPackages(packages []importedPackage, defaultConstra
206207
version, err = i.lookupVersionForLockedProject(pc.Ident, pc.Constraint, revision)
207208
if err != nil {
208209
version = nil
209-
i.logger.Println(err)
210+
i.Logger.Println(err)
210211
}
211212
}
212213

213214
// Default the constraint based on the locked version
214215
if defaultConstraintFromLock && prj.ConstraintHint == "" && version != nil {
215-
props := getProjectPropertiesFromVersion(version)
216-
if props.Constraint != nil {
217-
pc.Constraint = props.Constraint
216+
c := i.convertToConstraint(version)
217+
if c != nil {
218+
pc.Constraint = c
218219
}
219220
}
220221
}
221222

222223
// Ignore pinned constraints
223224
if i.isConstraintPinned(pc.Constraint) {
224-
if i.verbose {
225-
i.logger.Printf(" Ignoring pinned constraint %v for %v.\n", pc.Constraint, pc.Ident)
225+
if i.Verbose {
226+
i.Logger.Printf(" Ignoring pinned constraint %v for %v.\n", pc.Constraint, pc.Ident)
226227
}
227228
pc.Constraint = gps.Any()
228229
}
229230

230231
// Ignore constraints which conflict with the locked revision, so that
231232
// solve doesn't later change the revision to satisfy the constraint.
232233
if !i.testConstraint(pc.Constraint, version) {
233-
if i.verbose {
234-
i.logger.Printf(" Ignoring constraint %v for %v because it would invalidate the locked version %v.\n", pc.Constraint, pc.Ident, version)
234+
if i.Verbose {
235+
i.Logger.Printf(" Ignoring constraint %v for %v because it would invalidate the locked version %v.\n", pc.Constraint, pc.Ident, version)
235236
}
236237
pc.Constraint = gps.Any()
237238
}
238239

239-
i.manifest.Constraints[pc.Ident.ProjectRoot] = gps.ProjectProperties{
240+
i.Manifest.Constraints[pc.Ident.ProjectRoot] = gps.ProjectProperties{
240241
Source: pc.Ident.Source,
241242
Constraint: pc.Constraint,
242243
}
243-
fb.NewConstraintFeedback(pc, fb.DepTypeImported).LogFeedback(i.logger)
244+
fb.NewConstraintFeedback(pc, fb.DepTypeImported).LogFeedback(i.Logger)
244245

245246
if version != nil {
246247
lp := gps.NewLockedProject(pc.Ident, version, nil)
247-
i.lock.P = append(i.lock.P, lp)
248-
fb.NewLockedProjectFeedback(lp, fb.DepTypeImported).LogFeedback(i.logger)
248+
i.Lock.P = append(i.Lock.P, lp)
249+
fb.NewLockedProjectFeedback(lp, fb.DepTypeImported).LogFeedback(i.Logger)
249250
}
250251
}
251252

252253
return nil
253254
}
254255

255256
// isConstraintPinned returns if a constraint is pinned to a specific revision.
256-
func (i *baseImporter) isConstraintPinned(c gps.Constraint) bool {
257+
func (i *Importer) isConstraintPinned(c gps.Constraint) bool {
257258
if version, isVersion := c.(gps.Version); isVersion {
258259
switch version.Type() {
259260
case gps.IsRevision, gps.IsVersion:
@@ -264,7 +265,7 @@ func (i *baseImporter) isConstraintPinned(c gps.Constraint) bool {
264265
}
265266

266267
// testConstraint verifies that the constraint won't invalidate the locked version.
267-
func (i *baseImporter) testConstraint(c gps.Constraint, v gps.Version) bool {
268+
func (i *Importer) testConstraint(c gps.Constraint, v gps.Version) bool {
268269
// Assume branch constraints are satisfied
269270
if version, isVersion := c.(gps.Version); isVersion {
270271
if version.Type() == gps.IsBranch {
@@ -275,3 +276,18 @@ func (i *baseImporter) testConstraint(c gps.Constraint, v gps.Version) bool {
275276

276277
return c.Matches(v)
277278
}
279+
280+
// convertToConstraint turns a version into a constraint.
281+
// Semver tags are converted to a range with the caret operator.
282+
func (i *Importer) convertToConstraint(v gps.Version) gps.Constraint {
283+
if v.Type() == gps.IsSemver {
284+
c, err := gps.NewSemverConstraintIC(v.String())
285+
if err != nil {
286+
// This should never fail, because the type is semver.
287+
// If it does fail somehow, don't let that impact the import.
288+
return nil
289+
}
290+
return c
291+
}
292+
return v
293+
}

0 commit comments

Comments
 (0)