From 55922e4dbeedaca384e83406f2fa87c5a8e152fb Mon Sep 17 00:00:00 2001 From: Sergei Haller Date: Tue, 8 Sep 2020 11:47:05 +0200 Subject: [PATCH 1/2] #1131: Add rule for Git commit with no added files --- README.md | 1 + tests/rules/test_git_commit_add.py | 36 ++++++++++++++++++++++++++++++ thefuck/rules/git_commit_add.py | 15 +++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 tests/rules/test_git_commit_add.py create mode 100644 thefuck/rules/git_commit_add.py diff --git a/README.md b/README.md index 9c9d893d6..df94d4953 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,7 @@ following rules are enabled by default: * `git_branch_0flag` – fixes commands such as `git branch 0v` and `git branch 0r` removing the created branch; * `git_checkout` – fixes branch name or creates new branch; * `git_clone_git_clone` – replaces `git clone git clone ...` with `git clone ...` +* `git_commit_add` – offers `git commit -a ...` after previous commit if it failed because nothing was staged; * `git_commit_amend` – offers `git commit --amend` after previous commit; * `git_commit_reset` – offers `git reset HEAD~` after previous commit; * `git_diff_no_index` – adds `--no-index` to previous `git diff` on untracked files; diff --git a/tests/rules/test_git_commit_add.py b/tests/rules/test_git_commit_add.py new file mode 100644 index 000000000..b8b07bf48 --- /dev/null +++ b/tests/rules/test_git_commit_add.py @@ -0,0 +1,36 @@ +import pytest +from thefuck.rules.git_commit_add import match, get_new_command +from thefuck.types import Command + + +@pytest.mark.parametrize('script, output', [ + ('git commit -m "test"', 'no changes added to commit'), + ('git commit', 'no changes added to commit')]) +def test_match(output, script): + assert match(Command(script, output)) + + +@pytest.mark.parametrize('script, output', [ + ('git commit -m "test"', ' 1 file changed, 15 insertions(+), 14 deletions(-)')]) +def test_not_match(output, script): + assert not match(Command(script, output)) + + +@pytest.mark.parametrize('script', [ + 'git branch foo', + 'git checkout feature/test_commit', + 'git push']) +def test_not_match_either(script): + assert not match(Command(script, '')) + + +@pytest.mark.parametrize('script', [ + ('git commit')]) +def test_get_new_command_one(script): + assert get_new_command(Command(script, '')) == 'git commit -a' + + +@pytest.mark.parametrize('script', [ + ('git commit -m "test commit"')]) +def test_get_new_command_two(script): + assert get_new_command(Command(script, '')) == 'git commit -a -m "test commit"' diff --git a/thefuck/rules/git_commit_add.py b/thefuck/rules/git_commit_add.py new file mode 100644 index 000000000..7d0516f6d --- /dev/null +++ b/thefuck/rules/git_commit_add.py @@ -0,0 +1,15 @@ +from thefuck.utils import replace_argument +from thefuck.specific.git import git_support + +priority = 900 # Lower first, default is 1000 + + +@git_support +def match(command): + return ('commit' in command.script_parts + and 'no changes added to commit' in command.output) + + +@git_support +def get_new_command(command): + return replace_argument(command.script, 'commit', 'commit -a') From 11b70526f72339bcce0beefa1665c74bb06e18b3 Mon Sep 17 00:00:00 2001 From: Pablo Santiago Blum de Aguiar Date: Thu, 8 Jul 2021 21:43:35 +0200 Subject: [PATCH 2/2] #1131: Improve git_commit_add rule Add more capabilities to the rule, remove its priority and fix tests --- README.md | 2 +- tests/rules/test_git_commit_add.py | 48 ++++++++++++++++-------------- thefuck/rules/git_commit_add.py | 14 +++++---- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index df94d4953..95f020607 100644 --- a/README.md +++ b/README.md @@ -234,7 +234,7 @@ following rules are enabled by default: * `git_branch_0flag` – fixes commands such as `git branch 0v` and `git branch 0r` removing the created branch; * `git_checkout` – fixes branch name or creates new branch; * `git_clone_git_clone` – replaces `git clone git clone ...` with `git clone ...` -* `git_commit_add` – offers `git commit -a ...` after previous commit if it failed because nothing was staged; +* `git_commit_add` – offers `git commit -a ...` or `git commit -p ...` after previous commit if it failed because nothing was staged; * `git_commit_amend` – offers `git commit --amend` after previous commit; * `git_commit_reset` – offers `git reset HEAD~` after previous commit; * `git_diff_no_index` – adds `--no-index` to previous `git diff` on untracked files; diff --git a/tests/rules/test_git_commit_add.py b/tests/rules/test_git_commit_add.py index b8b07bf48..1a244f33e 100644 --- a/tests/rules/test_git_commit_add.py +++ b/tests/rules/test_git_commit_add.py @@ -3,34 +3,36 @@ from thefuck.types import Command -@pytest.mark.parametrize('script, output', [ - ('git commit -m "test"', 'no changes added to commit'), - ('git commit', 'no changes added to commit')]) +@pytest.mark.parametrize( + "script, output", + [ + ('git commit -m "test"', "no changes added to commit"), + ("git commit", "no changes added to commit"), + ], +) def test_match(output, script): assert match(Command(script, output)) -@pytest.mark.parametrize('script, output', [ - ('git commit -m "test"', ' 1 file changed, 15 insertions(+), 14 deletions(-)')]) +@pytest.mark.parametrize( + "script, output", + [ + ('git commit -m "test"', " 1 file changed, 15 insertions(+), 14 deletions(-)"), + ("git branch foo", ""), + ("git checkout feature/test_commit", ""), + ("git push", ""), + ], +) def test_not_match(output, script): assert not match(Command(script, output)) -@pytest.mark.parametrize('script', [ - 'git branch foo', - 'git checkout feature/test_commit', - 'git push']) -def test_not_match_either(script): - assert not match(Command(script, '')) - - -@pytest.mark.parametrize('script', [ - ('git commit')]) -def test_get_new_command_one(script): - assert get_new_command(Command(script, '')) == 'git commit -a' - - -@pytest.mark.parametrize('script', [ - ('git commit -m "test commit"')]) -def test_get_new_command_two(script): - assert get_new_command(Command(script, '')) == 'git commit -a -m "test commit"' +@pytest.mark.parametrize( + "script, new_command", + [ + ("git commit", ["git commit -a", "git commit -p"]), + ('git commit -m "foo"', ['git commit -a -m "foo"', 'git commit -p -m "foo"']), + ], +) +def test_get_new_command(script, new_command): + assert get_new_command(Command(script, "")) == new_command diff --git a/thefuck/rules/git_commit_add.py b/thefuck/rules/git_commit_add.py index 7d0516f6d..4db1634a4 100644 --- a/thefuck/rules/git_commit_add.py +++ b/thefuck/rules/git_commit_add.py @@ -1,15 +1,17 @@ -from thefuck.utils import replace_argument +from thefuck.utils import eager, replace_argument from thefuck.specific.git import git_support -priority = 900 # Lower first, default is 1000 - @git_support def match(command): - return ('commit' in command.script_parts - and 'no changes added to commit' in command.output) + return ( + "commit" in command.script_parts + and "no changes added to commit" in command.output + ) +@eager @git_support def get_new_command(command): - return replace_argument(command.script, 'commit', 'commit -a') + for opt in ("-a", "-p"): + yield replace_argument(command.script, "commit", "commit {}".format(opt))