From 544f0fdd1ad5fc8713c965ac00721ff1338eb394 Mon Sep 17 00:00:00 2001 From: rsteube Date: Tue, 29 Nov 2022 20:35:50 +0100 Subject: [PATCH] pacman: sync - fix package search --- completers/pacman_completer/cmd/sync.go | 5 ++-- pkg/actions/tools/pacman/package.go | 34 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 pkg/actions/tools/pacman/package.go diff --git a/completers/pacman_completer/cmd/sync.go b/completers/pacman_completer/cmd/sync.go index 656924bd43..e115310d50 100644 --- a/completers/pacman_completer/cmd/sync.go +++ b/completers/pacman_completer/cmd/sync.go @@ -39,6 +39,7 @@ func initSyncCmd(cmd *cobra.Command) { cmd.Flags().BoolP("quiet", "q", false, "show less information for query and search") cmd.Flags().BoolP("refresh", "y", false, "download fresh package databases from the server") cmd.Flags().StringP("root", "r", "", "set an alternate installation root") + cmd.Flags().StringP("search", "s", "", "search remote repositories for matching strings") cmd.Flags().Bool("sysroot", false, "operate on a mounted guest system (root-only)") cmd.Flags().BoolP("sysupgrade", "u", false, "upgrade installed packages (-uu enables downgrades)") cmd.Flags().BoolP("verbose", "v", false, "be verbose") @@ -58,8 +59,6 @@ func initSyncCmd(cmd *cobra.Command) { }) carapace.Gen(cmd).PositionalAnyCompletion( - carapace.ActionCallback(func(c carapace.Context) carapace.Action { - return pacman.ActionPackages(pacman.PackageOption{}).Invoke(c).Filter(c.Args).ToA() - }), + pacman.ActionPackageSearch().UniqueList(","), ) } diff --git a/pkg/actions/tools/pacman/package.go b/pkg/actions/tools/pacman/package.go new file mode 100644 index 0000000000..059a45539e --- /dev/null +++ b/pkg/actions/tools/pacman/package.go @@ -0,0 +1,34 @@ +package pacman + +import ( + "regexp" + "strings" + + "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/style" +) + +// ActionPackageSearch completes installable packages +// +// a2ps (An Any to PostScript filter) +// a52dec (A free library for decoding ATSC A/52 streams) +func ActionPackageSearch() carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + return carapace.ActionExecCommand("pacman", "-Ss", "^"+c.CallbackValue)(func(output []byte) carapace.Action { + lines := strings.Split(string(output), "\n") + r := regexp.MustCompile(`^(?P[^/]+)/(?P[^ ]+) (?P[^ ]+)(?P.*)$`) + + vals := make([]string, 0) + for i := 0; i < len(lines)-1; i += 2 { + if matches := r.FindStringSubmatch(lines[i]); matches != nil { + s := style.Default + if strings.Contains(matches[4], "[installed]") { + s = style.Blue + } + vals = append(vals, matches[2], strings.TrimSpace(lines[i+1]), s) + } + } + return carapace.ActionStyledValuesDescribed(vals...) + }) + }) +}