mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-30 22:54:14 +00:00 
			
		
		
		
	Merge pull request #196 from mcarton/no-such-file
Add a `no_such_file` rule
This commit is contained in:
		| @@ -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`; | * `lein_not_task` – fixes wrong `lein` tasks like `lein rpl`; | ||||||
| * `mkdir_p` – adds `-p` when you trying to create directory without parent; | * `mkdir_p` – adds `-p` when you trying to create directory without parent; | ||||||
| * `no_command` – fixes wrong console commands, for example `vom/vim`; | * `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`; | * `man_no_space` – fixes man commands without spaces, for example `mandiff`; | ||||||
| * `pacman` – installs app with `pacman` or `yaourt` if it is not installed; | * `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`; | * `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) | ||||||
		Reference in New Issue
	
	Block a user