def get_new_command(command): broken = re.findall(r"env: no such command ['`]([^']*)'", command.output)[0] matched = [replace_argument(command.script, broken, common_typo) for common_typo in COMMON_TYPOS.get(broken, [])] app = command.script_parts[0] app_commands = cache(which(app))(get_app_commands)(app) matched.extend(replace_command(command, broken, app_commands)) return matched
@for_app("gem") def match(command): return ("ERROR: While executing gem ... (Gem::CommandLineError)" in command.output and "Unknown command" in command.output) def _get_unknown_command(command): return re.findall(r"Unknown command (.*)$", command.output)[0] @eager def _get_all_commands(): proc = subprocess.Popen(["gem", "help", "commands"], stdout=subprocess.PIPE) for line in proc.stdout.readlines(): line = line.decode() if line.startswith(" "): yield line.strip().split(" ")[0] if which("gem"): _get_all_commands = cache(which("gem"))(_get_all_commands) def get_new_command(command): unknown_command = _get_unknown_command(command) all_commands = _get_all_commands() return replace_command(command, unknown_command, all_commands)
import re import subprocess from thefuck.utils import replace_command, for_app, which, cache from thefuck.specific.sudo import sudo_support @sudo_support @for_app('docker') def match(command): return 'is not a docker command' in command.output def get_docker_commands(): proc = subprocess.Popen('docker', stdout=subprocess.PIPE) lines = [line.decode('utf-8') for line in proc.stdout.readlines()] lines = dropwhile(lambda line: not line.startswith('Commands:'), lines) lines = islice(lines, 1, None) lines = list(takewhile(lambda line: line != '\n', lines)) return [line.strip().split(' ')[0] for line in lines] if which('docker'): get_docker_commands = cache(which('docker'))(get_docker_commands) @sudo_support def get_new_command(command): wrong_command = re.findall( r"docker: '(\w+)' is not a docker command.", command.output)[0] return replace_command(command, wrong_command, get_docker_commands())
@for_app('gem') def match(command): return ('ERROR: While executing gem ... (Gem::CommandLineError)' in command.output and 'Unknown command' in command.output) def _get_unknown_command(command): return re.findall(r'Unknown command (.*)$', command.output)[0] @eager def _get_all_commands(): proc = subprocess.Popen(['gem', 'help', 'commands'], stdout=subprocess.PIPE) for line in proc.stdout.readlines(): line = line.decode() if line.startswith(' '): yield line.strip().split(' ')[0] if which('gem'): _get_all_commands = cache(which('gem'))(_get_all_commands) def get_new_command(command): unknown_command = _get_unknown_command(command) all_commands = _get_all_commands() return replace_command(command, unknown_command, all_commands)
from itertools import dropwhile, islice, takewhile import subprocess from thefuck.utils import get_closest, replace_argument, for_app, which, cache def get_golang_commands(): proc = subprocess.Popen('go', stderr=subprocess.PIPE) lines = [line.decode('utf-8').strip() for line in proc.stderr.readlines()] lines = dropwhile(lambda line: line != 'The commands are:', lines) lines = islice(lines, 2, None) lines = takewhile(lambda line: line, lines) return [line.split(' ')[0] for line in lines] if which('go'): get_golang_commands = cache(which('go'))(get_golang_commands) @for_app('go') def match(command): return 'unknown command' in command.output def get_new_command(command): closest_subcommand = get_closest(command.script_parts[1], get_golang_commands()) return replace_argument(command.script, command.script_parts[1], closest_subcommand)
npm_commands = {'require': 'add'} @eager def _get_all_tasks(): proc = Popen(['yarn', '--help'], stdout=PIPE) should_yield = False for line in proc.stdout.readlines(): line = line.decode().strip() if 'Commands:' in line: should_yield = True continue if should_yield and '- ' in line: yield line.split(' ')[-1] if which('yarn'): _get_all_tasks = cache(which('yarn'))(_get_all_tasks) def get_new_command(command): misspelled_task = regex.findall(command.output)[0] if misspelled_task in npm_commands: yarn_command = npm_commands[misspelled_task] return replace_argument(command.script, misspelled_task, yarn_command) else: tasks = _get_all_tasks() return replace_command(command, misspelled_task, tasks)
from thefuck.utils import (cache, for_app, replace_argument, replace_command, which) COMMON_TYPOS = { 'list': ['versions', 'install --list'], 'remove': ['uninstall'], } @for_app('pyenv') def match(command): return 'pyenv: no such command' in command.output def get_pyenv_commands(): proc = Popen(['pyenv', 'commands'], stdout=PIPE) return [line.decode('utf-8').strip() for line in proc.stdout.readlines()] if which('pyenv'): get_pyenv_commands = cache(which('pyenv'))(get_pyenv_commands) @for_app('pyenv') def get_new_command(command): broken = re.findall(r"pyenv: no such command `([^']*)'", command.output)[0] matched = [replace_argument(command.script, broken, common_typo) for common_typo in COMMON_TYPOS.get(broken, [])] matched.extend(replace_command(command, broken, get_pyenv_commands())) return matched
COMMON_TYPOS = { "list": ["versions", "install --list"], "remove": ["uninstall"], } @for_app("pyenv") def match(command): return "pyenv: no such command" in command.output def get_pyenv_commands(): proc = Popen(["pyenv", "commands"], stdout=PIPE) return [line.decode("utf-8").strip() for line in proc.stdout.readlines()] if which("pyenv"): get_pyenv_commands = cache(which("pyenv"))(get_pyenv_commands) @for_app("pyenv") def get_new_command(command): broken = re.findall(r"pyenv: no such command `([^']*)'", command.output)[0] matched = [ replace_argument(command.script, broken, common_typo) for common_typo in COMMON_TYPOS.get(broken, []) ] matched.extend(replace_command(command, broken, get_pyenv_commands())) return matched
from thefuck.utils import cache from thefuck.utils import for_app from thefuck.utils import get_closest from thefuck.utils import replace_argument from thefuck.utils import which def get_golang_commands(): proc = subprocess.Popen("go", stderr=subprocess.PIPE) lines = [line.decode("utf-8").strip() for line in proc.stderr.readlines()] lines = dropwhile(lambda line: line != "The commands are:", lines) lines = islice(lines, 2, None) lines = takewhile(lambda line: line, lines) return [line.split(" ")[0] for line in lines] if which("go"): get_docker_commands = cache(which("go"))(get_golang_commands) @for_app("go") def match(command): return "unknown command" in command.output def get_new_command(command): closest_subcommand = get_closest(command.script_parts[1], get_golang_commands()) return replace_argument(command.script, command.script_parts[1], closest_subcommand)
stderr=subprocess.PIPE) # Old version docker returns its output to stdout, while newer version returns to stderr. lines = proc.stdout.readlines() or proc.stderr.readlines() lines = [line.decode('utf-8') for line in lines] # Only newer versions of docker have management commands in the help text. if 'Management Commands:\n' in lines: management_commands = _parse_commands(lines, 'Management Commands:') else: management_commands = [] regular_commands = _parse_commands(lines, 'Commands:') return management_commands + regular_commands if which('docker'): get_docker_commands = cache(which('docker'))(get_docker_commands) @sudo_support def get_new_command(command): if 'Usage:' in command.output and len(command.script_parts) > 1: management_subcommands = _parse_commands(command.output.split('\n'), 'Commands:') return replace_command(command, command.script_parts[2], management_subcommands) wrong_command = re.findall(r"docker: '(\w+)' is not a docker command.", command.output)[0] return replace_command(command, wrong_command, get_docker_commands())
@sudo_support @for_app('yum') def match(command): return 'No such command: ' in command.output def _get_operations(): proc = subprocess.Popen('yum', stdout=subprocess.PIPE) lines = proc.stdout.readlines() lines = [line.decode('utf-8') for line in lines] lines = dropwhile(lambda line: not line.startswith("List of Commands:"), lines) lines = islice(lines, 2, None) lines = list(takewhile(lambda line: line.strip(), lines)) return [line.strip().split(' ')[0] for line in lines] if which('yum'): _get_operations = cache(which('yum'))(_get_operations) @sudo_support def get_new_command(command): invalid_operation = command.script_parts[1] if invalid_operation == 'uninstall': return [command.script.replace('uninstall', 'remove')] return replace_command(command, invalid_operation, _get_operations())
stderr=subprocess.PIPE) # Old version docker returns its output to stdout, while newer version returns to stderr. lines = proc.stdout.readlines() or proc.stderr.readlines() lines = [line.decode("utf-8") for line in lines] # Only newer versions of docker have management commands in the help text. if "Management Commands:\n" in lines: management_commands = _parse_commands(lines, "Management Commands:") else: management_commands = [] regular_commands = _parse_commands(lines, "Commands:") return management_commands + regular_commands if which("docker"): get_docker_commands = cache(which("docker"))(get_docker_commands) @sudo_support def get_new_command(command): if "Usage:" in command.output and len(command.script_parts) > 1: management_subcommands = _parse_commands(command.output.split("\n"), "Commands:") return replace_command(command, command.script_parts[2], management_subcommands) wrong_command = re.findall(r"docker: '(\w+)' is not a docker command.", command.output)[0] return replace_command(command, wrong_command, get_docker_commands())
@sudo_support @for_app("yum") def match(command): return "No such command: " in command.output def _get_operations(): proc = subprocess.Popen("yum", stdout=subprocess.PIPE) lines = proc.stdout.readlines() lines = [line.decode("utf-8") for line in lines] lines = dropwhile(lambda line: not line.startswith("List of Commands:"), lines) lines = islice(lines, 2, None) lines = list(takewhile(lambda line: line.strip(), lines)) return [line.strip().split(" ")[0] for line in lines] if which("yum"): _get_operations = cache(which("yum"))(_get_operations) @sudo_support def get_new_command(command): invalid_operation = command.script_parts[1] if invalid_operation == "uninstall": return [command.script.replace("uninstall", "remove")] return replace_command(command, invalid_operation, _get_operations())
def match(command): return ('ERROR: While executing gem ... (Gem::CommandLineError)' in command.output and 'Unknown command' in command.output) def _get_unknown_command(command): return re.findall(r'Unknown command (.*)$', command.output)[0] @eager def _get_all_commands(): proc = subprocess.Popen(['gem', 'help', 'commands'], stdout=subprocess.PIPE) for line in proc.stdout.readlines(): line = line.decode() if line.startswith(' '): yield line.strip().split(' ')[0] if which('gem'): _get_all_commands = cache(which('gem'))(_get_all_commands) def get_new_command(command): unknown_command = _get_unknown_command(command) all_commands = _get_all_commands() return replace_command(command, unknown_command, all_commands)
npm_commands = {"require": "add"} @eager def _get_all_tasks(): proc = Popen(["yarn", "--help"], stdout=PIPE) should_yield = False for line in proc.stdout.readlines(): line = line.decode().strip() if "Commands:" in line: should_yield = True continue if should_yield and "- " in line: yield line.split(" ")[-1] if which("yarn"): _get_all_tasks = cache(which("yarn"))(_get_all_tasks) def get_new_command(command): misspelled_task = regex.findall(command.output)[0] if misspelled_task in npm_commands: yarn_command = npm_commands[misspelled_task] return replace_argument(command.script, misspelled_task, yarn_command) else: tasks = _get_all_tasks() return replace_command(command, misspelled_task, tasks)