diff --git a/README.md b/README.md index 89dd7307..9c149bc1 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,7 @@ using the matched rule and runs it. Rules enabled by default are as follows: * `git_diff_no_index` – adds `--no-index` to previous `git diff` on untracked files; * `git_diff_staged` – adds `--staged` to previous `git diff` with unexpected output; * `git_fix_stash` – fixes `git stash` commands (misspelled subcommand and missing `save`); +* `git_flag_after_filename` – fixes `fatal: bad flag '...' after filename` * `git_help_aliased` – fixes `git help ` commands replacing with the aliased command; * `git_not_command` – fixes wrong git commands like `git brnch`; * `git_pull` – sets upstream before executing previous `git pull`; diff --git a/tests/rules/test_git_flag_after_filename.py b/tests/rules/test_git_flag_after_filename.py new file mode 100644 index 00000000..4cf49957 --- /dev/null +++ b/tests/rules/test_git_flag_after_filename.py @@ -0,0 +1,31 @@ +import pytest +from thefuck.rules.git_flag_after_filename import match, get_new_command +from tests.utils import Command + +command1 = Command('git log README.md -p', + stderr="fatal: bad flag '-p' used after filename") +command2 = Command('git log README.md -p CONTRIBUTING.md', + stderr="fatal: bad flag '-p' used after filename") +command3 = Command('git log -p README.md --name-only', + stderr="fatal: bad flag '--name-only' used after filename") + + +@pytest.mark.parametrize('command', [ + command1, command2, command3]) +def test_match(command): + assert match(command) + + +@pytest.mark.parametrize('command', [ + Command('git log README.md'), + Command('git log -p README.md')]) +def test_not_match(command): + assert not match(command) + + +@pytest.mark.parametrize('command, result', [ + (command1, "git log -p README.md"), + (command2, "git log -p README.md CONTRIBUTING.md"), + (command3, "git log -p --name-only README.md")]) +def test_get_new_command(command, result): + assert get_new_command(command) == result diff --git a/thefuck/rules/git_flag_after_filename.py b/thefuck/rules/git_flag_after_filename.py new file mode 100644 index 00000000..bec0591e --- /dev/null +++ b/thefuck/rules/git_flag_after_filename.py @@ -0,0 +1,30 @@ +import re +from thefuck.specific.git import git_support + +error_pattern = "fatal: bad flag '(.*?)' used after filename" + + +@git_support +def match(command): + return re.search(error_pattern, command.stderr) + + +@git_support +def get_new_command(command): + command_parts = command.script_parts[:] + + # find the bad flag + bad_flag = re.search(error_pattern, command.stderr).group(1) + bad_flag_index = command_parts.index(bad_flag) + + # find the filename + for index in reversed(range(bad_flag_index)): + if command_parts[index][0] != '-': + filename_index = index + break + + # swap them + command_parts[bad_flag_index], command_parts[filename_index] = \ + command_parts[filename_index], command_parts[bad_flag_index] # noqa: E122 + + return u' '.join(command_parts)