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