Замена vercmp и оптимизация сборки зависимостей с полной русификацией интерфейса
All checks were successful
Pre-commit / pre-commit (push) Successful in 6m13s
Create Release / changelog (push) Successful in 2m58s

- Заменен vercmp с go.elara.ws/vercmp на gitea.plemya-x.ru/xpamych/vercmp v0.0.1
- Добавлена функция FilterPackagesByVersion для проверки версий установленных
  пакетов перед пересборкой зависимостей (учитывает version-release и epoch)
- Исправлена инициализация переводов в плагинах: добавлены вызовы translations.Setup()
  во всех plugin subcommands (_internal-safe-script-executor, _internal-installer,
  _internal-repos)
- Добавлен GetSubcommandHelpTemplate для корректного отображения справки команд
  с подкомандами на русском языке
- Добавлены кастомные help команды для config, repo, helper и mirror
- Добавлены русские переводы для всех пользовательских сообщений:
  * Сообщения о создании пакетов (Creating package file, Packaging with nfpm и др.)
  * Сообщения команды fix (Clearing cache, Fixing permissions и др.)
  * Сообщения обновления (Updating system packages, System packages updated)
  * Сообщения о версиях пакетов (Package is installed with older/newer version)
  * Заголовки справки (NAME, USAGE, COMMANDS, OPTIONS)
  * Справочные сообщения (Shows a list of commands or help for one command)
- Оптимизирован assets/logo.png (уменьшен с 37KB до 17KB)
This commit is contained in:
2025-11-29 19:32:13 +03:00
parent c9c8397856
commit 72cdfcaa4b
19 changed files with 337 additions and 31 deletions

View File

@@ -583,6 +583,12 @@ func (b *Builder) BuildALRDeps(
input.BuildOpts().Interactive,
true,
)
pkgs, err = b.installerExecutor.FilterPackagesByVersion(ctx, pkgs, input.OSRelease())
if err != nil {
return nil, nil, fmt.Errorf("failed to filter packages by version: %w", err)
}
type item struct {
pkg *alrsh.Package
packages []string

View File

@@ -18,8 +18,16 @@ package build
import (
"context"
"fmt"
"log/slog"
"github.com/leonelquinteros/gotext"
"gitea.plemya-x.ru/xpamych/vercmp"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
)
func NewInstaller(mgr manager.Manager) *Installer {
@@ -58,3 +66,44 @@ func (i *Installer) RemoveAlreadyInstalled(ctx context.Context, pkgs []string) (
return filteredPackages, nil
}
func (i *Installer) FilterPackagesByVersion(ctx context.Context, packages []alrsh.Package, osRelease *distro.OSRelease) ([]alrsh.Package, error) {
installedPkgs, err := i.mgr.ListInstalled(nil)
if err != nil {
return nil, fmt.Errorf("failed to list installed packages: %w", err)
}
var filteredPackages []alrsh.Package
for _, pkg := range packages {
alrPkgName := fmt.Sprintf("%s+%s", pkg.Name, pkg.Repository)
installedVer, isInstalled := installedPkgs[alrPkgName]
if !isInstalled {
filteredPackages = append(filteredPackages, pkg)
continue
}
repoVer := pkg.Version
releaseStr := overrides.ReleasePlatformSpecific(pkg.Release, osRelease)
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)
}
cmp := vercmp.Compare(repoVer, installedVer)
if cmp > 0 {
slog.Info(gotext.Get("Package %s is installed with older version %s, will rebuild with version %s", alrPkgName, installedVer, repoVer))
filteredPackages = append(filteredPackages, pkg)
} else if cmp == 0 {
slog.Info(gotext.Get("Package %s is already installed with version %s, skipping build", alrPkgName, installedVer))
} else {
slog.Info(gotext.Get("Package %s is installed with newer version %s (repo has %s), skipping build", alrPkgName, installedVer, repoVer))
}
}
return filteredPackages, nil
}

View File

@@ -21,6 +21,7 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
)
@@ -34,6 +35,7 @@ type InstallerExecutor interface {
Install(ctx context.Context, pkgs []string, opts *manager.Opts) error
Remove(ctx context.Context, pkgs []string, opts *manager.Opts) error
RemoveAlreadyInstalled(ctx context.Context, pkgs []string) ([]string, error)
FilterPackagesByVersion(ctx context.Context, packages []alrsh.Package, osRelease *distro.OSRelease) ([]alrsh.Package, error)
}
type ScriptExecutor interface {

View File

@@ -24,6 +24,7 @@ import (
"context"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
"github.com/hashicorp/go-plugin"
)
@@ -205,6 +206,38 @@ func (s *InstallerExecutorRPCServer) RemoveAlreadyInstalled(args *InstallerExecu
return nil
}
type InstallerExecutorFilterPackagesByVersionArgs struct {
Packages []alrsh.Package
OsRelease *distro.OSRelease
}
type InstallerExecutorFilterPackagesByVersionResp struct {
Result0 []alrsh.Package
}
func (s *InstallerExecutorRPC) FilterPackagesByVersion(ctx context.Context, packages []alrsh.Package, osRelease *distro.OSRelease) ([]alrsh.Package, error) {
var resp *InstallerExecutorFilterPackagesByVersionResp
err := s.client.Call("Plugin.FilterPackagesByVersion", &InstallerExecutorFilterPackagesByVersionArgs{
Packages: packages,
OsRelease: osRelease,
}, &resp)
if err != nil {
return nil, err
}
return resp.Result0, nil
}
func (s *InstallerExecutorRPCServer) FilterPackagesByVersion(args *InstallerExecutorFilterPackagesByVersionArgs, resp *InstallerExecutorFilterPackagesByVersionResp) error {
result0, err := s.Impl.FilterPackagesByVersion(context.Background(), args.Packages, args.OsRelease)
if err != nil {
return err
}
*resp = InstallerExecutorFilterPackagesByVersionResp{
Result0: result0,
}
return nil
}
type ScriptExecutorReadScriptArgs struct {
ScriptPath string
}

View File

@@ -167,30 +167,30 @@ func (e *LocalScriptExecutor) ExecuteSecondPass(
pkgName := packager.ConventionalFileName(pkgInfo) // Получаем имя файла пакета
pkgPath := filepath.Join(dirs.BaseDir, pkgName) // Определяем путь к пакету
slog.Info("Creating package file", "path", pkgPath, "name", pkgName)
slog.Info(gotext.Get("Creating package file"), "path", pkgPath, "name", pkgName)
pkgFile, err := os.Create(pkgPath)
if err != nil {
slog.Error("Failed to create package file", "path", pkgPath, "error", err)
slog.Error(gotext.Get("Failed to create package file"), "path", pkgPath, "error", err)
return nil, err
}
defer pkgFile.Close()
slog.Info("Packaging with nfpm", "format", pkgFormat)
slog.Info(gotext.Get("Packaging with nfpm"), "format", pkgFormat)
err = packager.Package(pkgInfo, pkgFile)
if err != nil {
slog.Error("Failed to create package", "path", pkgPath, "error", err)
slog.Error(gotext.Get("Failed to create package"), "path", pkgPath, "error", err)
return nil, err
}
slog.Info("Package created successfully", "path", pkgPath)
slog.Info(gotext.Get("Package created successfully"), "path", pkgPath)
// Проверяем, что файл действительно существует
if _, err := os.Stat(pkgPath); err != nil {
slog.Error("Package file not found after creation", "path", pkgPath, "error", err)
slog.Error(gotext.Get("Package file not found after creation"), "path", pkgPath, "error", err)
return nil, err
}
slog.Info("Package file verified to exist", "path", pkgPath)
slog.Info(gotext.Get("Package file verified to exist"), "path", pkgPath)
builtDeps = append(builtDeps, &BuiltDep{
Name: vars.Name,