LinkedIn Sourceforge

Vincent's Blog

Pleasure in the job puts perfection in the work (Aristote)

Fuzzy search within the OpenBSD packages

Posted on 2020-05-24 22:24:00 from Vincent in OpenBSD

fzf is an addicting tool for what concerns search. The overall process is very simple, despite very quick. Moreover the tool is well presented. This post will describe how to integrate fzf with OpenBSD packages.


Introduction

Searching keyword in packages description or package name is not the most powerful feature we have in OpenBSD. The FAQ proposes to search a file or a keyword in the package's name (by doing a grep in the ports tree). Or to perform SQL queries for advances search.
For simple search in package's name, we have pkg_info -Q to our help.

When I saw what others are doing with fzf, like apt-fzf, I had the idea to perform the same with OpenBSD.

Pre-requisites

You first have to install some packages:

doas pkg_add fzf sqlports

fzf is the fuzzy search tool.

sqlports is an SQLite DB consolidating all information concerning available packages.

Fuzzy search combined with pkg_add

Basically the idea is to provide to fzf the result of a SQLite query. Then the output of fzf will be send to pkg_add.

In order to have some package's details in the right panel, we will have an extra script for that only purpose.

Thus, if you count well, we will have 3 small scripts: pkg_search, fzpkg_add and pkg_descr

pkg_search

This script will search in SQLite DB build by sqlports all packages containing the keyword provided as parameter either in the package's name or in the package's comment or in the package's description.

sqlite3 /usr/local/share/sqlports "SELECT DISTINCT PathId, FULLPKGNAME,COMMENT FROM Ports WHERE FULLPKGNAME LIKE "%$1%" or COMMENT LIKE "%$1%" or DESCR_CONTENTS LIKE "%$1%" ORDER BY FULLPKGNAME;"

fzpkg_add

The core script is the one feeding fzf and analysing the outputs of fzf in order to send them to pkg_add.

pkgs=$(pkg_search $1 | fzf-tmux -m --tac +s --preview "pkg_descr {1}" --bind "ctrl-d:toggle-preview")
set -A params
IFS='
'
for line in $pkgs
do
  pkg=$(echo $line | cut -d"|" -f2)
  params[${#params}]="$pkg"
done

[ -n "$params" ] && (echo "pkg_add ${params[@]}" ; pkg_add ${params[@]})

The exchange of information between the scripts is always based on the packages's PathId. This is a unique identifier inside sqlports for each packages.

As you can also see, the right panel can be hidden by hitting Ctrl-d.

To keep an sort based on those PathID, which follows more or less the package's name, we ask fzf to not sort data.

The script is able to manage multiple selections. All selected packages will be sent to the command pkg_add

pkg_descr

Finally a small script displaying package's details.

pkgid=$(echo $1 | cut -d "|" -f1)
echo "Category:"
sqlite3 /usr/local/share/sqlports "select DISTINCT FullPkgPath from Categories where PathId="$pkgid";"
echo " "

res=$(sqlite3 /usr/local/share/sqlports "select Value from Flavors where PathId="$pkgid";"| tr '\n' ', ')
[ -n "$res" ] && echo "Flavors:\n${res%%,}\n"

echo "Description:"
sqlite3 /usr/local/share/sqlports "SELECT Value FROM Descr WHERE PathId = "$pkgid";"

In this script we look for most relevant details of a package: his category, if he has flavors and a package's description.

Download source files

You can download all those scripts from my fzpkg_add repository

Demo

A small video showing how it works:(better in full screen)

Conclusions

All in all those small scripts around sqlports and fzf are really useful if you want to search for packages with having /usr/ports installed and without querying openports.se.

This match perfectly my own needs. Do it is useful for other OpenBSD users ?
Should develop further those scripts ?



47, 46
displayed: 13810
Comments:

1. From Marc on Thu Nov 12 16:12:14 2020

very nice, pkg tools are kind of short of utility when you compare them to freebsd and this scripts help quite a bit. Thank you!

2. From Marc on Thu Nov 12 17:09:26 2020

a couple of suggestions/feedback: - it would be nice to use a modifier to decide if you want to search only name, full name or/and description. sometimes it can bring a lot of extra output, for example "fzpkg_add kde" show a lot of unrelated packages. - i'd rather not use fzpkg_add as root, so it would be great that it used doas/sudo and asked for confirmation before actually using pkg_add at the end of the script to avoid installing packages by error. great job!

3. From Vincent on Fri Nov 13 00:20:41 2020

Thanks Marc for your support. Concerning suggestions, I'll look at them. In any cases feel free to provide patches.




What is the first letter of the word Moon?