From 8f94b61a0ea5e1fabf86e4bb7900994b91491852 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Fri, 28 Feb 2025 20:15:02 +0300 Subject: [PATCH 1/3] fix: use +alr-{reponame} suffix --- build.go | 10 +- internal/translations/default.pot | 56 +++++------ internal/translations/po/ru/default.po | 64 ++++++------- internal/types/build.go | 2 + pkg/build/build.go | 125 +++++++++++++++++++++++-- pkg/build/utils.go | 117 +---------------------- 6 files changed, 189 insertions(+), 185 deletions(-) diff --git a/build.go b/build.go index 6b372bd..120d650 100644 --- a/build.go +++ b/build.go @@ -78,8 +78,7 @@ func BuildCmd() *cli.Command { var script string var packages []string - - // Проверяем, установлен ли флаг script (-s) + repository := "default" repoDir := cfg.GetPaths(ctx).RepoDir @@ -106,11 +105,13 @@ func BuildCmd() *cli.Command { os.Exit(1) } + repository = pkg[0].Repository + if pkg[0].BasePkgName != "" { - script = filepath.Join(repoDir, pkg[0].Repository, pkg[0].BasePkgName, "alr.sh") + script = filepath.Join(repoDir, repository, pkg[0].BasePkgName, "alr.sh") packages = append(packages, pkg[0].Name) } else { - script = filepath.Join(repoDir, pkg[0].Repository, pkg[0].Name, "alr.sh") + script = filepath.Join(repoDir, repository, pkg[0].Name, "alr.sh") } default: script = filepath.Join(repoDir, "alr.sh") @@ -142,6 +143,7 @@ func BuildCmd() *cli.Command { ctx, types.BuildOpts{ Packages: packages, + Repository: repository, Script: script, Manager: mgr, Clean: c.Bool("clean"), diff --git a/internal/translations/default.pot b/internal/translations/default.pot index 8e2ee3c..0c72ed8 100644 --- a/internal/translations/default.pot +++ b/internal/translations/default.pot @@ -34,31 +34,31 @@ msgstr "" msgid "Error initialization database" msgstr "" -#: build.go:105 +#: build.go:104 msgid "Package not found" msgstr "" -#: build.go:123 +#: build.go:124 msgid "Error pulling repositories" msgstr "" -#: build.go:131 +#: build.go:132 msgid "Unable to detect a supported package manager on the system" msgstr "" -#: build.go:137 +#: build.go:138 msgid "Error parsing os release" msgstr "" -#: build.go:158 +#: build.go:160 msgid "Error building package" msgstr "" -#: build.go:165 +#: build.go:167 msgid "Error getting working directory" msgstr "" -#: build.go:174 +#: build.go:176 msgid "Error moving the package" msgstr "" @@ -369,60 +369,68 @@ msgstr "" msgid "Downloading sources" msgstr "" -#: pkg/build/build.go:246 +#: pkg/build/build.go:250 msgid "Building package metadata" msgstr "" -#: pkg/build/build.go:268 +#: pkg/build/build.go:272 msgid "Compressing package" msgstr "" -#: pkg/build/build.go:421 +#: pkg/build/build.go:426 msgid "" "Your system's CPU architecture doesn't match this package. Do you want to " "build anyway?" msgstr "" -#: pkg/build/build.go:435 +#: pkg/build/build.go:440 msgid "This package is already installed" msgstr "" -#: pkg/build/build.go:459 +#: pkg/build/build.go:464 msgid "Installing build dependencies" msgstr "" -#: pkg/build/build.go:500 +#: pkg/build/build.go:505 msgid "Installing dependencies" msgstr "" -#: pkg/build/build.go:535 +#: pkg/build/build.go:540 msgid "The checksums array must be the same length as sources" msgstr "" -#: pkg/build/build.go:586 +#: pkg/build/build.go:591 msgid "Would you like to remove the build dependencies?" msgstr "" -#: pkg/build/build.go:649 +#: pkg/build/build.go:654 msgid "Executing prepare()" msgstr "" -#: pkg/build/build.go:659 +#: pkg/build/build.go:664 msgid "Executing build()" msgstr "" -#: pkg/build/build.go:689 pkg/build/build.go:709 +#: pkg/build/build.go:694 pkg/build/build.go:714 msgid "Executing %s()" msgstr "" -#: pkg/build/build.go:768 +#: pkg/build/build.go:773 msgid "Error installing native packages" msgstr "" -#: pkg/build/build.go:792 +#: pkg/build/build.go:797 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 "" @@ -435,14 +443,6 @@ 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 "" diff --git a/internal/translations/po/ru/default.po b/internal/translations/po/ru/default.po index 4420300..d446585 100644 --- a/internal/translations/po/ru/default.po +++ b/internal/translations/po/ru/default.po @@ -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:105 +#: build.go:104 msgid "Package not found" msgstr "Пакет не найден" -#: build.go:123 +#: build.go:124 msgid "Error pulling repositories" msgstr "Ошибка при извлечении репозиториев" -#: build.go:131 +#: build.go:132 msgid "Unable to detect a supported package manager on the system" msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе" -#: build.go:137 +#: build.go:138 msgid "Error parsing os release" msgstr "Ошибка при разборе файла выпуска операционной системы" -#: build.go:158 +#: build.go:160 msgid "Error building package" msgstr "Ошибка при сборке пакета" -#: build.go:165 +#: build.go:167 msgid "Error getting working directory" msgstr "Ошибка при получении рабочего каталога" -#: build.go:174 +#: build.go:176 msgid "Error moving the package" msgstr "Ошибка при перемещении пакета" @@ -383,15 +383,15 @@ msgstr "Сборка пакета" msgid "Downloading sources" msgstr "Скачивание источников" -#: pkg/build/build.go:246 +#: pkg/build/build.go:250 msgid "Building package metadata" msgstr "Сборка метаданных пакета" -#: pkg/build/build.go:268 +#: pkg/build/build.go:272 msgid "Compressing package" msgstr "Сжатие пакета" -#: pkg/build/build.go:421 +#: pkg/build/build.go:426 msgid "" "Your system's CPU architecture doesn't match this package. Do you want to " "build anyway?" @@ -399,46 +399,56 @@ msgstr "" "Архитектура процессора вашей системы не соответствует этому пакету. Вы все " "равно хотите выполнить сборку?" -#: pkg/build/build.go:435 +#: pkg/build/build.go:440 msgid "This package is already installed" msgstr "Этот пакет уже установлен" -#: pkg/build/build.go:459 +#: pkg/build/build.go:464 msgid "Installing build dependencies" msgstr "Установка зависимостей сборки" -#: pkg/build/build.go:500 +#: pkg/build/build.go:505 msgid "Installing dependencies" msgstr "Установка зависимостей" -#: pkg/build/build.go:535 +#: pkg/build/build.go:540 msgid "The checksums array must be the same length as sources" msgstr "Массив контрольных сумм должен быть той же длины, что и источники" -#: pkg/build/build.go:586 +#: pkg/build/build.go:591 msgid "Would you like to remove the build dependencies?" msgstr "Хотели бы вы удалить зависимости сборки?" -#: pkg/build/build.go:649 +#: pkg/build/build.go:654 msgid "Executing prepare()" msgstr "Исполнение prepare()" -#: pkg/build/build.go:659 +#: pkg/build/build.go:664 msgid "Executing build()" msgstr "Исполнение build()" -#: pkg/build/build.go:689 pkg/build/build.go:709 +#: pkg/build/build.go:694 pkg/build/build.go:714 msgid "Executing %s()" msgstr "Исполнение %s()" -#: pkg/build/build.go:768 +#: pkg/build/build.go:773 msgid "Error installing native packages" msgstr "Ошибка при установке нативных пакетов" -#: pkg/build/build.go:792 +#: pkg/build/build.go:797 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 "Команда не найдена в системе" @@ -451,16 +461,6 @@ 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 "Скачивание репозитория" diff --git a/internal/types/build.go b/internal/types/build.go index a975e92..6b5c6c9 100644 --- a/internal/types/build.go +++ b/internal/types/build.go @@ -23,6 +23,7 @@ import "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" type BuildOpts struct { Script string + Repository string Packages []string Manager manager.Manager Clean bool @@ -102,6 +103,7 @@ type BuildVars struct { Scripts Scripts `sh:"scripts"` AutoReq []string `sh:"auto_req"` AutoProv []string `sh:"auto_prov"` + Base string } type Scripts struct { diff --git a/pkg/build/build.go b/pkg/build/build.go index 38d91a5..35ff75e 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -28,6 +28,8 @@ import ( "log/slog" "os" "path/filepath" + "slices" + "strconv" "strings" "time" @@ -87,6 +89,7 @@ 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 @@ -116,14 +119,11 @@ 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 := checkForBuiltPackage( - b.opts.Manager, + builtPkgPath, ok, err := b.checkForBuiltPackage( vars, getPkgFormat(b.opts.Manager), dirs.BaseDir, - b.info, ) if err != nil { return nil, nil, err @@ -238,7 +238,11 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error) } for _, vars := range varsOfPackages { - funcOut, err := b.executePackageFunctions(ctx, dec, dirs, vars.Name) + packageName := "" + if vars.Base != "" { + packageName = vars.Name + } + funcOut, err := b.executePackageFunctions(ctx, dec, dirs, packageName) if err != nil { return nil, nil, err } @@ -247,7 +251,7 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error) pkgFormat := getPkgFormat(b.opts.Manager) // Получаем формат пакета - pkgInfo, err := buildPkgMetadata(ctx, vars, dirs, pkgFormat, b.info, append(repoDeps, builtNames...), funcOut.Contents) // Собираем метаданные пакета + pkgInfo, err := b.buildPkgMetadata(ctx, vars, dirs, pkgFormat, append(repoDeps, builtNames...), funcOut.Contents) // Собираем метаданные пакета if err != nil { return nil, nil, err } @@ -366,6 +370,7 @@ func (b *Builder) executeFirstPass( } vars := preVars.ToBuildVars() vars.Name = pkgName + vars.Base = pkgs.BasePkgName varsOfPackages = append(varsOfPackages, &vars) } @@ -678,8 +683,8 @@ func (b *Builder) executePackageFunctions( var filesFuncName string if packageName == "" { - filesFuncName = "files" packageFuncName = "package" + filesFuncName = "files" } else { packageFuncName = fmt.Sprintf("package_%s", packageName) filesFuncName = fmt.Sprintf("files_%s", packageName) @@ -795,3 +800,109 @@ 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 +} diff --git a/pkg/build/utils.go b/pkg/build/utils.go index 3b3ba49..15db132 100644 --- a/pkg/build/utils.go +++ b/pkg/build/utils.go @@ -17,9 +17,8 @@ package build import ( - "context" + "fmt" "io" - "log/slog" "os" "path/filepath" "runtime" @@ -33,7 +32,6 @@ 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" @@ -42,7 +40,6 @@ 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" @@ -77,77 +74,6 @@ 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) { @@ -244,33 +170,9 @@ func buildContents(vars *types.BuildVars, dirs types.Directories, preferedConten return contents, nil } -// Функция 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 - } - - 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 { +func getBasePkgInfo(vars *types.BuildVars, info *distro.OSRelease, opts *types.BuildOpts) *nfpm.Info { return &nfpm.Info{ - Name: vars.Name, + Name: fmt.Sprintf("%s+alr-%s", vars.Name, opts.Repository), Arch: cpu.Arch(), Version: vars.Version, Release: overrides.ReleasePlatformSpecific(vars.Release, info), @@ -278,19 +180,6 @@ func getBasePkgInfo(vars *types.BuildVars, info *distro.OSRelease) *nfpm.Info { } } -// 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 { -- 2.43.5 From 29c1a3106648ebe4a36e05443e5949a1f5581141 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Fri, 28 Feb 2025 21:14:21 +0300 Subject: [PATCH 2/3] fix: fix list and upgrade commands with new naming --- internal/translations/default.pot | 4 +- internal/translations/po/ru/default.po | 4 +- list.go | 16 ++++-- pkg/build/utils.go | 3 ++ upgrade.go | 74 ++++++++++++++------------ 5 files changed, 60 insertions(+), 41 deletions(-) diff --git a/internal/translations/default.pot b/internal/translations/default.pot index 0c72ed8..a9ba2a6 100644 --- a/internal/translations/default.pot +++ b/internal/translations/default.pot @@ -323,11 +323,11 @@ msgstr "" msgid "ERROR" msgstr "" -#: list.go:40 +#: list.go:41 msgid "List ALR repo packages" msgstr "" -#: list.go:91 +#: list.go:92 msgid "Error listing installed packages" msgstr "" diff --git a/internal/translations/po/ru/default.po b/internal/translations/po/ru/default.po index d446585..710135a 100644 --- a/internal/translations/po/ru/default.po +++ b/internal/translations/po/ru/default.po @@ -335,11 +335,11 @@ msgstr "%s %s загружается — %s/с\n" msgid "ERROR" msgstr "ОШИБКА" -#: list.go:40 +#: list.go:41 msgid "List ALR repo packages" msgstr "Список пакетов репозитория ALR" -#: list.go:91 +#: list.go:92 msgid "Error listing installed packages" msgstr "Ошибка при составлении списка установленных пакетов" diff --git a/list.go b/list.go index 6552f52..003b69d 100644 --- a/list.go +++ b/list.go @@ -30,6 +30,7 @@ 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" ) @@ -78,7 +79,7 @@ func ListCmd() *cli.Command { } defer result.Close() - var installed map[string]string + installedAlrPackages := map[string]string{} if c.Bool("installed") { mgr := manager.Detect() if mgr == nil { @@ -86,11 +87,20 @@ 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() { @@ -106,7 +116,7 @@ func ListCmd() *cli.Command { version := pkg.Version if c.Bool("installed") { - instVersion, ok := installed[pkg.Name] + instVersion, ok := installedAlrPackages[fmt.Sprintf("%s/%s", pkg.Repository, pkg.Name)] if !ok { continue } else { diff --git a/pkg/build/utils.go b/pkg/build/utils.go index 15db132..7354ca6 100644 --- a/pkg/build/utils.go +++ b/pkg/build/utils.go @@ -21,6 +21,7 @@ import ( "io" "os" "path/filepath" + "regexp" "runtime" "slices" "strconv" @@ -170,6 +171,8 @@ func buildContents(vars *types.BuildVars, dirs types.Directories, preferedConten return contents, nil } +var RegexpALRPackageName = regexp.MustCompile(`^(?P[^+]+)\+alr-(?P.+)$`) + func getBasePkgInfo(vars *types.BuildVars, info *distro.OSRelease, opts *types.BuildOpts) *nfpm.Info { return &nfpm.Info{ Name: fmt.Sprintf("%s+alr-%s", vars.Name, opts.Repository), diff --git a/upgrade.go b/upgrade.go index f3aadf7..3e52b85 100644 --- a/upgrade.go +++ b/upgrade.go @@ -29,7 +29,6 @@ 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" @@ -39,6 +38,7 @@ 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, rs, info) + updates, err := checkForUpdates(ctx, mgr, cfg, db, rs, info) if err != nil { slog.Error(gotext.Get("Error checking for updates"), "err", err) os.Exit(1) @@ -121,6 +121,7 @@ func checkForUpdates( ctx context.Context, mgr manager.Manager, cfg *config.ALRConfig, + db *database.Database, rs *repos.Repos, info *distro.OSRelease, ) ([]database.Package, error) { @@ -130,42 +131,47 @@ func checkForUpdates( } pkgNames := maps.Keys(installed) - found, _, err := rs.FindPkgs(ctx, pkgNames) - if err != nil { - return nil, err - } + + s := search.New(db) var out []database.Package - for pkgName, pkgs := range found { - if slices.Contains(cfg.IgnorePkgUpdates(ctx), pkgName) { - continue + 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) + } } - 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 } -- 2.43.5 From 71968bbe135eab7f95f586884b12ec87f5679df4 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Fri, 28 Feb 2025 21:14:59 +0300 Subject: [PATCH 3/3] fix: fix config saving --- internal/config/config.go | 4 ++++ repo.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/config/config.go b/internal/config/config.go index ff400c3..737cc35 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -193,3 +193,7 @@ 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) +} diff --git a/repo.go b/repo.go index e6df733..9491a7c 100644 --- a/repo.go +++ b/repo.go @@ -83,7 +83,7 @@ func AddRepoCmd() *cli.Command { os.Exit(1) } - err = toml.NewEncoder(cfgFl).Encode(cfg) + err = cfg.Save(cfgFl) if err != nil { slog.Error(gotext.Get("Error encoding config"), "err", err) os.Exit(1) -- 2.43.5