diff --git a/tests/rules/test_apt_invalid_operation.py b/tests/rules/test_apt_invalid_operation.py index b4bf8443..2ad39433 100644 --- a/tests/rules/test_apt_invalid_operation.py +++ b/tests/rules/test_apt_invalid_operation.py @@ -76,7 +76,7 @@ apt_get_operations = ['update', 'upgrade', 'install', 'remove', 'autoremove', 'dselect-upgrade', 'clean', 'autoclean', 'check', 'changelog', 'download'] -new_apt_get_help = '''apt 1.6.12 (amd64) +new_apt_get_help = b'''apt 1.6.12 (amd64) Usage: apt-get [options] command apt-get [options] install|remove pkg1 [pkg2 ...] apt-get [options] source pkg1 [pkg2 ...] diff --git a/thefuck/rules/apt_invalid_operation.py b/thefuck/rules/apt_invalid_operation.py index d31d70d8..8641939f 100644 --- a/thefuck/rules/apt_invalid_operation.py +++ b/thefuck/rules/apt_invalid_operation.py @@ -6,8 +6,8 @@ from thefuck.utils import for_app, eager, replace_command enabled_by_default = apt_available -@for_app('apt', 'apt-get', 'apt-cache') @sudo_support +@for_app('apt', 'apt-get', 'apt-cache') def match(command): return 'E: Invalid operation' in command.output @@ -20,8 +20,22 @@ def _parse_apt_operations(help_text_lines): if is_commands_list and line: yield line.split()[0] elif line.startswith('Basic commands:') \ - or line.startswith('Most used commands:') \ - or line.startswith('Commands:'): + or line.startswith('Most used commands:'): + is_commands_list = True + + +@eager +def _parse_apt_get_and_cache_operations(help_text_lines): + is_commands_list = False + for line in help_text_lines: + line = line.decode().strip() + if is_commands_list: + if not line: + return + + yield line.split()[0] + elif line.startswith('Commands:') \ + or line.startswith('Most used commands:'): is_commands_list = True @@ -31,11 +45,19 @@ def _get_operations(app): stderr=subprocess.PIPE) lines = proc.stdout.readlines() - return _parse_apt_operations(lines) + if app == 'apt': + return _parse_apt_operations(lines) + else: + return _parse_apt_get_and_cache_operations(lines) @sudo_support def get_new_command(command): invalid_operation = command.output.split()[-1] - operations = _get_operations(command.script_parts[0]) - return replace_command(command, invalid_operation, operations) + + if invalid_operation == 'uninstall': + return [command.script.replace('uninstall', 'remove')] + + else: + operations = _get_operations(command.script_parts[0]) + return replace_command(command, invalid_operation, operations)