Улучшения обработки зависимостей и фильтрации установленных пакетов
- Добавлена поддержка версионных ограничений при установке пакетов - Улучшена логика фильтрации уже установленных пакетов - Добавлен метод GetInstalledVersion для всех менеджеров пакетов - Активированы тесты для систем archlinux, alpine, opensuse-leap - Улучшена обработка переменных в скриптах Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -25,6 +25,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
|
||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/depver"
|
||||
)
|
||||
|
||||
func (rs *Repos) FindPkgs(ctx context.Context, pkgs []string) (map[string][]alrsh.Package, []string, error) {
|
||||
@@ -36,39 +37,49 @@ func (rs *Repos) FindPkgs(ctx context.Context, pkgs []string) (map[string][]alrs
|
||||
continue
|
||||
}
|
||||
|
||||
// Parse version constraint from package name
|
||||
dep := depver.Parse(pkgName)
|
||||
searchName := dep.Name
|
||||
|
||||
var result []alrsh.Package
|
||||
var err error
|
||||
|
||||
switch {
|
||||
case strings.Contains(pkgName, "/"):
|
||||
case strings.Contains(searchName, "/"):
|
||||
// repo/pkg
|
||||
parts := strings.SplitN(pkgName, "/", 2)
|
||||
parts := strings.SplitN(searchName, "/", 2)
|
||||
repo := parts[0]
|
||||
name := parts[1]
|
||||
result, err = rs.db.GetPkgs(ctx, "name = ? AND repository = ?", name, repo)
|
||||
|
||||
case strings.Contains(pkgName, "+"):
|
||||
case strings.Contains(searchName, "+"):
|
||||
// pkg+repo
|
||||
parts := strings.SplitN(pkgName, "+", 2)
|
||||
parts := strings.SplitN(searchName, "+", 2)
|
||||
name := parts[0]
|
||||
repo := parts[1]
|
||||
result, err = rs.db.GetPkgs(ctx, "name = ? AND repository = ?", name, repo)
|
||||
|
||||
default:
|
||||
result, err = rs.db.GetPkgs(ctx, "json_array_contains(provides, ?)", pkgName)
|
||||
// Сначала ищем по точному имени пакета
|
||||
result, err = rs.db.GetPkgs(ctx, "name = ?", searchName)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("FindPkgs: get by provides: %w", err)
|
||||
return nil, nil, fmt.Errorf("FindPkgs: get by name: %w", err)
|
||||
}
|
||||
|
||||
// Затем по provides
|
||||
if len(result) == 0 {
|
||||
result, err = rs.db.GetPkgs(ctx, "basepkg_name = ?", pkgName)
|
||||
result, err = rs.db.GetPkgs(ctx, "json_array_contains(provides, ?)", searchName)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("FindPkgs: get by basepkg_name: %w", err)
|
||||
return nil, nil, fmt.Errorf("FindPkgs: get by provides: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// В последнюю очередь по basepkg_name (для мультипакетов)
|
||||
if len(result) == 0 {
|
||||
result, err = rs.db.GetPkgs(ctx, "name LIKE ?", pkgName)
|
||||
result, err = rs.db.GetPkgs(ctx, "basepkg_name = ?", searchName)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("FindPkgs: get by basepkg_name: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,6 +87,11 @@ func (rs *Repos) FindPkgs(ctx context.Context, pkgs []string) (map[string][]alrs
|
||||
return nil, nil, fmt.Errorf("FindPkgs: lookup for %q failed: %w", pkgName, err)
|
||||
}
|
||||
|
||||
// Filter by version if constraint is specified
|
||||
if dep.HasVersionConstraint() && len(result) > 0 {
|
||||
result = filterByVersion(result, dep)
|
||||
}
|
||||
|
||||
if len(result) == 0 {
|
||||
notFound = append(notFound, pkgName)
|
||||
} else {
|
||||
@@ -85,3 +101,14 @@ func (rs *Repos) FindPkgs(ctx context.Context, pkgs []string) (map[string][]alrs
|
||||
|
||||
return found, notFound, nil
|
||||
}
|
||||
|
||||
// filterByVersion filters packages by version constraint.
|
||||
func filterByVersion(pkgs []alrsh.Package, dep depver.Dependency) []alrsh.Package {
|
||||
var filtered []alrsh.Package
|
||||
for _, pkg := range pkgs {
|
||||
if dep.Satisfies(pkg.Version) {
|
||||
filtered = append(filtered, pkg)
|
||||
}
|
||||
}
|
||||
return filtered
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user