diff --git a/config.json b/config.json index 46854d1..fdc31af 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,5 @@ { - "repositories": [ - "https://xn--80abmlgju2eo3byb.xn--p1ai/repo" - ] + "repo": "https://xn--80abmlgju2eo3byb.xn--p1ai/repo.json", + "repositories": [], + "packages": {} } diff --git a/pkg/.DS_Store b/pkg/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/pkg/.DS_Store differ diff --git a/pkg/autoupdate/autoupdate.go b/pkg/autoupdate/autoupdate.go index 7178924..55dea7a 100644 --- a/pkg/autoupdate/autoupdate.go +++ b/pkg/autoupdate/autoupdate.go @@ -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) diff --git a/pkg/config/config.go b/pkg/config/config.go index 3a1b231..92534fc 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -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") - if _, err := os.Stat(railsConfig); err == nil { - configFile = railsConfig - } else { - configFile = "./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 + 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) } - newRepos = append(newRepos, r) - } - if !found { - return errors.New("репозиторий не найден") } cfg.Repositories = newRepos return SaveConfig(cfg) diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index 05cc49e..710833e 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -249,4 +249,4 @@ func GetPackageInfo(name string) (string, error) { return "", err } return string(data), nil -} +} \ No newline at end of file diff --git a/pkg/manifest/manifest.go b/pkg/manifest/manifest.go index b8681dc..60c7f95 100644 --- a/pkg/manifest/manifest.go +++ b/pkg/manifest/manifest.go @@ -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 { @@ -67,4 +73,4 @@ func fetchManifestFromURL(url string) (*Manifest, error) { return nil, err } return &m, nil -} +} \ No newline at end of file diff --git a/pkg/manifest/repo.go b/pkg/manifest/repo.go new file mode 100644 index 0000000..b77991d --- /dev/null +++ b/pkg/manifest/repo.go @@ -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) +} \ No newline at end of file