From 29c1a3106648ebe4a36e05443e5949a1f5581141 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Fri, 28 Feb 2025 21:14:21 +0300 Subject: [PATCH] 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 }