diff --git a/README.md b/README.md index da503abe..d644b0cb 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ using matched rule and run it. Rules enabled by default: * `brew_unknown_command` – fixes wrong brew commands, for example `brew docto/brew doctor`; * `cd_parent` – changes `cd..` to `cd ..`; +* `cd_mkdir` – creates directories before cd'ing into them; * `cp_omitting_directory` – adds `-a` when you `cp` directory; * `fix_alt_space` – replaces Alt+Space with Space character; * `git_no_command` – fixes wrong git commands like `git brnch`; diff --git a/tests/rules/test_cd_mkdir.py b/tests/rules/test_cd_mkdir.py new file mode 100644 index 00000000..b3db2926 --- /dev/null +++ b/tests/rules/test_cd_mkdir.py @@ -0,0 +1,19 @@ +from mock import Mock +from thefuck.rules.cd_mkdir import match, get_new_command + + +def test_match(): + assert match(Mock(script='cd foo', stderr='cd: foo: No such file or directory'), + None) + assert match(Mock(script='cd foo/bar/baz', stderr='cd: foo: No such file or directory'), + None) + assert match(Mock(script='cd foo/bar/baz', stderr='cd: can\'t cd to foo/bar/baz'), + None) + assert not match(Mock(script='cd foo', + stderr=''), None) + assert not match(Mock(script='', stderr=''), None) + + +def test_get_new_command(): + assert get_new_command(Mock(script='cd foo'), None) == 'mkdir -p foo && cd foo' + assert get_new_command(Mock(script='cd foo/bar/baz'), None) == 'mkdir -p foo/bar/baz && cd foo/bar/baz' diff --git a/thefuck/rules/cd_mkdir.py b/thefuck/rules/cd_mkdir.py new file mode 100644 index 00000000..7aa1d9da --- /dev/null +++ b/thefuck/rules/cd_mkdir.py @@ -0,0 +1,14 @@ +import re +from thefuck.utils import sudo_support + + +@sudo_support +def match(command, settings): + return (command.script.startswith('cd ') + and ('no such file or directory' in command.stderr.lower() + or 'cd: can\'t cd to' in command.stderr.lower())) + + +@sudo_support +def get_new_command(command, settings): + return re.sub(r'^cd (.*)', 'mkdir -p \\1 && cd \\1', command.script)