Добавлено автодополнение системных пакетов в команде install

- Добавлен метод ListAvailable в интерфейс менеджера пакетов
- Реализован поиск доступных пакетов для всех менеджеров (apt, apt-rpm, dnf, yum, pacman, apk, zypper)
- Вынесена общая функция для apt и apt-rpm во избежание дублирования
- Автодополнение теперь выводит и ALR-пакеты, и системные с дедупликацией
- Добавлена фильтрация по префиксу для производительности
This commit is contained in:
2026-02-23 16:02:51 +03:00
parent 8ae3acef63
commit fcd454691f
10 changed files with 296 additions and 2 deletions

View File

@@ -21,6 +21,8 @@ package main
import (
"fmt"
"log/slog"
"strings"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
@@ -110,25 +112,52 @@ func InstallCmd() *cli.Command {
return nil
}),
BashComplete: cliutils.BashCompleteWithError(func(c *cli.Context) error {
ctx := c.Context
deps, err := appbuilder.
New(ctx).
WithConfig().
WithDB().
WithManager().
Build()
if err != nil {
return err
}
defer deps.Defer()
seen := make(map[string]struct{})
var prefix string
if c.Args().Len() > 0 {
prefix = c.Args().Get(c.Args().Len() - 1)
if strings.HasPrefix(prefix, "-") {
prefix = ""
}
}
result, err := deps.DB.GetPkgs(c.Context, "true")
if err != nil {
return cliutils.FormatCliExit(gotext.Get("Error getting packages"), err)
}
for _, pkg := range result {
fmt.Println(pkg.Name)
if prefix == "" || strings.HasPrefix(pkg.Name, prefix) {
if _, ok := seen[pkg.Name]; !ok {
seen[pkg.Name] = struct{}{}
fmt.Println(pkg.Name)
}
}
}
sysPkgs, err := deps.Manager.ListAvailable(prefix)
if err != nil {
slog.Debug("failed to list system packages", "err", err)
} else {
for _, name := range sysPkgs {
if _, ok := seen[name]; !ok {
seen[name] = struct{}{}
fmt.Println(name)
}
}
}
return nil