From cc6d90963e38ec1882bd1fd8529a2396d0b11387 Mon Sep 17 00:00:00 2001 From: Pablo Aguiar Date: Sun, 29 Jul 2018 17:18:42 +0100 Subject: [PATCH] #367: Support BSD style output in touch rule (#830) On a Mac, also on NetBSD or OpenBSD, `touch` errs differently: ``` $ uname; touch a/b/c Darwin touch: a/b/c: No such file or directory ``` That gets matched by the rule but not fixed by it. Thus the regex pattern is now a bit more tolerant. --- tests/rules/test_touch.py | 24 ++++++++++++++++-------- thefuck/rules/touch.py | 3 ++- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tests/rules/test_touch.py b/tests/rules/test_touch.py index fbee06ad..8201fe02 100644 --- a/tests/rules/test_touch.py +++ b/tests/rules/test_touch.py @@ -4,24 +4,32 @@ from thefuck.types import Command @pytest.fixture -def output(): - return "touch: cannot touch '/a/b/c':" \ - " No such file or directory" +def output(is_bsd): + print(is_bsd) + if is_bsd: + return "touch: /a/b/c: No such file or directory" + return "touch: cannot touch '/a/b/c': No such file or directory" -def test_match(output): - command = Command('touch /a/b/c', output) +@pytest.mark.parametrize('script, is_bsd', [ + ('touch /a/b/c', False), + ('touch /a/b/c', True)]) +def test_match(script, is_bsd, output): + command = Command(script, output) assert match(command) @pytest.mark.parametrize('command', [ Command('touch /a/b/c', ''), - Command('ls /a/b/c', output())]) + Command('ls /a/b/c', output(False))]) def test_not_match(command): assert not match(command) -def test_get_new_command(output): - command = Command('touch /a/b/c', output) +@pytest.mark.parametrize('script, is_bsd', [ + ('touch /a/b/c', False), + ('touch /a/b/c', True)]) +def test_get_new_command(script, is_bsd, output): + command = Command(script, output) fixed_command = get_new_command(command) assert fixed_command == 'mkdir -p /a/b && touch /a/b/c' diff --git a/thefuck/rules/touch.py b/thefuck/rules/touch.py index 2552d854..31e9fcef 100644 --- a/thefuck/rules/touch.py +++ b/thefuck/rules/touch.py @@ -9,5 +9,6 @@ def match(command): def get_new_command(command): - path = re.findall(r"touch: cannot touch '(.+)/.+':", command.output)[0] + path = path = re.findall( + r"touch: (?:cannot touch ')?(.+)/.+'?:", command.output)[0] return shell.and_(u'mkdir -p {}'.format(path), command.script)