Compare commits

..

No commits in common. "master" and "chore/i18n" have entirely different histories.

11 changed files with 234 additions and 261 deletions

@ -78,7 +78,8 @@ func BuildCmd() *cli.Command {
var script string
var packages []string
repository := "default"
// Проверяем, установлен ли флаг script (-s)
repoDir := cfg.GetPaths(ctx).RepoDir
@ -105,13 +106,11 @@ func BuildCmd() *cli.Command {
os.Exit(1)
}
repository = pkg[0].Repository
if pkg[0].BasePkgName != "" {
script = filepath.Join(repoDir, repository, pkg[0].BasePkgName, "alr.sh")
script = filepath.Join(repoDir, pkg[0].Repository, pkg[0].BasePkgName, "alr.sh")
packages = append(packages, pkg[0].Name)
} else {
script = filepath.Join(repoDir, repository, pkg[0].Name, "alr.sh")
script = filepath.Join(repoDir, pkg[0].Repository, pkg[0].Name, "alr.sh")
}
default:
script = filepath.Join(repoDir, "alr.sh")
@ -143,7 +142,6 @@ func BuildCmd() *cli.Command {
ctx,
types.BuildOpts{
Packages: packages,
Repository: repository,
Script: script,
Manager: mgr,
Clean: c.Bool("clean"),

@ -193,7 +193,3 @@ func (c *ALRConfig) RootCmd(ctx context.Context) string {
})
return c.cfg.RootCmd
}
func (c *ALRConfig) Save(f *os.File) error {
return toml.NewEncoder(f).Encode(c.cfg)
}

@ -34,31 +34,31 @@ msgstr ""
msgid "Error initialization database"
msgstr ""
#: build.go:104
#: build.go:105
msgid "Package not found"
msgstr ""
#: build.go:124
#: build.go:123
msgid "Error pulling repositories"
msgstr ""
#: build.go:132
#: build.go:131
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:138
#: build.go:137
msgid "Error parsing os release"
msgstr ""
#: build.go:160
#: build.go:158
msgid "Error building package"
msgstr ""
#: build.go:167
#: build.go:165
msgid "Error getting working directory"
msgstr ""
#: build.go:176
#: build.go:174
msgid "Error moving the package"
msgstr ""
@ -323,11 +323,11 @@ msgstr ""
msgid "ERROR"
msgstr ""
#: list.go:41
#: list.go:40
msgid "List ALR repo packages"
msgstr ""
#: list.go:92
#: list.go:91
msgid "Error listing installed packages"
msgstr ""
@ -369,68 +369,60 @@ msgstr ""
msgid "Downloading sources"
msgstr ""
#: pkg/build/build.go:250
#: pkg/build/build.go:246
msgid "Building package metadata"
msgstr ""
#: pkg/build/build.go:272
#: pkg/build/build.go:268
msgid "Compressing package"
msgstr ""
#: pkg/build/build.go:426
#: pkg/build/build.go:421
msgid ""
"Your system's CPU architecture doesn't match this package. Do you want to "
"build anyway?"
msgstr ""
#: pkg/build/build.go:440
#: pkg/build/build.go:435
msgid "This package is already installed"
msgstr ""
#: pkg/build/build.go:464
#: pkg/build/build.go:459
msgid "Installing build dependencies"
msgstr ""
#: pkg/build/build.go:505
#: pkg/build/build.go:500
msgid "Installing dependencies"
msgstr ""
#: pkg/build/build.go:540
#: pkg/build/build.go:535
msgid "The checksums array must be the same length as sources"
msgstr ""
#: pkg/build/build.go:591
#: pkg/build/build.go:586
msgid "Would you like to remove the build dependencies?"
msgstr ""
#: pkg/build/build.go:654
#: pkg/build/build.go:649
msgid "Executing prepare()"
msgstr ""
#: pkg/build/build.go:664
#: pkg/build/build.go:659
msgid "Executing build()"
msgstr ""
#: pkg/build/build.go:694 pkg/build/build.go:714
#: pkg/build/build.go:689 pkg/build/build.go:709
msgid "Executing %s()"
msgstr ""
#: pkg/build/build.go:773
#: pkg/build/build.go:768
msgid "Error installing native packages"
msgstr ""
#: pkg/build/build.go:797
#: pkg/build/build.go:792
msgid "Error installing package"
msgstr ""
#: pkg/build/build.go:857
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/build/build.go:868
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/build/findDeps.go:35
msgid "Command not found on the system"
msgstr ""
@ -443,6 +435,14 @@ msgstr ""
msgid "Required dependency found"
msgstr ""
#: pkg/build/utils.go:133
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/build/utils.go:144
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/repos/pull.go:79
msgid "Pulling repository"
msgstr ""

@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Gtranslator 47.1\n"
#: build.go:44
@ -41,31 +41,31 @@ msgstr "Создайте пакет с нуля, даже если уже име
msgid "Error initialization database"
msgstr "Ошибка инициализации базы данных"
#: build.go:104
#: build.go:105
msgid "Package not found"
msgstr "Пакет не найден"
#: build.go:124
#: build.go:123
msgid "Error pulling repositories"
msgstr "Ошибка при извлечении репозиториев"
#: build.go:132
#: build.go:131
msgid "Unable to detect a supported package manager on the system"
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
#: build.go:138
#: build.go:137
msgid "Error parsing os release"
msgstr "Ошибка при разборе файла выпуска операционной системы"
#: build.go:160
#: build.go:158
msgid "Error building package"
msgstr "Ошибка при сборке пакета"
#: build.go:167
#: build.go:165
msgid "Error getting working directory"
msgstr "Ошибка при получении рабочего каталога"
#: build.go:176
#: build.go:174
msgid "Error moving the package"
msgstr "Ошибка при перемещении пакета"
@ -335,11 +335,11 @@ msgstr "%s %s загружается — %s/с\n"
msgid "ERROR"
msgstr "ОШИБКА"
#: list.go:41
#: list.go:40
msgid "List ALR repo packages"
msgstr "Список пакетов репозитория ALR"
#: list.go:92
#: list.go:91
msgid "Error listing installed packages"
msgstr "Ошибка при составлении списка установленных пакетов"
@ -383,15 +383,15 @@ msgstr "Сборка пакета"
msgid "Downloading sources"
msgstr "Скачивание источников"
#: pkg/build/build.go:250
#: pkg/build/build.go:246
msgid "Building package metadata"
msgstr "Сборка метаданных пакета"
#: pkg/build/build.go:272
#: pkg/build/build.go:268
msgid "Compressing package"
msgstr "Сжатие пакета"
#: pkg/build/build.go:426
#: pkg/build/build.go:421
msgid ""
"Your system's CPU architecture doesn't match this package. Do you want to "
"build anyway?"
@ -399,56 +399,46 @@ msgstr ""
"Архитектура процессора вашей системы не соответствует этому пакету. Вы все "
"равно хотите выполнить сборку?"
#: pkg/build/build.go:440
#: pkg/build/build.go:435
msgid "This package is already installed"
msgstr "Этот пакет уже установлен"
#: pkg/build/build.go:464
#: pkg/build/build.go:459
msgid "Installing build dependencies"
msgstr "Установка зависимостей сборки"
#: pkg/build/build.go:505
#: pkg/build/build.go:500
msgid "Installing dependencies"
msgstr "Установка зависимостей"
#: pkg/build/build.go:540
#: pkg/build/build.go:535
msgid "The checksums array must be the same length as sources"
msgstr "Массив контрольных сумм должен быть той же длины, что и источники"
#: pkg/build/build.go:591
#: pkg/build/build.go:586
msgid "Would you like to remove the build dependencies?"
msgstr "Хотели бы вы удалить зависимости сборки?"
#: pkg/build/build.go:654
#: pkg/build/build.go:649
msgid "Executing prepare()"
msgstr "Исполнение prepare()"
#: pkg/build/build.go:664
#: pkg/build/build.go:659
msgid "Executing build()"
msgstr "Исполнение build()"
#: pkg/build/build.go:694 pkg/build/build.go:714
#: pkg/build/build.go:689 pkg/build/build.go:709
msgid "Executing %s()"
msgstr "Исполнение %s()"
#: pkg/build/build.go:773
#: pkg/build/build.go:768
msgid "Error installing native packages"
msgstr "Ошибка при установке нативных пакетов"
#: pkg/build/build.go:797
#: pkg/build/build.go:792
msgid "Error installing package"
msgstr "Ошибка при установке пакета"
#: pkg/build/build.go:857
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
"AutoProv не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/build.go:868
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/findDeps.go:35
msgid "Command not found on the system"
msgstr "Команда не найдена в системе"
@ -461,6 +451,16 @@ msgstr "Найденная предоставленная зависимость
msgid "Required dependency found"
msgstr "Найдена требуемая зависимость"
#: pkg/build/utils.go:133
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
"AutoProv не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/utils.go:144
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/repos/pull.go:79
msgid "Pulling repository"
msgstr "Скачивание репозитория"

@ -23,7 +23,6 @@ import "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
type BuildOpts struct {
Script string
Repository string
Packages []string
Manager manager.Manager
Clean bool
@ -103,7 +102,6 @@ type BuildVars struct {
Scripts Scripts `sh:"scripts"`
AutoReq []string `sh:"auto_req"`
AutoProv []string `sh:"auto_prov"`
Base string
}
type Scripts struct {

16
list.go

@ -30,7 +30,6 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -79,7 +78,7 @@ func ListCmd() *cli.Command {
}
defer result.Close()
installedAlrPackages := map[string]string{}
var installed map[string]string
if c.Bool("installed") {
mgr := manager.Detect()
if mgr == nil {
@ -87,20 +86,11 @@ func ListCmd() *cli.Command {
os.Exit(1)
}
installed, err := mgr.ListInstalled(&manager.Opts{AsRoot: false})
installed, err = mgr.ListInstalled(&manager.Opts{AsRoot: false})
if err != nil {
slog.Error(gotext.Get("Error listing installed packages"), "err", err)
os.Exit(1)
}
for pkgName, version := range installed {
matches := build.RegexpALRPackageName.FindStringSubmatch(pkgName)
if matches != nil {
packageName := matches[build.RegexpALRPackageName.SubexpIndex("package")]
repoName := matches[build.RegexpALRPackageName.SubexpIndex("repo")]
installedAlrPackages[fmt.Sprintf("%s/%s", repoName, packageName)] = version
}
}
}
for result.Next() {
@ -116,7 +106,7 @@ func ListCmd() *cli.Command {
version := pkg.Version
if c.Bool("installed") {
instVersion, ok := installedAlrPackages[fmt.Sprintf("%s/%s", pkg.Repository, pkg.Name)]
instVersion, ok := installed[pkg.Name]
if !ok {
continue
} else {

@ -28,8 +28,6 @@ import (
"log/slog"
"os"
"path/filepath"
"slices"
"strconv"
"strings"
"time"
@ -89,7 +87,6 @@ func NewBuilder(
func (b *Builder) UpdateOptsFromPkg(pkg *db.Package, packages []string) {
repodir := b.config.GetPaths(b.ctx).RepoDir
b.opts.Repository = pkg.Repository
if pkg.BasePkgName != "" {
b.opts.Script = filepath.Join(repodir, pkg.Repository, pkg.BasePkgName, "alr.sh")
b.opts.Packages = packages
@ -119,11 +116,14 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error)
// возвращаем его, а не собираем заново.
if !b.opts.Clean {
var remainingVars []*types.BuildVars
for _, vars := range varsOfPackages {
builtPkgPath, ok, err := b.checkForBuiltPackage(
builtPkgPath, ok, err := checkForBuiltPackage(
b.opts.Manager,
vars,
getPkgFormat(b.opts.Manager),
dirs.BaseDir,
b.info,
)
if err != nil {
return nil, nil, err
@ -238,11 +238,7 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error)
}
for _, vars := range varsOfPackages {
packageName := ""
if vars.Base != "" {
packageName = vars.Name
}
funcOut, err := b.executePackageFunctions(ctx, dec, dirs, packageName)
funcOut, err := b.executePackageFunctions(ctx, dec, dirs, vars.Name)
if err != nil {
return nil, nil, err
}
@ -251,7 +247,7 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error)
pkgFormat := getPkgFormat(b.opts.Manager) // Получаем формат пакета
pkgInfo, err := b.buildPkgMetadata(ctx, vars, dirs, pkgFormat, append(repoDeps, builtNames...), funcOut.Contents) // Собираем метаданные пакета
pkgInfo, err := buildPkgMetadata(ctx, vars, dirs, pkgFormat, b.info, append(repoDeps, builtNames...), funcOut.Contents) // Собираем метаданные пакета
if err != nil {
return nil, nil, err
}
@ -370,7 +366,6 @@ func (b *Builder) executeFirstPass(
}
vars := preVars.ToBuildVars()
vars.Name = pkgName
vars.Base = pkgs.BasePkgName
varsOfPackages = append(varsOfPackages, &vars)
}
@ -683,8 +678,8 @@ func (b *Builder) executePackageFunctions(
var filesFuncName string
if packageName == "" {
packageFuncName = "package"
filesFuncName = "files"
packageFuncName = "package"
} else {
packageFuncName = fmt.Sprintf("package_%s", packageName)
filesFuncName = fmt.Sprintf("files_%s", packageName)
@ -800,109 +795,3 @@ func (b *Builder) InstallALRPackages(ctx context.Context, pkgs []db.Package, opt
}
}
}
// Функция buildPkgMetadata создает метаданные для пакета, который будет собран.
func (b *Builder) buildPkgMetadata(
ctx context.Context,
vars *types.BuildVars,
dirs types.Directories,
pkgFormat string,
deps []string,
preferedContents *[]string,
) (*nfpm.Info, error) {
pkgInfo := getBasePkgInfo(vars, b.info, &b.opts)
pkgInfo.Description = vars.Description
pkgInfo.Platform = "linux"
pkgInfo.Homepage = vars.Homepage
pkgInfo.License = strings.Join(vars.Licenses, ", ")
pkgInfo.Maintainer = vars.Maintainer
pkgInfo.Overridables = nfpm.Overridables{
Conflicts: append(vars.Conflicts, vars.Name),
Replaces: vars.Replaces,
Provides: append(vars.Provides, vars.Name),
Depends: deps,
}
if pkgFormat == "apk" {
// Alpine отказывается устанавливать пакеты, которые предоставляют сами себя, поэтому удаляем такие элементы
pkgInfo.Overridables.Provides = slices.DeleteFunc(pkgInfo.Overridables.Provides, func(s string) bool {
return s == pkgInfo.Name
})
}
if vars.Epoch != 0 {
pkgInfo.Epoch = strconv.FormatUint(uint64(vars.Epoch), 10)
}
setScripts(vars, pkgInfo, dirs.ScriptDir)
if slices.Contains(vars.Architectures, "all") {
pkgInfo.Arch = "all"
}
contents, err := buildContents(vars, dirs, preferedContents)
if err != nil {
return nil, err
}
slog.Info("contents", "contents", contents)
pkgInfo.Overridables.Contents = contents
if len(vars.AutoProv) == 1 && decoder.IsTruthy(vars.AutoProv[0]) {
if pkgFormat == "rpm" {
err = rpmFindProvides(ctx, pkgInfo, dirs)
if err != nil {
return nil, err
}
} else {
slog.Info(gotext.Get("AutoProv is not implemented for this package format, so it's skipped"))
}
}
if len(vars.AutoReq) == 1 && decoder.IsTruthy(vars.AutoReq[0]) {
if pkgFormat == "rpm" {
err = rpmFindRequires(ctx, pkgInfo, dirs)
if err != nil {
return nil, err
}
} else {
slog.Info(gotext.Get("AutoReq is not implemented for this package format, so it's skipped"))
}
}
return pkgInfo, nil
}
// Функция checkForBuiltPackage пытается обнаружить ранее собранный пакет и вернуть его путь
// и true, если нашла. Если нет, возвратит "", false, nil.
func (b *Builder) checkForBuiltPackage(
vars *types.BuildVars,
pkgFormat,
baseDir string,
) (string, bool, error) {
filename, err := b.pkgFileName(vars, pkgFormat)
if err != nil {
return "", false, err
}
pkgPath := filepath.Join(baseDir, filename)
_, err = os.Stat(pkgPath)
if err != nil {
return "", false, nil
}
return pkgPath, true, nil
}
// pkgFileName returns the filename of the package if it were to be built.
// This is used to check if the package has already been built.
func (b *Builder) pkgFileName(vars *types.BuildVars, pkgFormat string) (string, error) {
pkgInfo := getBasePkgInfo(vars, b.info, &b.opts)
packager, err := nfpm.Get(pkgFormat)
if err != nil {
return "", err
}
return packager.ConventionalFileName(pkgInfo), nil
}

@ -17,11 +17,11 @@
package build
import (
"fmt"
"context"
"io"
"log/slog"
"os"
"path/filepath"
"regexp"
"runtime"
"slices"
"strconv"
@ -33,6 +33,7 @@ import (
_ "github.com/goreleaser/nfpm/v2/arch"
_ "github.com/goreleaser/nfpm/v2/deb"
_ "github.com/goreleaser/nfpm/v2/rpm"
"github.com/leonelquinteros/gotext"
"mvdan.cc/sh/v3/syntax"
"github.com/goreleaser/nfpm/v2"
@ -41,6 +42,7 @@ import (
"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/overrides"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
"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"
@ -75,6 +77,77 @@ func prepareDirs(dirs types.Directories) error {
return os.MkdirAll(dirs.PkgDir, 0o755) // Создаем директорию для пакетов
}
// Функция buildPkgMetadata создает метаданные для пакета, который будет собран.
func buildPkgMetadata(
ctx context.Context,
vars *types.BuildVars,
dirs types.Directories,
pkgFormat string,
info *distro.OSRelease,
deps []string,
preferedContents *[]string,
) (*nfpm.Info, error) {
pkgInfo := getBasePkgInfo(vars, info)
pkgInfo.Description = vars.Description
pkgInfo.Platform = "linux"
pkgInfo.Homepage = vars.Homepage
pkgInfo.License = strings.Join(vars.Licenses, ", ")
pkgInfo.Maintainer = vars.Maintainer
pkgInfo.Overridables = nfpm.Overridables{
Conflicts: vars.Conflicts,
Replaces: vars.Replaces,
Provides: vars.Provides,
Depends: deps,
}
if pkgFormat == "apk" {
// Alpine отказывается устанавливать пакеты, которые предоставляют сами себя, поэтому удаляем такие элементы
pkgInfo.Overridables.Provides = slices.DeleteFunc(pkgInfo.Overridables.Provides, func(s string) bool {
return s == pkgInfo.Name
})
}
if vars.Epoch != 0 {
pkgInfo.Epoch = strconv.FormatUint(uint64(vars.Epoch), 10)
}
setScripts(vars, pkgInfo, dirs.ScriptDir)
if slices.Contains(vars.Architectures, "all") {
pkgInfo.Arch = "all"
}
contents, err := buildContents(vars, dirs, preferedContents)
if err != nil {
return nil, err
}
pkgInfo.Overridables.Contents = contents
if len(vars.AutoProv) == 1 && decoder.IsTruthy(vars.AutoProv[0]) {
if pkgFormat == "rpm" {
err = rpmFindProvides(ctx, pkgInfo, dirs)
if err != nil {
return nil, err
}
} else {
slog.Info(gotext.Get("AutoProv is not implemented for this package format, so it's skipped"))
}
}
if len(vars.AutoReq) == 1 && decoder.IsTruthy(vars.AutoReq[0]) {
if pkgFormat == "rpm" {
err = rpmFindRequires(ctx, pkgInfo, dirs)
if err != nil {
return nil, err
}
} else {
slog.Info(gotext.Get("AutoReq is not implemented for this package format, so it's skipped"))
}
}
return pkgInfo, nil
}
// Функция buildContents создает секцию содержимого пакета, которая содержит файлы,
// которые будут включены в конечный пакет.
func buildContents(vars *types.BuildVars, dirs types.Directories, preferedContents *[]string) ([]*files.Content, error) {
@ -171,11 +244,33 @@ func buildContents(vars *types.BuildVars, dirs types.Directories, preferedConten
return contents, nil
}
var RegexpALRPackageName = regexp.MustCompile(`^(?P<package>[^+]+)\+alr-(?P<repo>.+)$`)
// Функция checkForBuiltPackage пытается обнаружить ранее собранный пакет и вернуть его путь
// и true, если нашла. Если нет, возвратит "", false, nil.
func checkForBuiltPackage(
mgr manager.Manager,
vars *types.BuildVars,
pkgFormat,
baseDir string,
info *distro.OSRelease,
) (string, bool, error) {
filename, err := pkgFileName(vars, pkgFormat, info)
if err != nil {
return "", false, err
}
func getBasePkgInfo(vars *types.BuildVars, info *distro.OSRelease, opts *types.BuildOpts) *nfpm.Info {
pkgPath := filepath.Join(baseDir, filename)
_, err = os.Stat(pkgPath)
if err != nil {
return "", false, nil
}
return pkgPath, true, nil
}
func getBasePkgInfo(vars *types.BuildVars, info *distro.OSRelease) *nfpm.Info {
return &nfpm.Info{
Name: fmt.Sprintf("%s+alr-%s", vars.Name, opts.Repository),
Name: vars.Name,
Arch: cpu.Arch(),
Version: vars.Version,
Release: overrides.ReleasePlatformSpecific(vars.Release, info),
@ -183,6 +278,19 @@ func getBasePkgInfo(vars *types.BuildVars, info *distro.OSRelease, opts *types.B
}
}
// pkgFileName returns the filename of the package if it were to be built.
// This is used to check if the package has already been built.
func pkgFileName(vars *types.BuildVars, pkgFormat string, info *distro.OSRelease) (string, error) {
pkgInfo := getBasePkgInfo(vars, info)
packager, err := nfpm.Get(pkgFormat)
if err != nil {
return "", err
}
return packager.ConventionalFileName(pkgInfo), nil
}
// Функция getPkgFormat возвращает формат пакета из менеджера пакетов,
// или ALR_PKG_FORMAT, если он установлен.
func getPkgFormat(mgr manager.Manager) string {

@ -32,19 +32,19 @@ deps=("python3")
deps_arch=("python")
deps_alpine=("python3")
build_deps=("python3" "python3-pip")
build_deps_arch=("python" "python-pip")
build_deps_alpine=("python3" "py3-pip")
build_deps=("python3" "python3-setuptools")
build_deps_arch=("python" "python-setuptools")
build_deps_alpine=("python3" "py3-setuptools")
sources=("https://files.pythonhosted.org/packages/source/{{.SourceURL.Filename | firstchar}}/{{.Info.Name}}/{{.SourceURL.Filename}}")
checksums=('blake2b-256:{{.SourceURL.Digests.blake2b_256}}')
build() {
cd "$srcdir/{{.Info.Name}}-${version}"
python3 -m build
python3 setup.py build
}
package() {
cd "$srcdir/{{.Info.Name}}-${version}"
pip install --root="${pkgdir}/" . --no-deps --disable-pip-version-check
python3 setup.py install --root="${pkgdir}/" --optimize=1 || return 1
}

@ -83,7 +83,7 @@ func AddRepoCmd() *cli.Command {
os.Exit(1)
}
err = cfg.Save(cfgFl)
err = toml.NewEncoder(cfgFl).Encode(cfg)
if err != nil {
slog.Error(gotext.Get("Error encoding config"), "err", err)
os.Exit(1)

@ -29,6 +29,7 @@ import (
"github.com/urfave/cli/v2"
"go.elara.ws/vercmp"
"golang.org/x/exp/maps"
"golang.org/x/exp/slices"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
@ -38,7 +39,6 @@ import (
"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"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/search"
)
func UpgradeCmd() *cli.Command {
@ -85,7 +85,7 @@ func UpgradeCmd() *cli.Command {
}
}
updates, err := checkForUpdates(ctx, mgr, cfg, db, rs, info)
updates, err := checkForUpdates(ctx, mgr, cfg, rs, info)
if err != nil {
slog.Error(gotext.Get("Error checking for updates"), "err", err)
os.Exit(1)
@ -121,7 +121,6 @@ func checkForUpdates(
ctx context.Context,
mgr manager.Manager,
cfg *config.ALRConfig,
db *database.Database,
rs *repos.Repos,
info *distro.OSRelease,
) ([]database.Package, error) {
@ -131,47 +130,42 @@ func checkForUpdates(
}
pkgNames := maps.Keys(installed)
s := search.New(db)
var out []database.Package
for _, pkgName := range pkgNames {
matches := build.RegexpALRPackageName.FindStringSubmatch(pkgName)
if matches != nil {
packageName := matches[build.RegexpALRPackageName.SubexpIndex("package")]
repoName := matches[build.RegexpALRPackageName.SubexpIndex("repo")]
pkgs, err := s.Search(
ctx,
search.NewSearchOptions().
WithName(packageName).
WithRepository(repoName).
Build(),
)
if err != nil {
return nil, err
}
pkg := pkgs[0]
repoVer := pkg.Version
releaseStr := overrides.ReleasePlatformSpecific(pkg.Release, info)
if pkg.Release != 0 && pkg.Epoch == 0 {
repoVer = fmt.Sprintf("%s-%s", pkg.Version, releaseStr)
} else if pkg.Release != 0 && pkg.Epoch != 0 {
repoVer = fmt.Sprintf("%d:%s-%s", pkg.Epoch, pkg.Version, releaseStr)
}
c := vercmp.Compare(repoVer, installed[pkgName])
if c == 0 || c == -1 {
continue
} else if c == 1 {
out = append(out, pkg)
}
}
found, _, err := rs.FindPkgs(ctx, pkgNames)
if err != nil {
return nil, err
}
var out []database.Package
for pkgName, pkgs := range found {
if slices.Contains(cfg.IgnorePkgUpdates(ctx), pkgName) {
continue
}
if len(pkgs) > 1 {
// Puts the element with the highest version first
slices.SortFunc(pkgs, func(a, b database.Package) int {
return vercmp.Compare(a.Version, b.Version)
})
}
// First element is the package we want to install
pkg := pkgs[0]
repoVer := pkg.Version
releaseStr := overrides.ReleasePlatformSpecific(pkg.Release, info)
if pkg.Release != 0 && pkg.Epoch == 0 {
repoVer = fmt.Sprintf("%s-%s", pkg.Version, releaseStr)
} else if pkg.Release != 0 && pkg.Epoch != 0 {
repoVer = fmt.Sprintf("%d:%s-%s", pkg.Epoch, pkg.Version, releaseStr)
}
c := vercmp.Compare(repoVer, installed[pkgName])
if c == 0 || c == -1 {
continue
} else if c == 1 {
out = append(out, pkg)
}
}
return out, nil
}