This commit is contained in:
wheelchairy 2025-02-04 18:45:52 +03:00
parent 074ef32802
commit bb704c4705
6 changed files with 43 additions and 31 deletions

View File

@ -1,9 +1,7 @@
package main package main
import ( import "train/cmd"
"train/cmd"
)
func main() { func main() {
cmd.Execute() cmd.Execute()
} }

4
pkg/cache/cache.go vendored
View File

@ -6,9 +6,11 @@ import (
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
"train/pkg/paths"
) )
var cacheDir = "./cache" var cacheDir = filepath.Join(paths.BaseDir(), "cache")
func GetCachedFile(url string) (string, error) { func GetCachedFile(url string) (string, error) {
if err := os.MkdirAll(cacheDir, os.ModePerm); err != nil { if err := os.MkdirAll(cacheDir, os.ModePerm); err != nil {

View File

@ -5,15 +5,27 @@ import (
"errors" "errors"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath"
"train/pkg/paths"
) )
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"
}
}
type Config struct { type Config struct {
Repositories []string `json:"repositories"` Repositories []string `json:"repositories"`
Packages map[string]string `json:"packages"` Packages map[string]string `json:"packages"`
} }
var configFile = "./config.json"
func LoadConfig() (*Config, error) { func LoadConfig() (*Config, error) {
if _, err := os.Stat(configFile); os.IsNotExist(err) { if _, err := os.Stat(configFile); os.IsNotExist(err) {
cfg := &Config{ cfg := &Config{

View File

@ -17,13 +17,14 @@ import (
"runtime" "runtime"
"strings" "strings"
// "train/pkg/config"
"train/pkg/manifest" "train/pkg/manifest"
"train/pkg/paths"
) )
var ( var (
binInstallDir = "./installed_bins" // for binary binInstallDir = filepath.Join(paths.BaseDir(), "installed_bins")
buildInstallDir = "./installed_packages" // for build" buildInstallDir = filepath.Join(paths.BaseDir(), "installed_packages")
installDir = buildInstallDir // for func
) )
func computeChecksum(filePath string) (string, error) { func computeChecksum(filePath string) (string, error) {
@ -41,7 +42,6 @@ func downloadFile(url string) (string, error) {
return "", err return "", err
} }
defer resp.Body.Close() defer resp.Body.Close()
tmpFile, err := ioutil.TempFile("", "package_") tmpFile, err := ioutil.TempFile("", "package_")
if err != nil { if err != nil {
return "", err return "", err
@ -59,32 +59,26 @@ func unpackPackage(filePath, packageName string) error {
if err := os.MkdirAll(destDir, os.ModePerm); err != nil { if err := os.MkdirAll(destDir, os.ModePerm); err != nil {
return err return err
} }
f, err := os.Open(filePath) f, err := os.Open(filePath)
if err != nil { if err != nil {
return err return err
} }
defer f.Close() defer f.Close()
gzr, err := gzip.NewReader(f) gzr, err := gzip.NewReader(f)
if err != nil { if err != nil {
return err return err
} }
defer gzr.Close() defer gzr.Close()
tr := tar.NewReader(gzr) tr := tar.NewReader(gzr)
for { for {
header, err := tr.Next() header, err := tr.Next()
if err == io.EOF { if err == io.EOF {
break break
} }
if err != nil { if err != nil {
return err return err
} }
target := filepath.Join(destDir, header.Name) target := filepath.Join(destDir, header.Name)
switch header.Typeflag { switch header.Typeflag {
case tar.TypeDir: case tar.TypeDir:
if err := os.MkdirAll(target, os.FileMode(header.Mode)); err != nil { if err := os.MkdirAll(target, os.FileMode(header.Mode)); err != nil {
@ -100,8 +94,6 @@ func unpackPackage(filePath, packageName string) error {
return err return err
} }
outFile.Close() outFile.Close()
default:
} }
} }
return nil return nil
@ -133,6 +125,7 @@ func saveInstalledPackage(name string, m *manifest.Manifest) error {
} }
func removeInstalledPackageRecord(name string) { func removeInstalledPackageRecord(name string) {
// Здесь можно удалить запись из базы или файла
} }
func InstallPackage(name string) error { func InstallPackage(name string) error {
@ -140,7 +133,6 @@ func InstallPackage(name string) error {
if err != nil { if err != nil {
return fmt.Errorf("не удалось получить манифест: %w", err) return fmt.Errorf("не удалось получить манифест: %w", err)
} }
if strings.ToLower(m.Mode) == "bin" { if strings.ToLower(m.Mode) == "bin" {
platformKey := runtime.GOOS + "_" + runtime.GOARCH platformKey := runtime.GOOS + "_" + runtime.GOARCH
binaryURL, ok := m.Binaries[platformKey] binaryURL, ok := m.Binaries[platformKey]
@ -152,7 +144,6 @@ func InstallPackage(name string) error {
return fmt.Errorf("не удалось скачать бинарник: %w", err) return fmt.Errorf("не удалось скачать бинарник: %w", err)
} }
defer os.Remove(packageFile) defer os.Remove(packageFile)
checksum, err := computeChecksum(packageFile) checksum, err := computeChecksum(packageFile)
if err != nil { if err != nil {
return fmt.Errorf("не удалось вычислить контрольную сумму: %w", err) return fmt.Errorf("не удалось вычислить контрольную сумму: %w", err)
@ -160,7 +151,6 @@ func InstallPackage(name string) error {
if checksum != m.Checksum { if checksum != m.Checksum {
return fmt.Errorf("контрольная сумма не совпадает, ожидалось %s, получено %s", m.Checksum, checksum) return fmt.Errorf("контрольная сумма не совпадает, ожидалось %s, получено %s", m.Checksum, checksum)
} }
if err := os.MkdirAll(binInstallDir, os.ModePerm); err != nil { if err := os.MkdirAll(binInstallDir, os.ModePerm); err != nil {
return err return err
} }
@ -180,7 +170,6 @@ func InstallPackage(name string) error {
return fmt.Errorf("не удалось скачать пакет: %w", err) return fmt.Errorf("не удалось скачать пакет: %w", err)
} }
defer os.Remove(packageFile) defer os.Remove(packageFile)
checksum, err := computeChecksum(packageFile) checksum, err := computeChecksum(packageFile)
if err != nil { if err != nil {
return fmt.Errorf("не удалось вычислить контрольную сумму: %w", err) return fmt.Errorf("не удалось вычислить контрольную сумму: %w", err)
@ -188,23 +177,19 @@ func InstallPackage(name string) error {
if checksum != m.Checksum { if checksum != m.Checksum {
return fmt.Errorf("контрольная сумма не совпадает, ожидалось %s, получено %s", m.Checksum, checksum) return fmt.Errorf("контрольная сумма не совпадает, ожидалось %s, получено %s", m.Checksum, checksum)
} }
if err := unpackPackage(packageFile, name); err != nil { if err := unpackPackage(packageFile, name); err != nil {
return fmt.Errorf("не удалось распаковать пакет: %w", err) return fmt.Errorf("не удалось распаковать пакет: %w", err)
} }
if len(m.Build) > 0 { if len(m.Build) > 0 {
if err := executeBuildCommands(m.Build, name); err != nil { if err := executeBuildCommands(m.Build, name); err != nil {
return fmt.Errorf("ошибка выполнения команд сборки: %w", err) return fmt.Errorf("ошибка выполнения команд сборки: %w", err)
} }
} }
if err := saveInstalledPackage(name, m); err != nil { if err := saveInstalledPackage(name, m); err != nil {
return fmt.Errorf("не удалось сохранить информацию об установленном пакете: %w", err) return fmt.Errorf("не удалось сохранить информацию об установленном пакете: %w", err)
} }
return nil return nil
} }
return errors.New("неизвестный режим пакета") return errors.New("неизвестный режим пакета")
} }
@ -251,4 +236,4 @@ func GetPackageInfo(name string) (string, error) {
return "", err return "", err
} }
return string(data), nil return string(data), nil
} }

14
pkg/paths/paths.go Normal file
View File

@ -0,0 +1,14 @@
package paths
import (
"os"
"path/filepath"
)
func BaseDir() string {
home, err := os.UserHomeDir()
if err != nil {
return "."
}
return filepath.Join(home, ".rails")
}

View File

@ -2,10 +2,11 @@ package version
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"train/pkg/paths"
) )
type VersionInfo struct { type VersionInfo struct {
@ -13,7 +14,7 @@ type VersionInfo struct {
Version string `json:"version"` Version string `json:"version"`
} }
var versionDir = "./versions" var versionDir = filepath.Join(paths.BaseDir(), "versions")
func SaveVersionInfo(pkgName, ver string) error { func SaveVersionInfo(pkgName, ver string) error {
if err := os.MkdirAll(versionDir, os.ModePerm); err != nil { if err := os.MkdirAll(versionDir, os.ModePerm); err != nil {