Compare commits

...

2 Commits

Author SHA1 Message Date
wheelchairy
bf5a670f80 upd repo.json 2025-02-05 17:17:25 +03:00
wheelchairy
b9fe96e56c upd repo.json 2025-02-05 17:17:10 +03:00
6 changed files with 73 additions and 31 deletions

View File

@ -1,5 +1,5 @@
{
"repositories": [
"https://xn--80abmlgju2eo3byb.xn--p1ai/repo"
]
"repo": "https://xn--80abmlgju2eo3byb.xn--p1ai/repo.json",
"repositories": [],
"packages": {}
}

View File

@ -43,10 +43,8 @@ func BuildNewBinary(tarballURL string) (buildDir string, newBinPath string, err
return "", "", fmt.Errorf("failed to unpack tarball: %w", err)
}
// Пытаемся найти go.mod в корне распакованного архива
goModPath := filepath.Join(tmpDir, "go.mod")
if _, err := os.Stat(goModPath); os.IsNotExist(err) {
// Если не найден, проверяем, есть ли ровно один подкаталог
entries, err := ioutil.ReadDir(tmpDir)
if err != nil {
os.RemoveAll(tmpDir)

View File

@ -2,33 +2,35 @@ package config
import (
"encoding/json"
"errors"
"io/ioutil"
"os"
"path/filepath"
"train/pkg/paths"
)
type Config struct {
Repo string `json:"repo"`
Repositories []string `json:"repositories"`
Packages map[string]string `json:"packages"`
}
var configFile string
func init() {
railsConfig := filepath.Join(paths.BaseDir(), "config", "config.json")
home, err := os.UserHomeDir()
if err == nil {
railsConfig := filepath.Join(home, ".rails", "config", "config.json")
if _, err := os.Stat(railsConfig); err == nil {
configFile = railsConfig
} else {
configFile = "./config.json"
return
}
}
type Config struct {
Repositories []string `json:"repositories"`
Packages map[string]string `json:"packages"`
}
configFile = "./config.json"
}
func LoadConfig() (*Config, error) {
if _, err := os.Stat(configFile); os.IsNotExist(err) {
cfg := &Config{
Repo: "",
Repositories: []string{},
Packages: make(map[string]string),
}
@ -63,7 +65,7 @@ func AddRepository(repo string) error {
}
for _, r := range cfg.Repositories {
if r == repo {
return errors.New("репозиторий уже добавлен")
return nil
}
}
cfg.Repositories = append(cfg.Repositories, repo)
@ -76,16 +78,10 @@ func RemoveRepository(repo string) error {
return err
}
newRepos := []string{}
found := false
for _, r := range cfg.Repositories {
if r == repo {
found = true
continue
}
if r != repo {
newRepos = append(newRepos, r)
}
if !found {
return errors.New("репозиторий не найден")
}
cfg.Repositories = newRepos
return SaveConfig(cfg)

View File

@ -31,6 +31,12 @@ func FetchManifest(name string) (*Manifest, error) {
if err != nil {
return nil, err
}
if cfg.Repo != "" {
m, err := FetchManifestFromRepo(cfg.Repo, name)
if err == nil {
return m, nil
}
}
if url, ok := cfg.Packages[name]; ok {
return fetchManifestFromURL(url)
}
@ -44,7 +50,7 @@ func FetchManifest(name string) (*Manifest, error) {
lastErr = err
}
if lastErr == nil {
lastErr = errors.New("не найден ни один репозиторий")
lastErr = errors.New("no repository found")
}
return nil, lastErr
}
@ -56,7 +62,7 @@ func fetchManifestFromURL(url string) (*Manifest, error) {
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, errors.New("манифест пакета не найден по ссылке " + url)
return nil, errors.New("manifest not found at " + url)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {

42
pkg/manifest/repo.go Normal file
View File

@ -0,0 +1,42 @@
package manifest
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type RepoPackage struct {
Name string `json:"name"`
Manifest string `json:"manifest"`
}
type RepoFile struct {
Packages []RepoPackage `json:"packages"`
}
func FetchManifestFromRepo(repoURL, pkgName string) (*Manifest, error) {
resp, err := http.Get(repoURL)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, fmt.Errorf("repo file not found at %s", repoURL)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var rf RepoFile
if err := json.Unmarshal(data, &rf); err != nil {
return nil, err
}
for _, rp := range rf.Packages {
if rp.Name == pkgName {
return fetchManifestFromURL(rp.Manifest)
}
}
return nil, fmt.Errorf("package %s not found in repo", pkgName)
}