diff --git a/.bazelci/config.yml b/.bazelci/config.yml index 8931217a..f57a631f 100644 --- a/.bazelci/config.yml +++ b/.bazelci/config.yml @@ -3,6 +3,8 @@ platforms: ubuntu1604: test_targets: - //:go_bazelisk_test + - //:go_default_test + - //:go_version_test - //:py_bazelisk_test - //:py3_bazelisk_test test_flags: @@ -11,6 +13,8 @@ platforms: ubuntu1804: test_targets: - //:go_bazelisk_test + - //:go_default_test + - //:go_version_test - //:py_bazelisk_test - //:py3_bazelisk_test test_flags: @@ -19,6 +23,8 @@ platforms: macos: test_targets: - //:go_bazelisk_test + - //:go_default_test + - //:go_version_test - //:py_bazelisk_test - //:py3_bazelisk_test test_flags: @@ -27,6 +33,8 @@ platforms: windows: test_targets: - //:go_bazelisk_test + - //:go_default_test + - //:go_version_test - //:py_bazelisk_test test_flags: - --flaky_test_attempts=1 diff --git a/BUILD b/BUILD index e1d77002..affb6999 100644 --- a/BUILD +++ b/BUILD @@ -70,6 +70,10 @@ go_test( embed = [":go_default_library"], importpath = "github.com/bazelbuild/bazelisk", deps = [ + "//core", + "//httputil", + "//repositories", + "//versions", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], ) diff --git a/bazelisk_version_test.go b/bazelisk_version_test.go index 9e897f21..f0e54c3d 100644 --- a/bazelisk_version_test.go +++ b/bazelisk_version_test.go @@ -61,6 +61,32 @@ func TestResolveLatestRcVersion(t *testing.T) { } } +func TestResolveLatestVersion_TwoLatestVersionsDoNotHaveAReleaseYet(t *testing.T) { + listBody := buildGCSResponseOrFail(t, []string{"4.0.0/", "5.0.0/", "6.0.0/"}, []interface{}{}) + transport.AddResponse("https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/", 200, listBody) + + v4ReleaseBucket := buildGCSResponseOrFail(t, []string{}, []interface{}{"fake_release_item__since_this_is_a_release"}) + transport.AddResponse("https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/&prefix=4.0.0/release/", 200, v4ReleaseBucket) + + v5ReleaseBucket := buildGCSResponseOrFail(t, []string{}, []interface{}{}) + transport.AddResponse("https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/&prefix=5.0.0/release/", 200, v5ReleaseBucket) + + v6ReleaseBucket := buildGCSResponseOrFail(t, []string{}, []interface{}{}) + transport.AddResponse("https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/&prefix=6.0.0/release/", 200, v6ReleaseBucket) + + gcs := &repositories.GCSRepo{} + repos := core.CreateRepositories(gcs, nil, nil, nil, false) + version, _, err := repos.ResolveVersion(tmpDir, versions.BazelUpstream, "latest") + + if err != nil { + t.Fatalf("Version resolution failed unexpectedly: %v", err) + } + expectedVersion := "4.0.0" + if version != expectedVersion { + t.Fatalf("Expected version %s, but got %s", expectedVersion, version) + } +} + func TestResolveLatestVersion_GCSIsDown(t *testing.T) { transport.AddResponse("https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/", 500, "") diff --git a/core/repositories.go b/core/repositories.go index 8b007927..9e73b0bc 100644 --- a/core/repositories.go +++ b/core/repositories.go @@ -1,4 +1,3 @@ -// Package core contains interfaces to work with Bazel repositories. package core import ( diff --git a/repositories/gcs.go b/repositories/gcs.go index b02abe42..6950f32e 100644 --- a/repositories/gcs.go +++ b/repositories/gcs.go @@ -49,14 +49,22 @@ func getVersionHistoryFromGCS(onlyFullReleases bool) ([]string, error) { available := getVersionsFromGCSPrefixes(prefixes) sorted := versions.GetInAscendingOrder(available) - if onlyFullReleases && len(sorted) > 0 { - latestVersion := sorted[len(sorted)-1] - _, isRelease, err := listDirectoriesInReleaseBucket(latestVersion + "/release/") - if err != nil { - return []string{}, fmt.Errorf("could not list release candidates for latest release: %v", err) + // TODO(#171): This algorithm is incorrect if version == 'latest-n' and any of the last n versions (except the last one) does not have a release yet. + if onlyFullReleases { + for len(sorted) > 0 { + lastIndex := len(sorted) - 1 + latestVersion := sorted[lastIndex] + _, isRelease, err := listDirectoriesInReleaseBucket(latestVersion + "/release/") + if err != nil { + return []string{}, fmt.Errorf("could not list available releases for %v: %v", latestVersion, err) + } + if isRelease { + break + } + sorted = sorted[:lastIndex] } - if !isRelease { - sorted = sorted[:len(sorted)-1] + if len(sorted) == 0 { + return []string{}, errors.New("there are no releases available") } }