mirror of
https://github.com/wahyd4/jabba.git
synced 2026-08-09 04:46:17 +10:00
66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package command
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"runtime"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/shyiko/jabba/cfg"
|
|
"github.com/shyiko/jabba/semver"
|
|
)
|
|
|
|
type byOS map[string]byArch
|
|
type byArch map[string]byDistribution
|
|
type byDistribution map[string]map[string]string
|
|
|
|
func LsRemote() (map[*semver.Version]string, error) {
|
|
cnt, err := fetch(cfg.Index())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var index byOS
|
|
err = json.Unmarshal(cnt, &index)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
releaseMap := make(map[*semver.Version]string)
|
|
for key, value := range index[runtime.GOOS][runtime.GOARCH] {
|
|
var prefix string
|
|
if key != "jdk" {
|
|
if !strings.Contains(key, "@") {
|
|
continue
|
|
}
|
|
prefix = key[strings.Index(key, "@")+1:] + "@"
|
|
}
|
|
for ver, url := range value {
|
|
v, err := semver.ParseVersion(prefix + ver)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
releaseMap[v] = url
|
|
}
|
|
}
|
|
return releaseMap, nil
|
|
}
|
|
|
|
func fetch(url string) (content []byte, err error) {
|
|
client := http.Client{Transport: RedirectTracer{}}
|
|
res, err := client.Get(url)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer res.Body.Close()
|
|
if res.StatusCode >= 400 {
|
|
return nil, errors.New("GET " + url + " returned " + strconv.Itoa(res.StatusCode))
|
|
}
|
|
content, err = ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|