diff --git a/analyzer.go b/analyzer.go index 1d0b920ec5..bb715d86f7 100644 --- a/analyzer.go +++ b/analyzer.go @@ -48,6 +48,6 @@ func (a Analyzer) DeriveManifestAndLock(path string, n gps.ProjectRoot) (gps.Man func (a Analyzer) Info() gps.ProjectAnalyzerInfo { return gps.ProjectAnalyzerInfo{ Name: "dep", - Version: 1, + Version: gps.SolverVersion, } } diff --git a/analyzer_test.go b/analyzer_test.go index 40b7307422..1b8308e1b3 100644 --- a/analyzer_test.go +++ b/analyzer_test.go @@ -107,7 +107,7 @@ func TestAnalyzerInfo(t *testing.T) { info := a.Info() - if info.Name != "dep" || info.Version != 1 { - t.Fatalf("expected name to be 'dep' and version to be 1: name -> %q vers -> %d", info.Name, info.Version) + if info.Name != "dep" || info.Version != 2 { + t.Fatalf("expected name to be 'dep' and version to be 2: name -> %q vers -> %d", info.Name, info.Version) } } diff --git a/cmd/dep/root_analyzer.go b/cmd/dep/root_analyzer.go index 76d410fe6e..f4d6ab5b04 100644 --- a/cmd/dep/root_analyzer.go +++ b/cmd/dep/root_analyzer.go @@ -204,6 +204,6 @@ func (a *rootAnalyzer) FinalizeRootManifestAndLock(m *dep.Manifest, l *dep.Lock, func (a *rootAnalyzer) Info() gps.ProjectAnalyzerInfo { return gps.ProjectAnalyzerInfo{ Name: "dep", - Version: 1, + Version: gps.SolverVersion, } } diff --git a/cmd/dep/testdata/harness_tests/ensure/add/all-new-double-spec/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/all-new-double-spec/final/Gopkg.lock index eddb25596a..e2aed20943 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/all-new-double-spec/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/all-new-double-spec/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "645b5b52e1bfb9e3db1cefde758485e009edfe5bad611b490582d94467f9c1b0" + analyzer-version = 2 + inputs-digest = "6f7325449b0a6001070f60acdfe1ff0e4ce0cd968416557c261d6a3edc70a5a1" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/all-new-double/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/all-new-double/final/Gopkg.lock index 8481da4451..d95e9d8806 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/all-new-double/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/all-new-double/final/Gopkg.lock @@ -18,7 +18,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "432bc141db9511df4e1b5754c6c4d8cf4dd8b4f8d5a13fd7d189c17c14e000b7" + analyzer-version = 2 + inputs-digest = "608de3caed8b6c56161445eca6fa7732028271808f6d5684a23fe883f969d507" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/all-new-spec/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/all-new-spec/final/Gopkg.lock index eddb25596a..e2aed20943 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/all-new-spec/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/all-new-spec/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "645b5b52e1bfb9e3db1cefde758485e009edfe5bad611b490582d94467f9c1b0" + analyzer-version = 2 + inputs-digest = "6f7325449b0a6001070f60acdfe1ff0e4ce0cd968416557c261d6a3edc70a5a1" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/all-new/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/all-new/final/Gopkg.lock index 5531a3e128..1a2cee90b6 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/all-new/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/all-new/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "8f0b74fd1169808bd0e31dd7ad6c601c7b8f7ef25eec9e8a45e72b8a384ebb5c" + analyzer-version = 2 + inputs-digest = "dd2d82465aacf2c5e433353bddfc6a1015cda248e7ba57610f2683dc373a81f4" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/desync/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/desync/final/Gopkg.lock index a9d0374ee3..b2d3d021ca 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/desync/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/desync/final/Gopkg.lock @@ -21,7 +21,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "86240895e0ee5788e7e8bb56e0d77afd58009a491b69f6835e546db9e5dacfcd" + analyzer-version = 2 + inputs-digest = "e0815a054bb39387215ea8f7f2cdfa2f4796a4c86fb21b06a0cebc5c92a3c180" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/errs/double-diff-spec/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/errs/double-diff-spec/final/Gopkg.lock index 66ef021c68..94fae01a02 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/errs/double-diff-spec/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/errs/double-diff-spec/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "342afd8c8a616d084eb7b67bf3a891710eca3ce5abc3cf60af0dae4ccfdcd001" + analyzer-version = 2 + inputs-digest = "873e09dd7923308d8050742b50e0803da0241a3af52f9ec63643476304f9618d" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/errs/self-add/case2/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/errs/self-add/case2/final/Gopkg.lock index bef2d0092e..c50f461bb2 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/errs/self-add/case2/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/errs/self-add/case2/final/Gopkg.lock @@ -3,7 +3,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "ab4fef131ee828e96ba67d31a7d690bd5f2f42040c6766b1b12fe856f87e0ff7" + analyzer-version = 2 + inputs-digest = "e15611a472d165d76907171674e7dfbee8f87ba99c2db426cc98a36ca71ec965" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/exists-imports/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/exists-imports/final/Gopkg.lock index 66ef021c68..94fae01a02 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/exists-imports/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/exists-imports/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "342afd8c8a616d084eb7b67bf3a891710eca3ce5abc3cf60af0dae4ccfdcd001" + analyzer-version = 2 + inputs-digest = "873e09dd7923308d8050742b50e0803da0241a3af52f9ec63643476304f9618d" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/add/exists-manifest-constraint/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/add/exists-manifest-constraint/final/Gopkg.lock index e235bce702..bb60cd025f 100644 --- a/cmd/dep/testdata/harness_tests/ensure/add/exists-manifest-constraint/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/add/exists-manifest-constraint/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "d1fe1d4f4dd98b75908b524bd73d43a4b9e3ce0b9522ea6ce9d6c9ea15190c1d" + analyzer-version = 2 + inputs-digest = "9d2aa051d9a08629d657b8a9764a0b1390a5ba9475455fda1089abd805a8b845" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/final/Gopkg.lock index c7f497e7a1..3926ccc79d 100644 --- a/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/initial/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/initial/Gopkg.lock index c7f497e7a1..3926ccc79d 100644 --- a/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/initial/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor-dry/initial/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor/final/Gopkg.lock index c7f497e7a1..3926ccc79d 100644 --- a/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/default/hasheq-novendor/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/default/hasheq/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/default/hasheq/final/Gopkg.lock index c7f497e7a1..3926ccc79d 100644 --- a/cmd/dep/testdata/harness_tests/ensure/default/hasheq/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/default/hasheq/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/final/Gopkg.lock index 11cb12c378..5231aff981 100644 --- a/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 + analyzer-version = 2 # manually modified hash digest, it will not match any known inputs inputs-digest = "94b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" solver-name = "gps-cdcl" diff --git a/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/initial/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/initial/Gopkg.lock index 11cb12c378..5231aff981 100644 --- a/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/initial/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/default/hashneq-novendor-dry/initial/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 + analyzer-version = 2 # manually modified hash digest, it will not match any known inputs inputs-digest = "94b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" solver-name = "gps-cdcl" 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 c7f497e7a1..3926ccc79d 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 @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/empty/case2/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/empty/case2/final/Gopkg.lock index a783451f80..e632b7f849 100644 --- a/cmd/dep/testdata/harness_tests/ensure/empty/case2/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/empty/case2/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "e7725ea56516a42a641aaaf5d48754258d9f3c59949cb8a0e8a21b1ab6e07179" + analyzer-version = 2 + inputs-digest = "0a6ea83f32b678bc9b493f2a19311ddd18386469327d4ced10ef0dfe1f24b0b1" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/empty/case3/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/empty/case3/final/Gopkg.lock index d2153e3747..61859ba4d5 100644 --- a/cmd/dep/testdata/harness_tests/ensure/empty/case3/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/empty/case3/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "e5c16e09ed6f0a1a2b3cf472c34b7fd50861dd070e81d5e623f72e8173f0c065" + analyzer-version = 2 + inputs-digest = "f19e1ec3f0a05fd73e23a1f72ab9f39c7bcc78ab70e0bfdb2b1555df7449a308" solver-name = "gps-cdcl" solver-version = 1 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 bef2d0092e..c50f461bb2 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 @@ -3,7 +3,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "ab4fef131ee828e96ba67d31a7d690bd5f2f42040c6766b1b12fe856f87e0ff7" + analyzer-version = 2 + inputs-digest = "e15611a472d165d76907171674e7dfbee8f87ba99c2db426cc98a36ca71ec965" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/final/Gopkg.lock index 1e637dd503..5d9d0b0ee5 100644 --- a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "5210e61a67f6e64dabb1eb8f28df2dbeeedfca1588c102067a6ec8a35e0b15f9" + analyzer-version = 2 + inputs-digest = "b3a13fc6ac7f14aa988833ff72bd9b77e9ae049428eb2e4239dfcc35fd21bd9a" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/stdout.txt b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/stdout.txt index 74542e41e5..a288df4c6a 100644 --- a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/stdout.txt +++ b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-ignore/stdout.txt @@ -1,11 +1,12 @@ -CONSTRAINTS- github.com/sdboyer/deptest b-master --IMPORTS/REQS- +-IMPORTS- github.com/sdboyer/deptest +-REQUIRES- -IGNORES- -OVERRIDES- -ANALYZER- dep -1 +2 diff --git a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/final/Gopkg.lock index 53e42dcc48..ea0479bbd9 100644 --- a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/final/Gopkg.lock @@ -3,7 +3,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "b02b7a80e20404724ba5dbffab28e772017b03800916327f58bff0da86071b6a" + analyzer-version = 2 + inputs-digest = "7d692d7145bbfc7b7567d992da79cd232147c3f5f984ecc7c8fa1c364f00e303" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/stdout.txt b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/stdout.txt index a273de0e56..858b9bf2a9 100644 --- a/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/stdout.txt +++ b/cmd/dep/testdata/harness_tests/ensure/pkg-ignored/wildcard-other-root/stdout.txt @@ -1,9 +1,10 @@ -CONSTRAINTS- --IMPORTS/REQS- +-IMPORTS- +-REQUIRES- -IGNORES- github.com/sdboyer/deptest* -OVERRIDES- -ANALYZER- dep -1 +2 diff --git a/cmd/dep/testdata/harness_tests/ensure/update/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/update/case1/final/Gopkg.lock index 1a7b1983f3..6c5cfb93e9 100644 --- a/cmd/dep/testdata/harness_tests/ensure/update/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/update/case1/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/update/desync/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/update/desync/final/Gopkg.lock index 1a7b1983f3..6c5cfb93e9 100644 --- a/cmd/dep/testdata/harness_tests/ensure/update/desync/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/update/desync/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/ensure/update/novendor/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/ensure/update/novendor/final/Gopkg.lock index c7f497e7a1..3926ccc79d 100644 --- a/cmd/dep/testdata/harness_tests/ensure/update/novendor/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/ensure/update/novendor/final/Gopkg.lock @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 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 15b4e08bac..bb0535fe65 100644 --- a/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case1/final/Gopkg.lock @@ -14,7 +14,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 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 608d5a8d97..93a5db662d 100644 --- a/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case2/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "ced51326ad990b11098d8076d0f7d72d89eee1ba6e8dacc7bc73be05cddac438" + analyzer-version = 2 + inputs-digest = "db35b7cd62d7fa70480d1ba31ff1ed6aeeb5cb37bfbb07a3f479666ea9e2b995" solver-name = "gps-cdcl" solver-version = 1 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 c4f18284da..a0d22d0341 100644 --- a/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case3/final/Gopkg.lock @@ -14,7 +14,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "af9a783a5430dabcaaf44683c09e2b729e1c0d61f13bfdf6677c4fd0b41387ca" + analyzer-version = 2 + inputs-digest = "f1b556b9eb5a00d2928e92ceb097d364fe41d8337ebb01db76df79faa820aa1f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/case4/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/case4/final/Gopkg.lock index e076e162c8..c4b29bf7bb 100644 --- a/cmd/dep/testdata/harness_tests/init/case4/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/case4/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "a6ba2237d28d125b55fc6c86e94e33363f1dfd880d471118d36d7587398c30b4" + analyzer-version = 2 + inputs-digest = "05fe6e86a940f1d0d3d129d3c5e78e089629038d7d5568d19e47100122010bb9" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/glide/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/glide/case1/final/Gopkg.lock index 7455467c42..7d1da1549a 100644 --- a/cmd/dep/testdata/harness_tests/init/glide/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/glide/case1/final/Gopkg.lock @@ -20,7 +20,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "def34af0f7cd619e1601eb68bdabf399c9b36a79c2081306adefa0ced03d182b" + analyzer-version = 2 + inputs-digest = "93723887fe16f0197aefe5fdfe551df94706da0459da22e61ff2c1b05041e702" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/glide/case2/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/glide/case2/final/Gopkg.lock index ac445c05d2..aebadc02d1 100644 --- a/cmd/dep/testdata/harness_tests/init/glide/case2/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/glide/case2/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1ed417a0bec57ffe988fae1cba8f3d49994fb893394d61844e0b3c96d69573fe" + analyzer-version = 2 + inputs-digest = "41a6b8b70a448d7d4ddc9d8c460865b3bace75de1d20fd8078ec6f1786b5d8bd" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/glide/case4/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/glide/case4/final/Gopkg.lock index 1aadf7f962..17e1101f29 100644 --- a/cmd/dep/testdata/harness_tests/init/glide/case4/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/glide/case4/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1ed417a0bec57ffe988fae1cba8f3d49994fb893394d61844e0b3c96d69573fe" + analyzer-version = 2 + inputs-digest = "41a6b8b70a448d7d4ddc9d8c460865b3bace75de1d20fd8078ec6f1786b5d8bd" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/glock/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/glock/case1/final/Gopkg.lock index ac445c05d2..aebadc02d1 100644 --- a/cmd/dep/testdata/harness_tests/init/glock/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/glock/case1/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1ed417a0bec57ffe988fae1cba8f3d49994fb893394d61844e0b3c96d69573fe" + analyzer-version = 2 + inputs-digest = "41a6b8b70a448d7d4ddc9d8c460865b3bace75de1d20fd8078ec6f1786b5d8bd" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/godep/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/godep/case1/final/Gopkg.lock index ac445c05d2..aebadc02d1 100644 --- a/cmd/dep/testdata/harness_tests/init/godep/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/godep/case1/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1ed417a0bec57ffe988fae1cba8f3d49994fb893394d61844e0b3c96d69573fe" + analyzer-version = 2 + inputs-digest = "41a6b8b70a448d7d4ddc9d8c460865b3bace75de1d20fd8078ec6f1786b5d8bd" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/govend/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/govend/case1/final/Gopkg.lock index ac445c05d2..aebadc02d1 100644 --- a/cmd/dep/testdata/harness_tests/init/govend/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/govend/case1/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1ed417a0bec57ffe988fae1cba8f3d49994fb893394d61844e0b3c96d69573fe" + analyzer-version = 2 + inputs-digest = "41a6b8b70a448d7d4ddc9d8c460865b3bace75de1d20fd8078ec6f1786b5d8bd" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/govendor/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/govendor/case1/final/Gopkg.lock index 529e48897d..8124a26616 100644 --- a/cmd/dep/testdata/harness_tests/init/govendor/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/govendor/case1/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "9cc662f2e1b80c8df205d9d667fe2c47825a06961ceae378f44a8290d01dd359" + analyzer-version = 2 + inputs-digest = "fcf5545863c346b43f2beff07be7f6cef92440115e74b98b5355919163afe4ce" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/gvt/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/gvt/case1/final/Gopkg.lock index 1eb5e5e887..011e2d0bd9 100644 --- a/cmd/dep/testdata/harness_tests/init/gvt/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/gvt/case1/final/Gopkg.lock @@ -22,7 +22,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "d1681978cbca0e845950451461e0d69b58c5e896d9fd10ec5c159a4db3175161" + analyzer-version = 2 + inputs-digest = "0cd9025fc4004cb66bd82ff18cc5a7f8a2890f55373fd53f308abc48fb7c5d78" solver-name = "gps-cdcl" solver-version = 1 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 c7f497e7a1..3926ccc79d 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 @@ -9,7 +9,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "14b07b05e0f01051b03887ab2bf80b516bc5510ea92f75f76c894b1745d8850c" + analyzer-version = 2 + inputs-digest = "2304e215ecdeb7cdf402ddc0e1f4adee4e7a84949d34a2e55ac578b3b6700df6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/init/vndr/case1/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/init/vndr/case1/final/Gopkg.lock index ac445c05d2..aebadc02d1 100644 --- a/cmd/dep/testdata/harness_tests/init/vndr/case1/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/init/vndr/case1/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1ed417a0bec57ffe988fae1cba8f3d49994fb893394d61844e0b3c96d69573fe" + analyzer-version = 2 + inputs-digest = "41a6b8b70a448d7d4ddc9d8c460865b3bace75de1d20fd8078ec6f1786b5d8bd" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/status/case1/dot/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/status/case1/dot/final/Gopkg.lock index 77278d07bc..803fcfecd5 100644 --- a/cmd/dep/testdata/harness_tests/status/case1/dot/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/status/case1/dot/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/status/case1/json/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/status/case1/json/final/Gopkg.lock index 77278d07bc..803fcfecd5 100644 --- a/cmd/dep/testdata/harness_tests/status/case1/json/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/status/case1/json/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/status/case1/table/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/status/case1/table/final/Gopkg.lock index 77278d07bc..803fcfecd5 100644 --- a/cmd/dep/testdata/harness_tests/status/case1/table/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/status/case1/table/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/status/case1/template/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/status/case1/template/final/Gopkg.lock index 77278d07bc..803fcfecd5 100644 --- a/cmd/dep/testdata/harness_tests/status/case1/template/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/status/case1/template/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1b381263a360eafafe3ef7f9be626672668d17250a3c9a8debd169d1b5e2eebb" + analyzer-version = 2 + inputs-digest = "bc0bd4933abeb7e3d12e1097931f7d0690ba29cb0db2fba81e1be0bcb92114a0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/status/override_constraint/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/status/override_constraint/final/Gopkg.lock index f987a57915..97f39af64b 100644 --- a/cmd/dep/testdata/harness_tests/status/override_constraint/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/status/override_constraint/final/Gopkg.lock @@ -15,7 +15,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "1c4444f47ab5d5c484634d1a0c95d99beb879a37337bc0d7aecbd97cf79b6cb1" + analyzer-version = 2 + inputs-digest = "0ec42c7d47cd8e2179ab14c0fe9d67bd3d9304d78b31454b5037b37cb3f47e2c" solver-name = "gps-cdcl" solver-version = 1 diff --git a/cmd/dep/testdata/harness_tests/status/revision_constraint/final/Gopkg.lock b/cmd/dep/testdata/harness_tests/status/revision_constraint/final/Gopkg.lock index 204b990861..c88ca141f9 100644 --- a/cmd/dep/testdata/harness_tests/status/revision_constraint/final/Gopkg.lock +++ b/cmd/dep/testdata/harness_tests/status/revision_constraint/final/Gopkg.lock @@ -14,7 +14,7 @@ [solve-meta] analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "a64abd431f23d6fbc8d83aef311d33ab12b3a6c74a46c271e89c2542c98bbb9a" + analyzer-version = 2 + inputs-digest = "6c494d1713709d50b46c65f142015c2917ceb88cf03f7b2240f822019b743a4a" solver-name = "gps-cdcl" solver-version = 1 diff --git a/gps/hash.go b/gps/hash.go index 556933bcf3..2716cac348 100644 --- a/gps/hash.go +++ b/gps/hash.go @@ -16,7 +16,8 @@ import ( // string headers used to demarcate sections in hash input creation const ( hhConstraints = "-CONSTRAINTS-" - hhImportsReqs = "-IMPORTS/REQS-" + hhImports = "-IMPORTS-" + hhRequires = "-REQUIRES-" hhIgnores = "-IGNORES-" hhOverrides = "-OVERRIDES-" hhAnalyzer = "-ANALYZER-" @@ -68,12 +69,25 @@ func (s *solver) writeHashingInputs(w io.Writer) { } // Write out each discrete import, including those derived from requires. - writeString(hhImportsReqs) - imports := s.rd.externalImportList(s.stdLibFn) + depList := s.rd.externalImportList(s.stdLibFn) + var imports, requires []string + for pr, fromRequired := range depList { + if fromRequired { + requires = append(requires, pr) + } else { + imports = append(imports, pr) + } + } + writeString(hhImports) sort.Strings(imports) for _, im := range imports { writeString(im) } + writeString(hhRequires) + sort.Strings(requires) + for _, req := range requires { + writeString(req) + } // Add ignores, skipping any that point under the current project root; // those will have already been implicitly incorporated by the import diff --git a/gps/hash_test.go b/gps/hash_test.go index 1be02f6870..374d5d10d2 100644 --- a/gps/hash_test.go +++ b/gps/hash_test.go @@ -41,9 +41,10 @@ func TestHashInputs(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, hhAnalyzer, @@ -91,9 +92,10 @@ func TestHashInputsReqsIgs(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, "bar", "foo", @@ -133,9 +135,10 @@ func TestHashInputsReqsIgs(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, "baz", "qux", hhIgnores, @@ -173,9 +176,10 @@ func TestHashInputsReqsIgs(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, "baz", "qux", hhIgnores, @@ -231,9 +235,10 @@ func TestHashInputsOverrides(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, "c", @@ -261,9 +266,10 @@ func TestHashInputsOverrides(t *testing.T) { "c", "car", "any-*", // Any isn't included under the override, but IS for the constraint b/c it's equivalent - hhImportsReqs, + hhImports, "a", "b", + hhRequires, "c", hhIgnores, hhOverrides, @@ -291,10 +297,11 @@ func TestHashInputsOverrides(t *testing.T) { "c", "car", "any-*", // Any isn't included under the override, but IS for the constraint b/c it's equivalent - hhImportsReqs, + hhImports, "a", "b", "c", + hhRequires, hhIgnores, hhOverrides, "c", @@ -319,10 +326,11 @@ func TestHashInputsOverrides(t *testing.T) { "c", "car", "any-*", - hhImportsReqs, + hhImports, "a", "b", "c", + hhRequires, hhIgnores, hhOverrides, "c", @@ -349,10 +357,11 @@ func TestHashInputsOverrides(t *testing.T) { "c", "car", "any-*", - hhImportsReqs, + hhImports, "a", "b", "c", + hhRequires, hhIgnores, hhOverrides, "c", @@ -378,9 +387,10 @@ func TestHashInputsOverrides(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, "c", @@ -407,9 +417,10 @@ func TestHashInputsOverrides(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, "c", @@ -436,9 +447,10 @@ func TestHashInputsOverrides(t *testing.T) { "pv-fluglehorn", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, "a", @@ -468,9 +480,10 @@ func TestHashInputsOverrides(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, "a", @@ -501,9 +514,10 @@ func TestHashInputsOverrides(t *testing.T) { "pv-fluglehorn", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, "a", @@ -621,9 +635,10 @@ func TestHashInputsIneffectualWildcardIgs(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, hhOverrides, hhAnalyzer, @@ -644,9 +659,10 @@ func TestHashInputsIneffectualWildcardIgs(t *testing.T) { "sv-1.0.0", "b", "sv-1.0.0", - hhImportsReqs, + hhImports, "a", "b", + hhRequires, hhIgnores, "foobar*", "foozapbar*", diff --git a/gps/identifier.go b/gps/identifier.go index cf3ca23513..7b80f0915f 100644 --- a/gps/identifier.go +++ b/gps/identifier.go @@ -177,6 +177,10 @@ type bimodalIdentifier struct { prefv Version // Indicates that the bmi came from the root project originally fromRoot bool + // The path to the atom in the graph, e.g. root -> foo -> bar + path []atom + // Indicates that the bmi originated from a require, vs an import + fromRequired bool } type atom struct { @@ -190,20 +194,8 @@ var nilpa = atom{ } type atomWithPackages struct { - a atom - pl []string -} - -// bmi converts an atomWithPackages into a bimodalIdentifier. -// -// This is mostly intended for (read-only) trace use, so the package list slice -// is not copied. It is the callers responsibility to not modify the pl slice, -// lest that backpropagate and cause inconsistencies. -func (awp atomWithPackages) bmi() bimodalIdentifier { - return bimodalIdentifier{ - id: awp.a.id, - pl: awp.pl, - } + a atom + bmi bimodalIdentifier } // completeDep (name hopefully to change) provides the whole picture of a @@ -213,6 +205,8 @@ func (awp atomWithPackages) bmi() bimodalIdentifier { type completeDep struct { // The base workingConstraint workingConstraint + // Indicates that the bmi originated from a require, vs an import + fromRequired bool // The specific packages required from the ProjectDep pl []string } @@ -221,6 +215,6 @@ type completeDep struct { // fully-realized atom as the depender (the tail/source of the edge), and a set // of requirements that any atom to be attached at the head/target must satisfy. type dependency struct { - depender atom + depender atomWithPackages dep completeDep } diff --git a/gps/rootdata.go b/gps/rootdata.go index ee78bdf265..adc3953008 100644 --- a/gps/rootdata.go +++ b/gps/rootdata.go @@ -50,13 +50,20 @@ type rootdata struct { an ProjectAnalyzer } -// externalImportList returns a list of the unique imports from the root data. +// externalImportList returns a map of imports and a flag specifying if the project is from a required. // Ignores and requires are taken into consideration, stdlib is excluded, and // errors within the local set of package are not backpropagated. -func (rd rootdata) externalImportList(stdLibFn func(string) bool) []string { +func (rd rootdata) externalImportList(stdLibFn func(string) bool) map[string]bool { + // projectRoot -> fromRequired (false = import, true = required) + imports := map[string]bool{} + rm, _ := rd.rpt.ToReachMap(true, true, false, rd.ir) reach := rm.FlattenFn(stdLibFn) + for _, r := range reach { + imports[r] = false + } + // If there are any requires, slide them into the reach list, as well. if len(rd.req) > 0 { // Make a map of imports that are both in the import path list and the @@ -70,13 +77,12 @@ func (rd rootdata) externalImportList(stdLibFn func(string) bool) []string { for r := range rd.req { if !skip[r] { - reach = append(reach, r) + imports[r] = true } } } - sort.Strings(reach) - return reach + return imports } func (rd rootdata) getApplicableConstraints(stdLibFn func(string) bool) []workingConstraint { @@ -112,7 +118,7 @@ func (rd rootdata) getApplicableConstraints(stdLibFn func(string) bool) []workin // Walk all dep import paths we have to consider and mark the corresponding // wc entry in the trie, if any - for _, im := range rd.externalImportList(stdLibFn) { + for im := range rd.externalImportList(stdLibFn) { if stdLibFn(im) { continue } @@ -198,7 +204,7 @@ func (rd rootdata) rootAtom() atomWithPackages { sort.Strings(list) return atomWithPackages{ - a: a, - pl: list, + a: a, + bmi: bimodalIdentifier{id: a.id, pl: list}, } } diff --git a/gps/rootdata_test.go b/gps/rootdata_test.go index 381fe8c481..2065f77890 100644 --- a/gps/rootdata_test.go +++ b/gps/rootdata_test.go @@ -29,19 +29,19 @@ func TestRootdataExternalImports(t *testing.T) { } rd := is.(*solver).rd - want := []string{"a", "b"} + want := map[string]bool{"a": false, "b": false} got := rd.externalImportList(params.stdLibFn) if !reflect.DeepEqual(want, got) { - t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %s\n\t(WNT): %s", got, want) + t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %v\n\t(WNT): %v", got, want) } // Add a require rd.req["c"] = true - want = []string{"a", "b", "c"} + want = map[string]bool{"a": false, "b": false, "c": true} got = rd.externalImportList(params.stdLibFn) if !reflect.DeepEqual(want, got) { - t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %s\n\t(WNT): %s", got, want) + t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %v\n\t(WNT): %v", got, want) } // Add same path as import @@ -49,20 +49,20 @@ func TestRootdataExternalImports(t *testing.T) { poe.P.Imports = []string{"a", "b", "c"} rd.rpt.Packages["root"] = poe - // should still be the same + want = map[string]bool{"a": false, "b": false, "c": false} got = rd.externalImportList(params.stdLibFn) if !reflect.DeepEqual(want, got) { - t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %s\n\t(WNT): %s", got, want) + t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %v\n\t(WNT): %v", got, want) } // Add an ignore, but not on the required path (Prepare makes that // combination impossible) rd.ir = pkgtree.NewIgnoredRuleset([]string{"b"}) - want = []string{"a", "c"} + want = map[string]bool{"a": false, "c": false} got = rd.externalImportList(params.stdLibFn) if !reflect.DeepEqual(want, got) { - t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %s\n\t(WNT): %s", got, want) + t.Errorf("Unexpected return from rootdata.externalImportList:\n\t(GOT): %v\n\t(WNT): %v", got, want) } } diff --git a/gps/satisfy.go b/gps/satisfy.go index abac0ea7ef..e71cc7d9df 100644 --- a/gps/satisfy.go +++ b/gps/satisfy.go @@ -4,6 +4,10 @@ package gps +import ( + "go/build" +) + // check performs constraint checks on the provided atom. The set of checks // differ slightly depending on whether the atom is pkgonly, or if it's the // entire project being added for the first time. @@ -11,8 +15,7 @@ package gps // The goal is to determine whether selecting the atom would result in a state // where all the solver requirements are still satisfied. func (s *solver) check(a atomWithPackages, pkgonly bool) error { - pa := a.a - if nilpa == pa { + if nilpa == a.a { // This shouldn't be able to happen, but if it does, it unequivocally // indicates a logical bug somewhere, so blowing up is preferable panic("canary - checking version of empty ProjectAtom") @@ -30,7 +33,7 @@ func (s *solver) check(a atomWithPackages, pkgonly bool) error { // If we're pkgonly, then base atom was already determined to be allowable, // so we can skip the checkAtomAllowable step. if !pkgonly { - if err = s.checkAtomAllowable(pa); err != nil { + if err = s.checkAtomAllowable(a); err != nil { return err } } @@ -78,24 +81,24 @@ func (s *solver) check(a atomWithPackages, pkgonly bool) error { // checkAtomAllowable ensures that an atom itself is acceptable with respect to // the constraints established by the current solution. -func (s *solver) checkAtomAllowable(pa atom) error { - constraint := s.sel.getConstraint(pa.id) - if s.vUnify.matches(pa.id, constraint, pa.v) { +func (s *solver) checkAtomAllowable(awp atomWithPackages) error { + constraint := s.sel.getConstraint(awp.a.id, awp.bmi) + if s.vUnify.matches(awp.a.id, constraint, awp.a.v) { return nil } // TODO(sdboyer) collect constraint failure reason (wait...aren't we, below?) - deps := s.sel.getDependenciesOn(pa.id) + deps := s.sel.getDependenciesOn(awp.a.id) var failparent []dependency for _, dep := range deps { - if !s.vUnify.matches(pa.id, dep.dep.Constraint, pa.v) { - s.fail(dep.depender.id) + if !s.vUnify.matches(awp.a.id, dep.dep.Constraint, awp.a.v) { + s.fail(dep.depender.a.id) failparent = append(failparent, dep) } } err := &versionNotAllowedFailure{ - goal: pa, + goal: awp.a, failparent: failparent, c: constraint, } @@ -120,14 +123,17 @@ func (s *solver) checkRequiredPackagesExist(a atomWithPackages) error { for _, dep := range deps { for _, pkg := range dep.dep.pl { if errdep, seen := fp[pkg]; seen { - errdep.deppers = append(errdep.deppers, dep.depender) + errdep.deppers = append(errdep.deppers, dep.depender.a) fp[pkg] = errdep } else { perr, has := ptree.Packages[pkg] if !has || perr.Err != nil { + if shouldIgnorePackageError(a, perr.Err) { + continue + } fp[pkg] = errDeppers{ err: perr.Err, - deppers: []atom{dep.depender}, + deppers: []atom{dep.depender.a}, } } } @@ -147,7 +153,7 @@ func (s *solver) checkRequiredPackagesExist(a atomWithPackages) error { // given dep are valid with respect to existing constraints. func (s *solver) checkDepsConstraintsAllowable(a atomWithPackages, cdep completeDep) error { dep := cdep.workingConstraint - constraint := s.sel.getConstraint(dep.Ident) + constraint := s.sel.getConstraint(dep.Ident, a.bmi) // Ensure the constraint expressed by the dep has at least some possible // intersection with the intersection of existing constraints. if s.vUnify.matchesAny(dep.Ident, constraint, dep.Constraint) { @@ -160,7 +166,7 @@ func (s *solver) checkDepsConstraintsAllowable(a atomWithPackages, cdep complete var nofailsib []dependency for _, sibling := range siblings { if !s.vUnify.matchesAny(dep.Ident, sibling.dep.Constraint, dep.Constraint) { - s.fail(sibling.depender.id) + s.fail(sibling.depender.a.id) failsib = append(failsib, sibling) } else { nofailsib = append(nofailsib, sibling) @@ -168,7 +174,7 @@ func (s *solver) checkDepsConstraintsAllowable(a atomWithPackages, cdep complete } return &disjointConstraintFailure{ - goal: dependency{depender: a.a, dep: cdep}, + goal: dependency{depender: a, dep: cdep}, failsib: failsib, nofailsib: nofailsib, c: constraint, @@ -185,7 +191,7 @@ func (s *solver) checkDepsDisallowsSelected(a atomWithPackages, cdep completeDep s.fail(dep.Ident) return &constraintNotAllowedFailure{ - goal: dependency{depender: a.a, dep: cdep}, + goal: dependency{depender: a, dep: cdep}, v: selected.a.v, } } @@ -206,7 +212,7 @@ func (s *solver) checkIdentMatches(a atomWithPackages, cdep completeDep) error { // Fail all the other deps, as there's no way atom can ever be // compatible with them for _, d := range deps { - s.fail(d.depender.id) + s.fail(d.depender.a.id) } return &sourceMismatchFailure{ @@ -236,7 +242,7 @@ func (s *solver) checkRootCaseConflicts(a atomWithPackages, cdep completeDep) er curid, _ := s.sel.getIdentFor(current) deps := s.sel.getDependenciesOn(curid) for _, d := range deps { - s.fail(d.depender.id) + s.fail(d.depender.a.id) } // If a project has multiple packages that import each other, we treat that @@ -260,13 +266,13 @@ func (s *solver) checkRootCaseConflicts(a atomWithPackages, cdep completeDep) er if current == a.a.id.ProjectRoot { return &wrongCaseFailure{ correct: pr, - goal: dependency{depender: a.a, dep: cdep}, + goal: dependency{depender: a, dep: cdep}, badcase: deps, } } return &caseMismatchFailure{ - goal: dependency{depender: a.a, dep: cdep}, + goal: dependency{depender: a, dep: cdep}, current: current, failsib: deps, } @@ -289,7 +295,7 @@ func (s *solver) checkPackageImportsFromDepExist(a atomWithPackages, cdep comple e := &depHasProblemPackagesFailure{ goal: dependency{ - depender: a.a, + depender: a, dep: cdep, }, v: sel.a.v, @@ -300,6 +306,9 @@ func (s *solver) checkPackageImportsFromDepExist(a atomWithPackages, cdep comple perr, has := ptree.Packages[pkg] if !has || perr.Err != nil { if has { + if shouldIgnorePackageError(a, perr.Err) { + continue + } e.prob[pkg] = perr.Err } else { e.prob[pkg] = nil @@ -329,9 +338,22 @@ func (s *solver) checkRevisionExists(a atomWithPackages, cdep completeDep) error return &nonexistentRevisionFailure{ goal: dependency{ - depender: a.a, + depender: a, dep: cdep, }, r: r, } } + +// shouldAllowPackageError determines if a an error for a dependency should be overlooked. +// The following package errors should be ignored: +// * The package originated from a "require" and the package does not contain Go code. +func shouldIgnorePackageError(a atomWithPackages, err error) bool { + // Allow a package to not have go code only when it originated from a require, and not an import. + if a.bmi.fromRequired { + _, isNoGoErr := err.(*build.NoGoError) + return isNoGoErr + } + + return false +} diff --git a/gps/selection.go b/gps/selection.go index a74c60ae8d..ea77035e1f 100644 --- a/gps/selection.go +++ b/gps/selection.go @@ -134,7 +134,7 @@ func (s *selection) getSelectedPackagesIn(id ProjectIdentifier) map[string]int { uniq := make(map[string]int) for _, p := range s.projects { if p.a.a.id.eq(id) { - for _, pkg := range p.a.pl { + for _, pkg := range p.a.bmi.pl { uniq[pkg] = uniq[pkg] + 1 } } @@ -143,12 +143,18 @@ func (s *selection) getSelectedPackagesIn(id ProjectIdentifier) map[string]int { return uniq } -func (s *selection) getConstraint(id ProjectIdentifier) Constraint { +func (s *selection) getConstraint(id ProjectIdentifier, bmi bimodalIdentifier) Constraint { deps, exists := s.deps[id.ProjectRoot] if !exists || len(deps) == 0 { return any } + // Enable quick lookup of where in the depgraph a constraint was defined + ancestors := map[ProjectRoot]bool{} + for _, ancestor := range bmi.path { + ancestors[ancestor.id.ProjectRoot] = true + } + // TODO(sdboyer) recomputing this sucks and is quite wasteful. Precompute/cache it // on changes to the constraint set, instead. diff --git a/gps/solve_basic_test.go b/gps/solve_basic_test.go index 910b9d622b..d457aa4c0c 100644 --- a/gps/solve_basic_test.go +++ b/gps/solve_basic_test.go @@ -226,14 +226,15 @@ func mkDepspec(pi string, deps ...string) depspec { func mkDep(atom, pdep string, pl ...string) dependency { return dependency{ - depender: mkAtom(atom), + depender: atomWithPackages{a: mkAtom(atom)}, dep: mkCDep(pdep, pl...), } } func mkADep(atom, pdep string, c Constraint, pl ...string) dependency { return dependency{ - depender: mkAtom(atom), + // TODO(carolynvs): I don't think we need to set the bmi (specifically the path to the atom) in the fixture data. + depender: atomWithPackages{a: mkAtom(atom)}, dep: completeDep{ workingConstraint: workingConstraint{ Ident: ProjectIdentifier{ diff --git a/gps/solve_failures.go b/gps/solve_failures.go index 05daedd707..1026bdc139 100644 --- a/gps/solve_failures.go +++ b/gps/solve_failures.go @@ -78,16 +78,16 @@ type caseMismatchFailure struct { func (e *caseMismatchFailure) Error() string { if len(e.failsib) == 1 { str := "Could not introduce %s due to a case-only variation: it depends on %q, but %q was already established as the case variant for that project root by depender %s" - return fmt.Sprintf(str, a2vs(e.goal.depender), e.goal.dep.Ident.ProjectRoot, e.current, a2vs(e.failsib[0].depender)) + return fmt.Sprintf(str, a2vs(e.goal.depender.a), e.goal.dep.Ident.ProjectRoot, e.current, a2vs(e.failsib[0].depender.a)) } var buf bytes.Buffer str := "Could not introduce %s due to a case-only variation: it depends on %q, but %q was already established as the case variant for that project root by the following other dependers:\n" - fmt.Fprintf(&buf, str, a2vs(e.goal.depender), e.goal.dep.Ident.ProjectRoot, e.current) + fmt.Fprintf(&buf, str, a2vs(e.goal.depender.a), e.goal.dep.Ident.ProjectRoot, e.current) for _, c := range e.failsib { - fmt.Fprintf(&buf, "\t%s\n", a2vs(c.depender)) + fmt.Fprintf(&buf, "\t%s\n", a2vs(c.depender.a)) } return buf.String() @@ -97,7 +97,7 @@ func (e *caseMismatchFailure) traceString() string { var buf bytes.Buffer fmt.Fprintf(&buf, "case-only variation in dependency on %q; %q already established by:\n", e.goal.dep.Ident.ProjectRoot, e.current) for _, f := range e.failsib { - fmt.Fprintf(&buf, "%s\n", a2vs(f.depender)) + fmt.Fprintf(&buf, "%s\n", a2vs(f.depender.a)) } return buf.String() @@ -122,16 +122,16 @@ type wrongCaseFailure struct { func (e *wrongCaseFailure) Error() string { if len(e.badcase) == 1 { str := "Could not introduce %s; imports amongst its packages establish %q as the canonical casing for root, but %s tried to import it as %q" - return fmt.Sprintf(str, a2vs(e.goal.depender), e.correct, a2vs(e.badcase[0].depender), e.badcase[0].dep.Ident.ProjectRoot) + return fmt.Sprintf(str, a2vs(e.goal.depender.a), e.correct, a2vs(e.badcase[0].depender.a), e.badcase[0].dep.Ident.ProjectRoot) } var buf bytes.Buffer str := "Could not introduce %s; imports amongst its packages establish %q as the canonical casing for root, but the following projects tried to import it as %q" - fmt.Fprintf(&buf, str, a2vs(e.goal.depender), e.correct, e.badcase[0].dep.Ident.ProjectRoot) + fmt.Fprintf(&buf, str, a2vs(e.goal.depender.a), e.correct, e.badcase[0].dep.Ident.ProjectRoot) for _, c := range e.badcase { - fmt.Fprintf(&buf, "\t%s\n", a2vs(c.depender)) + fmt.Fprintf(&buf, "\t%s\n", a2vs(c.depender.a)) } return buf.String() @@ -141,7 +141,7 @@ func (e *wrongCaseFailure) traceString() string { var buf bytes.Buffer fmt.Fprintf(&buf, "internal imports establish %q as correct casing; %q was used by:\n", e.correct, e.goal.dep.Ident.ProjectRoot) for _, f := range e.badcase { - fmt.Fprintf(&buf, "%s\n", a2vs(f.depender)) + fmt.Fprintf(&buf, "%s\n", a2vs(f.depender.a)) } return buf.String() @@ -171,7 +171,7 @@ type disjointConstraintFailure struct { func (e *disjointConstraintFailure) Error() string { if len(e.failsib) == 1 { str := "Could not introduce %s, as it has a dependency on %s with constraint %s, which has no overlap with existing constraint %s from %s" - return fmt.Sprintf(str, a2vs(e.goal.depender), e.goal.dep.Ident, e.goal.dep.Constraint.String(), e.failsib[0].dep.Constraint.String(), a2vs(e.failsib[0].depender)) + return fmt.Sprintf(str, a2vs(e.goal.depender.a), e.goal.dep.Ident, e.goal.dep.Constraint.String(), e.failsib[0].dep.Constraint.String(), a2vs(e.failsib[0].depender.a)) } var buf bytes.Buffer @@ -181,16 +181,16 @@ func (e *disjointConstraintFailure) Error() string { sibs = e.failsib str := "Could not introduce %s, as it has a dependency on %s with constraint %s, which has no overlap with the following existing constraints:\n" - fmt.Fprintf(&buf, str, a2vs(e.goal.depender), e.goal.dep.Ident, e.goal.dep.Constraint.String()) + fmt.Fprintf(&buf, str, a2vs(e.goal.depender.a), e.goal.dep.Ident, e.goal.dep.Constraint.String()) } else { sibs = e.nofailsib str := "Could not introduce %s, as it has a dependency on %s with constraint %s, which does not overlap with the intersection of existing constraints from other currently selected packages:\n" - fmt.Fprintf(&buf, str, a2vs(e.goal.depender), e.goal.dep.Ident, e.goal.dep.Constraint.String()) + fmt.Fprintf(&buf, str, a2vs(e.goal.depender.a), e.goal.dep.Ident, e.goal.dep.Constraint.String()) } for _, c := range sibs { - fmt.Fprintf(&buf, "\t%s from %s\n", c.dep.Constraint.String(), a2vs(c.depender)) + fmt.Fprintf(&buf, "\t%s from %s\n", c.dep.Constraint.String(), a2vs(c.depender.a)) } return buf.String() @@ -204,7 +204,7 @@ func (e *disjointConstraintFailure) traceString() string { &buf, "%s from %s (no overlap)\n", f.dep.Constraint.String(), - a2vs(f.depender), + a2vs(f.depender.a), ) } for _, f := range e.nofailsib { @@ -212,7 +212,7 @@ func (e *disjointConstraintFailure) traceString() string { &buf, "%s from %s (some overlap)\n", f.dep.Constraint.String(), - a2vs(f.depender), + a2vs(f.depender.a), ) } @@ -234,7 +234,7 @@ type constraintNotAllowedFailure struct { func (e *constraintNotAllowedFailure) Error() string { return fmt.Sprintf( "Could not introduce %s, as it has a dependency on %s with constraint %s, which does not allow the currently selected version of %s", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), e.goal.dep.Ident, e.goal.dep.Constraint, e.v, @@ -244,7 +244,7 @@ func (e *constraintNotAllowedFailure) Error() string { func (e *constraintNotAllowedFailure) traceString() string { return fmt.Sprintf( "%s depends on %s with %s, but that's already selected at %s", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), e.goal.dep.Ident.ProjectRoot, e.goal.dep.Constraint, e.v, @@ -274,7 +274,7 @@ func (e *versionNotAllowedFailure) Error() string { "Could not introduce %s, as it is not allowed by constraint %s from project %s.", a2vs(e.goal), e.failparent[0].dep.Constraint.String(), - e.failparent[0].depender.id, + e.failparent[0].depender.a.id, ) } @@ -283,7 +283,7 @@ func (e *versionNotAllowedFailure) Error() string { fmt.Fprintf(&buf, "Could not introduce %s, as it is not allowed by constraints from the following projects:\n", a2vs(e.goal)) for _, f := range e.failparent { - fmt.Fprintf(&buf, "\t%s from %s\n", f.dep.Constraint.String(), a2vs(f.depender)) + fmt.Fprintf(&buf, "\t%s from %s\n", f.dep.Constraint.String(), a2vs(f.depender.a)) } return buf.String() @@ -294,7 +294,7 @@ func (e *versionNotAllowedFailure) traceString() string { fmt.Fprintf(&buf, "%s not allowed by constraint %s:\n", a2vs(e.goal), e.c.String()) for _, f := range e.failparent { - fmt.Fprintf(&buf, " %s from %s\n", f.dep.Constraint.String(), a2vs(f.depender)) + fmt.Fprintf(&buf, " %s from %s\n", f.dep.Constraint.String(), a2vs(f.depender.a)) } return buf.String() @@ -333,7 +333,7 @@ type sourceMismatchFailure struct { func (e *sourceMismatchFailure) Error() string { var cur []string for _, c := range e.sel { - cur = append(cur, string(c.depender.id.ProjectRoot)) + cur = append(cur, string(c.depender.a.id.ProjectRoot)) } str := "Could not introduce %s, as it depends on %s from %s, but %s is already marked as coming from %s by %s" @@ -346,7 +346,7 @@ func (e *sourceMismatchFailure) traceString() string { fmt.Fprintf(&buf, " %s from %s\n", e.mismatch, e.prob.id) for _, dep := range e.sel { - fmt.Fprintf(&buf, " %s from %s\n", e.current, dep.depender.id) + fmt.Fprintf(&buf, " %s from %s\n", e.current, dep.depender.a.id) } return buf.String() @@ -485,7 +485,7 @@ func (e *depHasProblemPackagesFailure) Error() string { return fmt.Sprintf( "Could not introduce %s, as it requires package %s from %s, but in version %s that package %s", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), pkg, e.goal.dep.Ident, e.v, @@ -496,7 +496,7 @@ func (e *depHasProblemPackagesFailure) Error() string { var buf bytes.Buffer fmt.Fprintf( &buf, "Could not introduce %s, as it requires problematic packages from %s (current version %s):", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), e.goal.dep.Ident, e.v, ) @@ -526,7 +526,7 @@ func (e *depHasProblemPackagesFailure) traceString() string { fmt.Fprintf( &buf, "%s depping on %s at %s has problem subpkg(s):", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), e.goal.dep.Ident, e.v, ) @@ -556,7 +556,7 @@ type nonexistentRevisionFailure struct { func (e *nonexistentRevisionFailure) Error() string { return fmt.Sprintf( "Could not introduce %s, as it requires %s at revision %s, but that revision does not exist", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), e.goal.dep.Ident, e.r, ) @@ -565,7 +565,7 @@ func (e *nonexistentRevisionFailure) Error() string { func (e *nonexistentRevisionFailure) traceString() string { return fmt.Sprintf( "%s wants missing rev %s of %s", - a2vs(e.goal.depender), + a2vs(e.goal.depender.a), e.r, e.goal.dep.Ident, ) diff --git a/gps/solver.go b/gps/solver.go index bede9d53b4..ed23b1f1af 100644 --- a/gps/solver.go +++ b/gps/solver.go @@ -20,6 +20,9 @@ import ( "github.com/pkg/errors" ) +// SolverVersion is the current version of the solver/hashing algorithm. +const SolverVersion = 2 + var rootRev = Revision("") // SolveParameters hold all arguments to a solver run. @@ -419,7 +422,7 @@ func ValidateParams(params SolveParameters, sm SourceManager) error { deducePkgsGroup.Done() } - for _, ip := range rd.externalImportList(paths.IsStandardImportPath) { + for ip := range rd.externalImportList(paths.IsStandardImportPath) { deducePkgsGroup.Add(1) go deducePkg(ip, sm) } @@ -538,7 +541,7 @@ func (s *solver) solve(ctx context.Context) (map[atom]map[string]struct{}, error id: queue.id, v: queue.current(), }, - pl: bmi.pl, + bmi: bmi, } err = s.selectAtom(awp, false) s.mtr.pop() @@ -566,7 +569,7 @@ func (s *solver) solve(ctx context.Context) (map[atom]map[string]struct{}, error id: bmi.id, v: awp.a.v, }, - pl: bmi.pl, + bmi: bmi, } s.traceCheckPkgs(bmi) @@ -610,7 +613,7 @@ func (s *solver) solve(ctx context.Context) (map[atom]map[string]struct{}, error projs[sel.a.a] = pm } - for _, path := range sel.a.pl { + for _, path := range sel.a.bmi.pl { pm[path] = struct{}{} } } @@ -644,9 +647,12 @@ func (s *solver) selectRoot() error { go s.b.SyncSourceFor(dep.Ident) } - s.sel.pushDep(dependency{depender: awp.a, dep: dep}) + s.sel.pushDep(dependency{ + depender: awp, + dep: dep, + }) // Add all to unselected queue - heap.Push(s.unsel, bimodalIdentifier{id: dep.Ident, pl: dep.pl, fromRoot: true}) + heap.Push(s.unsel, bimodalIdentifier{id: dep.Ident, fromRequired: dep.fromRequired, pl: dep.pl, fromRoot: true}) } s.traceSelectRoot(s.rd.rpt, deps) @@ -677,7 +683,7 @@ func (s *solver) getImportsAndConstraintsOf(a atomWithPackages) ([]string, []com // Use maps to dedupe the unique internal and external packages. exmap, inmap := make(map[string]struct{}), make(map[string]struct{}) - for _, pkg := range a.pl { + for _, pkg := range a.bmi.pl { inmap[pkg] = struct{}{} for _, ipkg := range rm[pkg].Internal { inmap[ipkg] = struct{}{} @@ -687,8 +693,8 @@ func (s *solver) getImportsAndConstraintsOf(a atomWithPackages) ([]string, []com var pl []string // If lens are the same, then the map must have the same contents as the // slice; no need to build a new one. - if len(inmap) == len(a.pl) { - pl = a.pl + if len(inmap) == len(a.bmi.pl) { + pl = a.bmi.pl } else { pl = make([]string, 0, len(inmap)) for pkg := range inmap { @@ -699,7 +705,7 @@ func (s *solver) getImportsAndConstraintsOf(a atomWithPackages) ([]string, []com // Add to the list those packages that are reached by the packages // explicitly listed in the atom - for _, pkg := range a.pl { + for _, pkg := range a.bmi.pl { // Skip ignored packages if s.rd.ir.IsIgnored(pkg) { continue @@ -710,6 +716,9 @@ func (s *solver) getImportsAndConstraintsOf(a atomWithPackages) ([]string, []com // Missing package here *should* only happen if the target pkg was // poisoned; check the errors map. if importErr, eexists := em[pkg]; eexists { + if shouldIgnorePackageError(a, importErr.Err) { + continue + } return nil, nil, importErr } @@ -722,11 +731,10 @@ func (s *solver) getImportsAndConstraintsOf(a atomWithPackages) ([]string, []com } } - reach := make([]string, 0, len(exmap)) + reach := make(map[string]bool, len(exmap)) for pkg := range exmap { - reach = append(reach, pkg) + reach[pkg] = true } - sort.Strings(reach) deps := s.rd.ovr.overrideAll(m.DependencyConstraints()) cd, err := s.intersectConstraintsWithImports(deps, reach) @@ -737,7 +745,7 @@ func (s *solver) getImportsAndConstraintsOf(a atomWithPackages) ([]string, []com // externally reached packages, and creates a []completeDep that is guaranteed // to include all packages named by import reach, using constraints where they // are available, or Any() where they are not. -func (s *solver) intersectConstraintsWithImports(deps []workingConstraint, reach []string) ([]completeDep, error) { +func (s *solver) intersectConstraintsWithImports(deps []workingConstraint, imports map[string]bool) ([]completeDep, error) { // Create a radix tree with all the projects we know from the manifest xt := radix.New() for _, dep := range deps { @@ -747,7 +755,7 @@ func (s *solver) intersectConstraintsWithImports(deps []workingConstraint, reach // Step through the reached packages; if they have prefix matches in // the trie, assume (mostly) it's a correct correspondence. dmap := make(map[ProjectRoot]completeDep) - for _, rp := range reach { + for rp, fromRequired := range imports { // If it's a stdlib-shaped package, skip it. if s.stdLibFn(rp) { continue @@ -767,6 +775,7 @@ func (s *solver) intersectConstraintsWithImports(deps []workingConstraint, reach dmap[dep.Ident.ProjectRoot] = completeDep{ workingConstraint: dep, pl: []string{rp}, + fromRequired: fromRequired, } } continue @@ -788,6 +797,7 @@ func (s *solver) intersectConstraintsWithImports(deps []workingConstraint, reach // And also put the complete dep into the dmap dmap[root] = completeDep{ workingConstraint: pd, + fromRequired: fromRequired, pl: []string{rp}, } } @@ -827,7 +837,7 @@ func (s *solver) createVersionQueue(bmi bimodalIdentifier) (*versionQueue, error var lockv Version if len(s.rd.rlm) > 0 { - lockv, err = s.getLockVersionIfValid(id) + lockv, err = s.getLockVersionIfValid(id, bmi) if err != nil { // Can only get an error here if an upgrade was expressly requested on // code that exists only in vendor @@ -844,11 +854,11 @@ func (s *solver) createVersionQueue(bmi bimodalIdentifier) (*versionQueue, error // TODO(sdboyer) nested loop; prime candidate for a cache somewhere for _, dep := range s.sel.getDependenciesOn(bmi.id) { // Skip the root, of course - if s.rd.isRoot(dep.depender.id.ProjectRoot) { + if s.rd.isRoot(dep.depender.a.id.ProjectRoot) { continue } - _, l, err := s.b.GetManifestAndLock(dep.depender.id, dep.depender.v, s.rd.an) + _, l, err := s.b.GetManifestAndLock(dep.depender.a.id, dep.depender.a.v, s.rd.an) if err != nil || l == nil { // err being non-nil really shouldn't be possible, but the lock // being nil is quite likely @@ -902,7 +912,7 @@ func (s *solver) createVersionQueue(bmi bimodalIdentifier) (*versionQueue, error // TODO(sdboyer) while this does work, it bypasses the interface-implied guarantees // of the version queue, and is therefore not a great strategy for API // coherency. Folding this in to a formal interface would be better. - if tc, ok := s.sel.getConstraint(bmi.id).(Revision); ok && q.pi[0] != tc { + if tc, ok := s.sel.getConstraint(bmi.id, bmi).(Revision); ok && q.pi[0] != tc { // We know this is the only thing that could possibly match, so put it // in at the front - if it isn't there already. // TODO(sdboyer) existence of the revision is guaranteed by checkRevisionExists(); restore that call. @@ -911,7 +921,7 @@ func (s *solver) createVersionQueue(bmi bimodalIdentifier) (*versionQueue, error // Having assembled the queue, search it for a valid version. s.traceCheckQueue(q, bmi, false, 1) - return q, s.findValidVersion(q, bmi.pl) + return q, s.findValidVersion(q, bmi) } // findValidVersion walks through a versionQueue until it finds a version that @@ -920,7 +930,7 @@ func (s *solver) createVersionQueue(bmi bimodalIdentifier) (*versionQueue, error // The satisfiability checks triggered from here are constrained to operate only // on those dependencies induced by the list of packages given in the second // parameter. -func (s *solver) findValidVersion(q *versionQueue, pl []string) error { +func (s *solver) findValidVersion(q *versionQueue, bmi bimodalIdentifier) error { if nil == q.current() { // this case should not be reachable, but reflects improper solver state // if it is, so panic immediately @@ -937,7 +947,7 @@ func (s *solver) findValidVersion(q *versionQueue, pl []string) error { id: q.id, v: cur, }, - pl: pl, + bmi: bmi, }, false) if err == nil { // we have a good version, can return safely @@ -954,7 +964,7 @@ func (s *solver) findValidVersion(q *versionQueue, pl []string) error { } } - s.fail(s.sel.getDependenciesOn(q.id)[0].depender.id) + s.fail(s.sel.getDependenciesOn(q.id)[0].depender.a.id) // Return a compound error of all the new errors encountered during this // attempt to find a new, valid version @@ -973,7 +983,7 @@ func (s *solver) findValidVersion(q *versionQueue, pl []string) error { // // If any of these three conditions are true (or if the id cannot be found in // the root lock), then no atom will be returned. -func (s *solver) getLockVersionIfValid(id ProjectIdentifier) (Version, error) { +func (s *solver) getLockVersionIfValid(id ProjectIdentifier, bmi bimodalIdentifier) (Version, error) { // If the project is specifically marked for changes, then don't look for a // locked version. if _, explicit := s.rd.chng[id.ProjectRoot]; explicit || s.rd.chngall { @@ -1004,7 +1014,7 @@ func (s *solver) getLockVersionIfValid(id ProjectIdentifier) (Version, error) { return nil, nil } - constraint := s.sel.getConstraint(id) + constraint := s.sel.getConstraint(id, bmi) v := lp.Version() if !constraint.Matches(v) { var found bool @@ -1082,7 +1092,7 @@ func (s *solver) backtrack(ctx context.Context) (bool, error) { } return false, err } - s.traceBacktrack(awp.bmi(), !proj) + s.traceBacktrack(awp.bmi, !proj) } } @@ -1102,7 +1112,7 @@ func (s *solver) backtrack(ctx context.Context) (bool, error) { } return false, err } - s.traceBacktrack(awp.bmi(), !proj) + s.traceBacktrack(awp.bmi, !proj) } if !q.id.eq(awp.a.id) { @@ -1113,8 +1123,8 @@ func (s *solver) backtrack(ctx context.Context) (bool, error) { // TODO(sdboyer) is it feasible to make available the failure reason here? if q.advance(nil) == nil && !q.isExhausted() { // Search for another acceptable version of this failed dep in its queue - s.traceCheckQueue(q, awp.bmi(), true, 0) - if s.findValidVersion(q, awp.pl) == nil { + s.traceCheckQueue(q, awp.bmi, true, 0) + if s.findValidVersion(q, awp.bmi) == nil { // Found one! Put it back on the selected queue and stop // backtracking @@ -1131,7 +1141,7 @@ func (s *solver) backtrack(ctx context.Context) (bool, error) { } } - s.traceBacktrack(awp.bmi(), false) + s.traceBacktrack(awp.bmi, false) // No solution found; continue backtracking after popping the queue // we just inspected off the list @@ -1251,7 +1261,7 @@ func (s *solver) selectAtom(a atomWithPackages, pkgonly bool) error { s.mtr.push("select-atom") s.unsel.remove(bimodalIdentifier{ id: a.a.id, - pl: a.pl, + pl: a.bmi.pl, }) pl, deps, err := s.getImportsAndConstraintsOf(a) @@ -1265,7 +1275,7 @@ func (s *solver) selectAtom(a atomWithPackages, pkgonly bool) error { } // Assign the new internal package list into the atom, then push it onto the // selection stack - a.pl = pl + a.bmi.pl = pl s.sel.pushSelection(a, pkgonly) // If this atom has a lock, pull it out so that we can potentially inject @@ -1307,7 +1317,11 @@ func (s *solver) selectAtom(a atomWithPackages, pkgonly bool) error { go s.b.SyncSourceFor(dep.Ident) } - s.sel.pushDep(dependency{depender: a.a, dep: dep}) + s.sel.pushDep(dependency{ + depender: a, + dep: dep, + }) + // Go through all the packages introduced on this dep, selecting only // the ones where the only depper on them is what the preceding line just // pushed in. Then, put those into the unselected queue. @@ -1330,11 +1344,13 @@ func (s *solver) selectAtom(a atomWithPackages, pkgonly bool) error { // alternate source, and one without. See #969. id, _ := s.sel.getIdentFor(dep.Ident.ProjectRoot) bmi := bimodalIdentifier{ - id: id, - pl: newp, + id: id, + pl: newp, + fromRequired: dep.fromRequired, // This puts in a preferred version if one's in the map, else // drops in the zero value (nil) prefv: lmap[dep.Ident], + path: append(a.bmi.path, a.a), } heap.Push(s.unsel, bmi) } @@ -1350,7 +1366,7 @@ func (s *solver) unselectLast() (atomWithPackages, bool, error) { s.mtr.push("unselect") defer s.mtr.pop() awp, first := s.sel.popSelection() - heap.Push(s.unsel, bimodalIdentifier{id: awp.a.id, pl: awp.pl}) + heap.Push(s.unsel, bimodalIdentifier{id: awp.a.id, pl: awp.bmi.pl, fromRequired: awp.bmi.fromRequired, path: awp.bmi.path}) _, deps, err := s.getImportsAndConstraintsOf(awp) if err != nil { diff --git a/gps/trace.go b/gps/trace.go index 4c579d30aa..bfd0bf6b7a 100644 --- a/gps/trace.go +++ b/gps/trace.go @@ -140,9 +140,9 @@ func (s *solver) traceSelect(awp atomWithPackages, pkgonly bool) { var msg string if pkgonly { - msg = fmt.Sprintf("%s%s include %v more pkgs from %s", innerIndent, successChar, len(awp.pl), a2vs(awp.a)) + msg = fmt.Sprintf("%s%s include %v more pkgs from %s", innerIndent, successChar, len(awp.bmi.pl), a2vs(awp.a)) } else { - msg = fmt.Sprintf("%s select %s w/%v pkgs", successChar, a2vs(awp.a), len(awp.pl)) + msg = fmt.Sprintf("%s select %s w/%v pkgs", successChar, a2vs(awp.a), len(awp.bmi.pl)) } prefix := getprei(len(s.sel.projects) - 1)