59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
package manifest
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"train/pkg/config"
|
|
)
|
|
|
|
type Manifest struct {
|
|
Name string `json:"name"`
|
|
Version string `json:"version"`
|
|
Mode string `json:"mode"`
|
|
Source string `json:"source"`
|
|
Checksum string `json:"checksum"`
|
|
Dependencies []string `json:"dependencies"`
|
|
Build []string `json:"build"`
|
|
Binaries map[string]string `json:"binaries"`
|
|
runtime.GOOS+"_"+runtime.GOARCH
|
|
}
|
|
|
|
func FetchManifest(name string) (*Manifest, error) {
|
|
cfg, err := config.LoadConfig()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var lastErr error
|
|
for _, repo := range cfg.Repositories {
|
|
url := fmt.Sprintf("%s/%s/manifest.json", repo, name)
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
lastErr = err
|
|
continue
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode != 200 {
|
|
lastErr = errors.New("пакет не найден в репозитории " + repo)
|
|
continue
|
|
}
|
|
data, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
lastErr = err
|
|
continue
|
|
}
|
|
var m Manifest
|
|
if err := json.Unmarshal(data, &m); err != nil {
|
|
lastErr = err
|
|
continue
|
|
}
|
|
return &m, nil
|
|
}
|
|
if lastErr == nil {
|
|
lastErr = errors.New("не найден ни один репозиторий")
|
|
}
|
|
return nil, lastErr
|
|
}
|