This commit is contained in:
2025-02-11 12:24:57 +03:00
parent 8978cc2855
commit 17bbb2f4c5
11 changed files with 378 additions and 341 deletions

View File

@ -41,6 +41,7 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/dl"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/dlcache"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
@ -49,23 +50,31 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
type PackageFinder interface {
FindPkgs(ctx context.Context, pkgs []string) (map[string][]db.Package, []string, error)
}
type Config interface {
GetPaths(ctx context.Context) *config.Paths
PagerStyle(ctx context.Context) string
}
type Builder struct {
ctx context.Context
opts types.BuildOpts
info *distro.OSRelease
repos *repos.Repos
config *config.ALRConfig
repos PackageFinder
config Config
}
func New(
func NewBuilder(
ctx context.Context,
opts types.BuildOpts,
repos *repos.Repos,
repos PackageFinder,
info *distro.OSRelease,
config *config.ALRConfig,
config Config,
) *Builder {
return &Builder{
ctx: ctx,
@ -76,6 +85,16 @@ func New(
}
}
func (b *Builder) UpdateOptsFromPkg(pkg *db.Package) {
repodir := b.config.GetPaths(b.ctx).RepoDir
if pkg.BasePkgName != "" {
b.opts.Script = filepath.Join(repodir, pkg.Repository, pkg.BasePkgName, "alr.sh")
b.opts.Package = pkg.Name
} else {
b.opts.Script = filepath.Join(repodir, pkg.Repository, pkg.Name, "alr.sh")
}
}
func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error) {
fl, err := readScript(b.opts.Script)
if err != nil {
@ -151,7 +170,7 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error)
return nil, nil, err
}
err = installOptDeps(ctx, b.repos, vars, b.opts) // Устанавливаем опциональные зависимости
err = b.installOptDeps(ctx, vars) // Устанавливаем опциональные зависимости
if err != nil {
return nil, nil, err
}
@ -352,7 +371,7 @@ func (b *Builder) installBuildDeps(ctx context.Context, vars *types.BuildVars) (
return nil, err
}
found, notFound, err := repos.FindPkgs(ctx, deps) // Находим пакеты-зависимости
found, notFound, err := b.repos.FindPkgs(ctx, deps) // Находим пакеты-зависимости
if err != nil {
return nil, err
}
@ -361,7 +380,7 @@ func (b *Builder) installBuildDeps(ctx context.Context, vars *types.BuildVars) (
flattened := cliutils.FlattenPkgs(ctx, found, "install", b.opts.Interactive) // Уплощаем список зависимостей
buildDeps = packageNames(flattened)
InstallPkgs(ctx, flattened, notFound, b.opts) // Устанавливаем пакеты
b.InstallPkgs(ctx, flattened, notFound, b.opts) // Устанавливаем пакеты
}
return buildDeps, nil
}
@ -370,7 +389,7 @@ func (b *Builder) buildALRDeps(ctx context.Context, vars *types.BuildVars) (buil
if len(vars.Depends) > 0 {
slog.Info(gotext.Get("Installing dependencies"))
found, notFound, err := repos.FindPkgs(ctx, vars.Depends) // Поиск зависимостей
found, notFound, err := b.repos.FindPkgs(ctx, vars.Depends) // Поиск зависимостей
if err != nil {
return nil, nil, nil, err
}
@ -380,16 +399,9 @@ func (b *Builder) buildALRDeps(ctx context.Context, vars *types.BuildVars) (buil
pkgs := cliutils.FlattenPkgs(ctx, found, "install", b.opts.Interactive)
for _, pkg := range pkgs {
newOpts := b.opts
UpdateOpts(ctx, &newOpts, &pkg)
newB := New(
ctx,
newOpts,
b.repos,
b.info,
b.config,
)
newB := *b
newB.UpdateOptsFromPkg(&pkg)
// Собираем зависимости
pkgPaths, pkgNames, err := newB.BuildPackage(ctx)
@ -402,7 +414,7 @@ func (b *Builder) buildALRDeps(ctx context.Context, vars *types.BuildVars) (buil
// Добавляем пути всех собранных пакетов в builtPaths
builtNames = append(builtNames, pkgNames...)
// Добавляем имя текущего пакета в builtNames
builtNames = append(builtNames, filepath.Base(filepath.Dir(newOpts.Script)))
builtNames = append(builtNames, filepath.Base(filepath.Dir(newB.opts.Script)))
}
}
@ -605,3 +617,72 @@ func (b *Builder) executeFunctions(
return output, nil
}
func (b *Builder) installOptDeps(ctx context.Context, vars *types.BuildVars) error {
optDeps, err := removeAlreadyInstalled(b.opts, vars.OptDepends)
if err != nil {
return err
}
if len(optDeps) > 0 {
optDeps, err := cliutils.ChooseOptDepends(ctx, optDeps, "install", b.opts.Interactive) // Пользователя просят выбрать опциональные зависимости
if err != nil {
return err
}
if len(optDeps) == 0 {
return nil
}
found, notFound, err := b.repos.FindPkgs(ctx, optDeps) // Находим опциональные зависимости
if err != nil {
return err
}
flattened := cliutils.FlattenPkgs(ctx, found, "install", b.opts.Interactive)
b.InstallPkgs(ctx, flattened, notFound, b.opts) // Устанавливаем выбранные пакеты
}
return nil
}
func (b *Builder) InstallPkgs(
ctx context.Context,
alrPkgs []db.Package,
nativePkgs []string,
opts types.BuildOpts,
) {
if len(nativePkgs) > 0 {
err := opts.Manager.Install(nil, nativePkgs...)
// Если есть нативные пакеты, выполняем их установку
if err != nil {
slog.Error(gotext.Get("Error installing native packages"), "err", err)
os.Exit(1)
// Логируем и завершаем выполнение при ошибке
}
}
b.InstallALRPackages(ctx, alrPkgs, opts)
// Устанавливаем скрипты сборки через функцию InstallScripts
}
func (b *Builder) InstallALRPackages(ctx context.Context, pkgs []db.Package, opts types.BuildOpts) {
for _, pkg := range pkgs {
builder := *b
builder.UpdateOptsFromPkg(&pkg)
builtPkgs, _, err := builder.BuildPackage(ctx)
// Выполняем сборку пакета
if err != nil {
slog.Error(gotext.Get("Error building package"), "err", err)
os.Exit(1)
// Логируем и завершаем выполнение при ошибке сборки
}
err = opts.Manager.InstallLocal(nil, builtPkgs...)
// Устанавливаем локально собранные пакеты
if err != nil {
slog.Error(gotext.Get("Error installing package"), "err", err)
os.Exit(1)
// Логируем и завершаем выполнение при ошибке установки
}
}
}