63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/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])
 |