Добавление статистики
Исправление работы с мультипакетами
This commit is contained in:
@@ -103,22 +103,62 @@ func ShowScript(path, name, style string) error {
|
||||
// FlattenPkgs attempts to flatten the a map of slices of packages into a single slice
|
||||
// of packages by prompting the user if multiple packages match.
|
||||
func FlattenPkgs(ctx context.Context, found map[string][]alrsh.Package, verb string, interactive bool) []alrsh.Package {
|
||||
return FlattenPkgsWithContext(ctx, found, verb, interactive, false)
|
||||
}
|
||||
|
||||
// FlattenPkgsWithContext расширенная версия FlattenPkgs с контекстом обработки зависимостей
|
||||
func FlattenPkgsWithContext(ctx context.Context, found map[string][]alrsh.Package, verb string, interactive bool, isDependency bool) []alrsh.Package {
|
||||
var outPkgs []alrsh.Package
|
||||
for _, pkgs := range found {
|
||||
if len(pkgs) > 1 && interactive {
|
||||
choice, err := PkgPrompt(ctx, pkgs, verb, interactive)
|
||||
if err != nil {
|
||||
slog.Error(gotext.Get("Error prompting for choice of package"))
|
||||
os.Exit(1)
|
||||
if len(pkgs) > 1 {
|
||||
// Проверяем, являются ли пакеты подпакетами одного мультипакета
|
||||
if isMultiPackage(pkgs) && verb == "install" {
|
||||
// Для мультипакетов при установке ВСЕГДА берем все подпакеты без выбора
|
||||
// Это правильное поведение как для прямой установки, так и для зависимостей
|
||||
outPkgs = append(outPkgs, pkgs...)
|
||||
} else if interactive {
|
||||
// Для разных пакетов с одинаковым именем - показываем меню выбора
|
||||
choice, err := PkgPrompt(ctx, pkgs, verb, interactive)
|
||||
if err != nil {
|
||||
slog.Error(gotext.Get("Error prompting for choice of package"))
|
||||
os.Exit(1)
|
||||
}
|
||||
outPkgs = append(outPkgs, choice)
|
||||
} else {
|
||||
// Если не интерактивный режим - берем первый
|
||||
outPkgs = append(outPkgs, pkgs[0])
|
||||
}
|
||||
outPkgs = append(outPkgs, choice)
|
||||
} else if len(pkgs) == 1 || !interactive {
|
||||
} else {
|
||||
// Если только один пакет - берем его
|
||||
outPkgs = append(outPkgs, pkgs[0])
|
||||
}
|
||||
}
|
||||
return outPkgs
|
||||
}
|
||||
|
||||
// isMultiPackage проверяет, являются ли пакеты подпакетами одного мультипакета
|
||||
func isMultiPackage(pkgs []alrsh.Package) bool {
|
||||
if len(pkgs) <= 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
// Проверяем, что у всех пакетов одинаковый BasePkgName и Repository
|
||||
firstBasePkg := pkgs[0].BasePkgName
|
||||
firstRepo := pkgs[0].Repository
|
||||
|
||||
if firstBasePkg == "" {
|
||||
return false // Не мультипакет
|
||||
}
|
||||
|
||||
for _, pkg := range pkgs[1:] {
|
||||
if pkg.BasePkgName != firstBasePkg || pkg.Repository != firstRepo {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// PkgPrompt asks the user to choose between multiple packages.
|
||||
func PkgPrompt(ctx context.Context, options []alrsh.Package, verb string, interactive bool) (alrsh.Package, error) {
|
||||
if !interactive {
|
||||
|
Reference in New Issue
Block a user