#!/usr/bin/python3 """Fuzzy-find a file and check which package owns it. Dependencies ============ * fzf * mlocate """ import argparse import subprocess # ========== 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' # ========== Functions ========== def run_fzf(files): """Run fzf on a stream of searched files for the user to select. :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 return selected_file.decode(LOCALE).strip('\x00') 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])