xref: /aosp_15_r20/external/bazelbuild-rules_go/go/tools/releaser/boilerplate.go (revision 9bb1b549b6a84214c53be0924760be030e66b93a)
1*9bb1b549SSpandan Das// Copyright 2021 The Bazel Authors. All rights reserved.
2*9bb1b549SSpandan Das//
3*9bb1b549SSpandan Das// Licensed under the Apache License, Version 2.0 (the "License");
4*9bb1b549SSpandan Das// you may not use this file except in compliance with the License.
5*9bb1b549SSpandan Das// You may obtain a copy of the License at
6*9bb1b549SSpandan Das//
7*9bb1b549SSpandan Das//    http://www.apache.org/licenses/LICENSE-2.0
8*9bb1b549SSpandan Das//
9*9bb1b549SSpandan Das// Unless required by applicable law or agreed to in writing, software
10*9bb1b549SSpandan Das// distributed under the License is distributed on an "AS IS" BASIS,
11*9bb1b549SSpandan Das// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9bb1b549SSpandan Das// See the License for the specific language governing permissions and
13*9bb1b549SSpandan Das// limitations under the License.
14*9bb1b549SSpandan Das
15*9bb1b549SSpandan Daspackage main
16*9bb1b549SSpandan Das
17*9bb1b549SSpandan Dasimport (
18*9bb1b549SSpandan Das	"encoding/json"
19*9bb1b549SSpandan Das	"errors"
20*9bb1b549SSpandan Das	"fmt"
21*9bb1b549SSpandan Das	"io"
22*9bb1b549SSpandan Das	"net/http"
23*9bb1b549SSpandan Das	"sort"
24*9bb1b549SSpandan Das
25*9bb1b549SSpandan Das	"golang.org/x/mod/semver"
26*9bb1b549SSpandan Das)
27*9bb1b549SSpandan Das
28*9bb1b549SSpandan Dasfunc genBoilerplate(version, shasum, goVersion string) string {
29*9bb1b549SSpandan Das	return fmt.Sprintf(`load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
30*9bb1b549SSpandan Das
31*9bb1b549SSpandan Dashttp_archive(
32*9bb1b549SSpandan Das    name = "io_bazel_rules_go",
33*9bb1b549SSpandan Das    sha256 = "%[2]s",
34*9bb1b549SSpandan Das    urls = [
35*9bb1b549SSpandan Das        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/%[1]s/rules_go-%[1]s.zip",
36*9bb1b549SSpandan Das        "https://github.com/bazelbuild/rules_go/releases/download/%[1]s/rules_go-%[1]s.zip",
37*9bb1b549SSpandan Das    ],
38*9bb1b549SSpandan Das)
39*9bb1b549SSpandan Das
40*9bb1b549SSpandan Dasload("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
41*9bb1b549SSpandan Das
42*9bb1b549SSpandan Dasgo_rules_dependencies()
43*9bb1b549SSpandan Das
44*9bb1b549SSpandan Dasgo_register_toolchains(version = "%[3]s")`, version, shasum, goVersion)
45*9bb1b549SSpandan Das}
46*9bb1b549SSpandan Das
47*9bb1b549SSpandan Dasfunc findLatestGoVersion() (v string, err error) {
48*9bb1b549SSpandan Das	defer func() {
49*9bb1b549SSpandan Das		if err != nil {
50*9bb1b549SSpandan Das			err = fmt.Errorf("finding latest go version: %w", err)
51*9bb1b549SSpandan Das		}
52*9bb1b549SSpandan Das	}()
53*9bb1b549SSpandan Das	resp, err := http.Get("https://golang.org/dl/?mode=json")
54*9bb1b549SSpandan Das	if err != nil {
55*9bb1b549SSpandan Das		return "", err
56*9bb1b549SSpandan Das	}
57*9bb1b549SSpandan Das	defer resp.Body.Close()
58*9bb1b549SSpandan Das	data, err := io.ReadAll(resp.Body)
59*9bb1b549SSpandan Das	if err != nil {
60*9bb1b549SSpandan Das		return "", err
61*9bb1b549SSpandan Das	}
62*9bb1b549SSpandan Das	type version struct {
63*9bb1b549SSpandan Das		Version string
64*9bb1b549SSpandan Das	}
65*9bb1b549SSpandan Das	var versions []version
66*9bb1b549SSpandan Das	if err := json.Unmarshal(data, &versions); err != nil {
67*9bb1b549SSpandan Das		return "", err
68*9bb1b549SSpandan Das	}
69*9bb1b549SSpandan Das	if len(versions) == 0 {
70*9bb1b549SSpandan Das		return "", errors.New("no versions found")
71*9bb1b549SSpandan Das	}
72*9bb1b549SSpandan Das	sort.Slice(versions, func(i, j int) bool {
73*9bb1b549SSpandan Das		vi := "v" + versions[i].Version[len("go"):]
74*9bb1b549SSpandan Das		vj := "v" + versions[j].Version[len("go"):]
75*9bb1b549SSpandan Das		return semver.Compare(vi, vj) > 0
76*9bb1b549SSpandan Das	})
77*9bb1b549SSpandan Das	return versions[0].Version[len("go"):], nil
78*9bb1b549SSpandan Das}
79