mirror of
https://github.com/nvbn/thefuck.git
synced 2025-01-19 04:21:14 +00:00
Merge pull request #196 from mcarton/no-such-file
Add a `no_such_file` rule
This commit is contained in:
commit
73939836d4
@ -161,6 +161,7 @@ using the matched rule and runs it. Rules enabled by default are as follows:
|
||||
* `lein_not_task` – fixes wrong `lein` tasks like `lein rpl`;
|
||||
* `mkdir_p` – adds `-p` when you trying to create directory without parent;
|
||||
* `no_command` – fixes wrong console commands, for example `vom/vim`;
|
||||
* `no_such_file` – creates missing directories with `mv` and `cp` commands;
|
||||
* `man_no_space` – fixes man commands without spaces, for example `mandiff`;
|
||||
* `pacman` – installs app with `pacman` or `yaourt` if it is not installed;
|
||||
* `pip_unknown_command` – fixes wrong pip commands, for example `pip instatl/pip install`;
|
||||
|
19
tests/rules/test_no_such_file.py
Normal file
19
tests/rules/test_no_such_file.py
Normal file
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
from thefuck.rules.no_such_file import match, get_new_command
|
||||
from tests.utils import Command
|
||||
|
||||
|
||||
@pytest.mark.parametrize('command', [
|
||||
Command(script='mv foo bar/foo', stderr="mv: cannot move 'foo' to 'bar/foo': No such file or directory"),
|
||||
Command(script='mv foo bar/', stderr="mv: cannot move 'foo' to 'bar/': No such file or directory"),
|
||||
])
|
||||
def test_match(command):
|
||||
assert match(command, None)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('command, new_command', [
|
||||
(Command(script='mv foo bar/foo', stderr="mv: cannot move 'foo' to 'bar/foo': No such file or directory"), 'mkdir -p bar && mv foo bar/foo'),
|
||||
(Command(script='mv foo bar/', stderr="mv: cannot move 'foo' to 'bar/': No such file or directory"), 'mkdir -p bar && mv foo bar/'),
|
||||
])
|
||||
def test_get_new_command(command, new_command):
|
||||
assert get_new_command(command, None) == new_command
|
28
thefuck/rules/no_such_file.py
Normal file
28
thefuck/rules/no_such_file.py
Normal file
@ -0,0 +1,28 @@
|
||||
import re
|
||||
|
||||
|
||||
patterns = (
|
||||
r"mv: cannot move '[^']*' to '([^']*)': No such file or directory",
|
||||
r"mv: cannot move '[^']*' to '([^']*)': Not a directory",
|
||||
r"cp: cannot create regular file '([^']*)': No such file or directory",
|
||||
r"cp: cannot create regular file '([^']*)': Not a directory",
|
||||
)
|
||||
|
||||
|
||||
def match(command, settings):
|
||||
for pattern in patterns:
|
||||
if re.search(pattern, command.stderr):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def get_new_command(command, settings):
|
||||
for pattern in patterns:
|
||||
file = re.findall(pattern, command.stderr)
|
||||
|
||||
if file:
|
||||
file = file[0]
|
||||
dir = file[0:file.rfind('/')]
|
||||
|
||||
return 'mkdir -p {} && {}'.format(dir, command.script)
|
Loading…
x
Reference in New Issue
Block a user