Reimplement fqo script in python

This commit is contained in:
Eric Torres 2019-02-22 07:48:05 -08:00
parent 6e2e600a13
commit 3e80956bd0
2 changed files with 100 additions and 36 deletions

92
bin/fqo
View File

@ -1,44 +1,64 @@
#!/usr/bin/bash
# Fuzzy find a file and then check which package owns it
#!/usr/bin/python3
"""Fuzzy-find a file and check which package owns it.
declare -r scriptname="fqo"
Dependencies
============
* fzf
* mlocate
"""
printHelp() {
cat << helpinfo
${scriptname} - fuzzy find a file and then check which package owns it
import argparse
import subprocess
Usage: ${scriptname} [-h] [patterns]
# ========== Constants ==========
# Commands
PACMAN_CMD = '/usr/bin/pacman'
FZF_CMD = '/usr/bin/fzf'
FZF_OPTS = ['--read0', '--select-1', '--exit-0', '--print0']
LOCATE_CMD = '/usr/bin/locate'
LOCATE_OPTS = ['--all', '--ignore-case', '--null']
LOCALE = 'utf-8'
Options:
-h, --help print this help page
helpinfo
}
while true; do
case "${1}" in
"-h"|"--help")
printHelp
exit
;;
--)
shift
break
;;
-*)
printf '%s\n' "Unknown option: ${1}" >&2
exit 1
;;
*)
break
;;
esac
done
# ========== Functions ==========
def run_fzf(files):
"""Run fzf on a stream of searched files for the user to select.
[[ ! -x '/usr/bin/locate' ]] && echo 'locate is not present' && exit 1
[[ ! -x '/usr/bin/fzf' ]] && echo 'fzf is not present' && exit 1
[[ -z "${*}" ]] && printf '%s\n' "No patterns entered" >&2 && exit 1
:param files: stream of null-terminated files to read
:type files: bytes stream (stdout of a completed process)
:returns: selected file
:rtype: str
"""
selected_file = subprocess.run([FZF_CMD] + FZF_OPTS,
input=files,
stdout=subprocess.PIPE).stdout
file="$(locate --all --ignore-case --null -- "${@}" | fzf --exit-0 --select-1 --read0 --no-mouse)"
[[ ! "${file}" ]] && exit 1
return selected_file.decode(LOCALE).strip('\x00')
pacman -Qo "${file}"
def locate_files(patterns):
"""Use a locate-based program to locate files, then pass to fzf.
:param patterns: patterns to pass to locate
:type patterns: list
:returns: path of user-selected file
:rtype: bytes
"""
cmd = [LOCATE_CMD] + LOCATE_OPTS
cmd.extend(patterns)
return subprocess.run(cmd, capture_output=True).stdout
# ========== Main Script ==========
parser = argparse.ArgumentParser()
parser.add_argument('patterns',
nargs='+',
help='file pattern to search for')
args = parser.parse_args()
files = locate_files(args.patterns)
selected_file = run_fzf(files)
subprocess.run([PACMAN_CMD, '-Qo', selected_file])

44
misc/fqo.sh Normal file
View File

@ -0,0 +1,44 @@
#!/usr/bin/bash
# Fuzzy find a file and then check which package owns it
declare -r scriptname="fqo"
printHelp() {
cat << helpinfo
${scriptname} - fuzzy find a file and then check which package owns it
Usage: ${scriptname} [-h] [patterns]
Options:
-h, --help print this help page
helpinfo
}
while true; do
case "${1}" in
"-h"|"--help")
printHelp
exit
;;
--)
shift
break
;;
-*)
printf '%s\n' "Unknown option: ${1}" >&2
exit 1
;;
*)
break
;;
esac
done
[[ ! -x '/usr/bin/locate' ]] && echo 'locate is not present' && exit 1
[[ ! -x '/usr/bin/fzf' ]] && echo 'fzf is not present' && exit 1
[[ -z "${*}" ]] && printf '%s\n' "No patterns entered" >&2 && exit 1
file="$(locate --all --ignore-case --null -- "${@}" | fzf --exit-0 --select-1 --read0 --no-mouse)"
[[ ! "${file}" ]] && exit 1
pacman -Qo "${file}"