diff --git a/cmd/dep/init.go b/cmd/dep/init.go index 34ece9831b..dcce874df7 100644 --- a/cmd/dep/init.go +++ b/cmd/dep/init.go @@ -21,16 +21,14 @@ import ( const initShortHelp = `Initialize a new project with manifest and lock files` const initLongHelp = ` -Initialize the project at filepath root by parsing its dependencies and writing -manifest and lock files. If root isn't specified, use the current directory. +Initialize the project at filepath root by parsing its dependencies, writing +manifest and lock files, and vendoring the dependencies. If root isn't +specified, use the current directory. The version of each dependency will reflect the current state of the GOPATH. If -a dependency doesn't exist in the GOPATH, it won't be written to the manifest, -but it will be solved-for, and will appear in the lock. - -Note: init may use the network to solve the dependency graph. - -Note: init does NOT vendor dependencies at the moment. See dep ensure. +a dependency doesn't exist in the GOPATH, the network would be used to +solve-for, and the solution will appear in manifest and lock. Solved +dependencies will be vendored in vendor/ dir relative to project root. ` func (cmd *initCommand) Name() string { return "init" } @@ -139,33 +137,51 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error { ) } - if len(pd.notondisk) > 0 { - internal.Vlogf("Solving...") - params := gps.SolveParameters{ - RootDir: root, - RootPackageTree: pkgT, - Manifest: m, - Lock: l, - ProjectAnalyzer: dep.Analyzer{}, - } + // Run solver with project versions found on disk + internal.Vlogf("Solving...") + params := gps.SolveParameters{ + RootDir: root, + RootPackageTree: pkgT, + Manifest: m, + Lock: l, + ProjectAnalyzer: dep.Analyzer{}, + } - if *verbose { - params.Trace = true - params.TraceLogger = log.New(os.Stderr, "", 0) - } - s, err := gps.Prepare(params, sm) - if err != nil { - return errors.Wrap(err, "prepare solver") - } + if *verbose { + params.Trace = true + params.TraceLogger = log.New(os.Stderr, "", 0) + } + s, err := gps.Prepare(params, sm) + if err != nil { + return errors.Wrap(err, "prepare solver") + } - soln, err := s.Solve() - if err != nil { - handleAllTheFailuresOfTheWorld(err) - return err + soln, err := s.Solve() + if err != nil { + handleAllTheFailuresOfTheWorld(err) + return err + } + l = dep.LockFromInterface(soln) + + // Pick notondisk project constraints from solution and add to manifest + for k, _ := range pd.notondisk { + for _, x := range l.Projects() { + if k == x.Ident().ProjectRoot { + m.Dependencies[k] = getProjectPropertiesFromVersion(x.Version()) + break + } } - l = dep.LockFromInterface(soln) } + // Run gps.Prepare with appropriate constraint solutions from solve run + // to generate the final lock memo. + s, err = gps.Prepare(params, sm) + if err != nil { + return errors.Wrap(err, "prepare solver") + } + + l.Memo = s.HashInputs() + internal.Vlogf("Writing manifest and lock files.") var sw dep.SafeWriter @@ -213,6 +229,34 @@ func hasImportPathPrefix(s, prefix string) bool { return strings.HasPrefix(s, prefix+"/") } +// getProjectPropertiesFromVersion takes a gps.Version and returns a proper +// gps.ProjectProperties with Constraint value based on the provided version. +func getProjectPropertiesFromVersion(v gps.Version) gps.ProjectProperties { + pp := gps.ProjectProperties{} + + // extract version and ignore if it's revision only + switch tv := v.(type) { + case gps.PairedVersion: + v = tv.Unpair() + case gps.Revision: + return pp + } + + switch v.Type() { + case gps.IsBranch, gps.IsVersion: + pp.Constraint = v + case gps.IsSemver: + // TODO: remove "^" when https://github.com/golang/dep/issues/225 is ready. + c, err := gps.NewSemverConstraint("^" + v.String()) + if err != nil { + panic(err) + } + pp.Constraint = c + } + + return pp +} + type projectData struct { constraints gps.ProjectConstraints // constraints that could be found dependencies map[gps.ProjectRoot][]string // all dependencies (imports) found by project root @@ -267,16 +311,7 @@ func getProjectData(ctx *dep.Ctx, pkgT pkgtree.PackageTree, cpr string, sm *gps. } ondisk[pr] = v - pp := gps.ProjectProperties{} - switch v.Type() { - case gps.IsBranch, gps.IsVersion, gps.IsRevision: - pp.Constraint = v - case gps.IsSemver: - c, _ := gps.NewSemverConstraint("^" + v.String()) - pp.Constraint = c - } - - constraints[pr] = pp + constraints[pr] = getProjectPropertiesFromVersion(v) } internal.Vlogf("Analyzing transitive imports...") diff --git a/cmd/dep/init_test.go b/cmd/dep/init_test.go index 58a9a0575e..3cd4ff7775 100644 --- a/cmd/dep/init_test.go +++ b/cmd/dep/init_test.go @@ -4,7 +4,11 @@ package main -import "testing" +import ( + "testing" + + "github.com/sdboyer/gps" +) func TestContains(t *testing.T) { a := []string{"a", "b", "abcd"} @@ -33,3 +37,46 @@ func TestIsStdLib(t *testing.T) { } } } + +func TestGetProjectPropertiesFromVersion(t *testing.T) { + cases := []struct { + version gps.Version + want gps.Version + }{ + { + version: gps.NewBranch("foo-branch"), + want: gps.NewBranch("foo-branch"), + }, + { + version: gps.NewVersion("foo-version"), + want: gps.NewVersion("foo-version"), + }, + { + version: gps.NewBranch("foo-branch").Is("some-revision"), + want: gps.NewBranch("foo-branch"), + }, + { + version: gps.NewVersion("foo-version").Is("some-revision"), + want: gps.NewVersion("foo-version"), + }, + { + version: gps.Revision("some-revision"), + want: nil, + }, + } + + for _, c := range cases { + actualProp := getProjectPropertiesFromVersion(c.version) + if c.want != actualProp.Constraint { + t.Fatalf("Expected project property to be %v, got %v", actualProp.Constraint, c.want) + } + } + + // Test to have caret in semver version + outsemver := getProjectPropertiesFromVersion(gps.NewVersion("v1.0.0")) + wantSemver, _ := gps.NewSemverConstraint("^1.0.0") + + if outsemver.Constraint.String() != wantSemver.String() { + t.Fatalf("Expected semver to be %v, got %v", outsemver.Constraint, wantSemver) + } +} diff --git a/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.lock index 3897b39726..2b9c20975d 100644 --- a/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.lock @@ -1,4 +1,4 @@ -memo = "4b36ae008ef4be09dee7e2ae00606d44fd75f4310fd0d0ef6e744690290569de" +memo = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" [[projects]] name = "github.com/sdboyer/deptest" diff --git a/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.toml b/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.toml index 6b7a32babb..26987273ec 100644 --- a/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.toml +++ b/cmd/dep/testdata/harness_tests/ensure/empty/case1/final/Gopkg.toml @@ -50,3 +50,7 @@ # source = "https://github.com/myfork/package.git" + +[[dependencies]] + name = "github.com/sdboyer/deptest" + version = "^1.0.0" diff --git a/cmd/dep/testdata/harness_tests/ensure/override/case1/final/Gopkg.toml b/cmd/dep/testdata/harness_tests/ensure/override/case1/final/Gopkg.toml index 6b7a32babb..26987273ec 100644 --- a/cmd/dep/testdata/harness_tests/ensure/override/case1/final/Gopkg.toml +++ b/cmd/dep/testdata/harness_tests/ensure/override/case1/final/Gopkg.toml @@ -50,3 +50,7 @@ # source = "https://github.com/myfork/package.git" + +[[dependencies]] + name = "github.com/sdboyer/deptest" + version = "^1.0.0" diff --git a/cmd/dep/testdata/harness_tests/ensure/pkg-errors/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/pkg-errors/case1/final/Gopkg.lock index 4f812e9048..70280d1ade 100644 --- a/cmd/dep/testdata/harness_tests/ensure/pkg-errors/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/pkg-errors/case1/final/Gopkg.lock @@ -1 +1 @@ -memo = "" +memo = "ab4fef131ee828e96ba67d31a7d690bd5f2f42040c6766b1b12fe856f87e0ff7" diff --git a/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.lock index 20091c76a5..d43aa9f9ac 100644 --- a/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.lock @@ -1,4 +1,4 @@ -memo = "" +memo = "88d2718cda70cce45158f953d2c6ead79c1db38e67e9704aff72be8fddb096e7" [[projects]] name = "github.com/sdboyer/deptest" diff --git a/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.toml b/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.toml index 05db85d196..0681d4cf62 100644 --- a/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.toml +++ b/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.toml @@ -5,4 +5,3 @@ [[dependencies]] name = "github.com/sdboyer/deptestdos" - revision = "a0196baa11ea047dd65037287451d36b861b00ea" diff --git a/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.lock index 9b7e4cbf29..50ed86f68e 100644 --- a/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.lock @@ -1,4 +1,4 @@ -memo = "88d2718cda70cce45158f953d2c6ead79c1db38e67e9704aff72be8fddb096e7" +memo = "b4fe6e8bceac924197838b6ea47989abbdd3a8d31035d20ee0a1dabc0994c368" [[projects]] name = "github.com/sdboyer/deptest" diff --git a/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.toml b/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.toml index a5284b92c0..487298ca78 100644 --- a/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.toml +++ b/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.toml @@ -2,3 +2,7 @@ [[dependencies]] name = "github.com/sdboyer/deptest" version = ">=0.8.0, <1.0.0" + +[[dependencies]] + name = "github.com/sdboyer/deptestdos" + version = "^2.0.0" diff --git a/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.lock index 66d52b35ae..465f59501e 100644 --- a/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.lock @@ -1,4 +1,4 @@ -memo = "" +memo = "af9a783a5430dabcaaf44683c09e2b729e1c0d61f13bfdf6677c4fd0b41387ca" [[projects]] branch = "master" diff --git a/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.toml b/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.toml index 74acf5e6a6..bccfadb86a 100644 --- a/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.toml +++ b/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.toml @@ -5,4 +5,3 @@ [[dependencies]] name = "github.com/sdboyer/deptestdos" - revision = "a0196baa11ea047dd65037287451d36b861b00ea" diff --git a/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.lock index 3897b39726..2b9c20975d 100644 --- a/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.lock @@ -1,4 +1,4 @@ -memo = "4b36ae008ef4be09dee7e2ae00606d44fd75f4310fd0d0ef6e744690290569de" +memo = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" [[projects]] name = "github.com/sdboyer/deptest" diff --git a/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.toml b/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.toml index e69de29bb2..d5f3e3c9d6 100644 --- a/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.toml +++ b/cmd/dep/testdata/harness_tests/init/skip-hidden/final/Gopkg.toml @@ -0,0 +1,4 @@ + +[[dependencies]] + name = "github.com/sdboyer/deptest" + version = "^1.0.0"