wip
This commit is contained in:
@ -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)
|
||||
// Логируем и завершаем выполнение при ошибке установки
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user