-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlistdir.go
85 lines (72 loc) · 2.07 KB
/
listdir.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"sort"
"strings"
"github.com/blang/semver"
)
const goURL = `https://go.dev/dl/?mode=json` // List of latest production versions
var verbose = flag.Bool("v", false, "Print verbose instructions.")
type GoPackage struct {
Version string
Stable bool
v semver.Version
}
type GoPackages []*GoPackage
func (g GoPackages) Len() int { return len(g) }
func (g GoPackages) Less(i, j int) bool { return g[i].v.LT(g[j].v) }
func (g GoPackages) Swap(i, j int) { g[i], g[j] = g[j], g[i] }
// GoVersionToSemVer tries to convert a Go version to something that can be
// parsed into something resembling a SemVer.
//
// Dear $DEITY, why was this not done before!?!
//
// $AUTHOR proposes that future versions of Go follow a more parseable and
// simple format: $THING-$SEMVER.EXTENSIONS
//
// For example:
//
// go-1.8-beta.1+linux-s390x.tar.gz
// go-tools-1.8.1+src.tar.gz
func GoVersionToSemVer(name string) (semver.Version, error) {
// Because we have something even more... ugh, don't even.
return semver.ParseTolerant(strings.TrimPrefix(name, "go"))
}
func main() {
flag.Parse()
resp, err := http.Get(goURL)
if err != nil {
log.Fatalf("Error retrieving Go versions: %v", err)
}
buf, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Error reading response: %v", err)
}
var versions GoPackages
if err := json.Unmarshal(buf, &versions); err != nil {
log.Fatalf("Error parsing Go versions: %v", err)
}
for _, pkg := range versions {
pkg.v, err = GoVersionToSemVer(pkg.Version)
if err != nil {
log.Fatalf("Error decoding Go version %q: %v", pkg.Version, err)
}
}
sort.Sort(sort.Reverse(versions))
if len(versions) <= 0 {
log.Fatal("No Go versions detected!")
}
if *verbose {
fmt.Println("# Run the following commands:")
fmt.Printf("go install golang.org/dl/%s@latest\n", versions[0].Version)
fmt.Printf("%s download\n", versions[0].Version)
fmt.Printf("ln -sf $(which %s) $(which go)\n", versions[0].Version)
} else {
fmt.Println(versions[0].Version)
}
}