diff --git a/tests/rules/__init__.py b/tests/rules/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/rules/conftest.py b/tests/rules/conftest.py new file mode 100644 index 00000000..94152a6c --- /dev/null +++ b/tests/rules/conftest.py @@ -0,0 +1,6 @@ +import pytest + + +@pytest.fixture(autouse=True) +def generic_shell(monkeypatch): + monkeypatch.setattr('thefuck.shells.and_', lambda *x: ' && '.join(x)) diff --git a/thefuck/rules/apt_get.py b/thefuck/rules/apt_get.py index 4d5eca6b..b78bb743 100644 --- a/thefuck/rules/apt_get.py +++ b/thefuck/rules/apt_get.py @@ -1,3 +1,5 @@ +from thefuck import shells + try: import CommandNotFound except ImportError: @@ -20,4 +22,5 @@ def get_new_command(command, settings): c = CommandNotFound.CommandNotFound() pkgs = c.getPackages(command.script.split(" ")[0]) name, _ = pkgs[0] - return "sudo apt-get install {} && {}".format(name, command.script) + formatme = shells.and_('sudo apt-get install {}', '{}') + return formatme.format(name, command.script) diff --git a/thefuck/rules/cd_mkdir.py b/thefuck/rules/cd_mkdir.py index 7aa1d9da..168a2ce0 100644 --- a/thefuck/rules/cd_mkdir.py +++ b/thefuck/rules/cd_mkdir.py @@ -1,4 +1,5 @@ import re +from thefuck import shells from thefuck.utils import sudo_support @@ -11,4 +12,5 @@ def match(command, settings): @sudo_support def get_new_command(command, settings): - return re.sub(r'^cd (.*)', 'mkdir -p \\1 && cd \\1', command.script) + repl = shells.and_('mkdir -p \\1', 'cd \\1') + return re.sub(r'^cd (.*)', repl, command.script) diff --git a/thefuck/rules/git_add.py b/thefuck/rules/git_add.py index 66c7f1dc..bc05d011 100644 --- a/thefuck/rules/git_add.py +++ b/thefuck/rules/git_add.py @@ -1,4 +1,5 @@ import re +from thefuck import shells def match(command, settings): @@ -12,4 +13,5 @@ def get_new_command(command, settings): r"error: pathspec '([^']*)' " "did not match any file\(s\) known to git.", command.stderr)[0] - return 'git add -- {} && {}'.format(missing_file, command.script) + formatme = shells.and_('git add -- {}', '{}') + return formatme.format(missing_file, command.script) diff --git a/thefuck/rules/git_checkout.py b/thefuck/rules/git_checkout.py index 271562b8..6c9d259f 100644 --- a/thefuck/rules/git_checkout.py +++ b/thefuck/rules/git_checkout.py @@ -1,4 +1,5 @@ import re +from thefuck import shells def match(command, settings): @@ -12,4 +13,5 @@ def get_new_command(command, settings): r"error: pathspec '([^']*)' " "did not match any file\(s\) known to git.", command.stderr)[0] - return 'git branch {} && {}'.format(missing_file, command.script) + formatme = shells.and_('git branch {}', '{}') + return formatme.format(missing_file, command.script) diff --git a/thefuck/rules/git_stash.py b/thefuck/rules/git_stash.py index 58bfbb38..9e9034a3 100644 --- a/thefuck/rules/git_stash.py +++ b/thefuck/rules/git_stash.py @@ -1,3 +1,6 @@ +from thefuck import shells + + def match(command, settings): # catches "Please commit or stash them" and "Please, commit your changes or # stash them before you can switch branches." @@ -5,4 +8,5 @@ def match(command, settings): def get_new_command(command, settings): - return 'git stash && ' + command.script + formatme = shells.and_('git stash', '{}') + return formatme.format(command.script) diff --git a/thefuck/rules/no_such_file.py b/thefuck/rules/no_such_file.py index 9a0f3b45..44572f19 100644 --- a/thefuck/rules/no_such_file.py +++ b/thefuck/rules/no_such_file.py @@ -1,4 +1,5 @@ import re +from thefuck import shells patterns = ( @@ -25,4 +26,5 @@ def get_new_command(command, settings): file = file[0] dir = file[0:file.rfind('/')] - return 'mkdir -p {} && {}'.format(dir, command.script) + formatme = shells.and_('mkdir -p {}', '{}') + return formatme.format(dir, command.script) diff --git a/thefuck/rules/pacman.py b/thefuck/rules/pacman.py index 71c6e698..2ec507e2 100644 --- a/thefuck/rules/pacman.py +++ b/thefuck/rules/pacman.py @@ -1,4 +1,5 @@ import subprocess +from thefuck import shells from thefuck.utils import DEVNULL @@ -30,7 +31,8 @@ def match(command, settings): def get_new_command(command, settings): package = __get_pkgfile(command)[0] - return '{} -S {} && {}'.format(pacman, package, command.script) + formatme = shells.and_('{} -S {}', '{}') + return formatme.format(pacman, package, command.script) if not __command_available('pkgfile'): diff --git a/thefuck/shells.py b/thefuck/shells.py index 50d9145e..87715d6b 100644 --- a/thefuck/shells.py +++ b/thefuck/shells.py @@ -47,6 +47,9 @@ class Generic(object): with open(history_file_name, 'a') as history: history.write(self._get_history_line(command_script)) + def and_(self, *commands): + return ' && '.join(commands) + class Bash(Generic): def app_alias(self): @@ -150,3 +153,7 @@ def app_alias(): def put_to_history(command): return _get_shell().put_to_history(command) + + +def and_(*commands): + return _get_shell().and_(*commands)