From 57fb6e079a6430804cf03347dcb679be5266a133 Mon Sep 17 00:00:00 2001 From: David Hart Date: Tue, 2 Jan 2018 00:45:46 +0000 Subject: [PATCH] git_push: Make option handling more robust (#751) See https://github.com/nvbn/thefuck/issues/740#issuecomment-354466567 --- tests/rules/test_git_push.py | 6 ++++++ thefuck/rules/git_push.py | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/rules/test_git_push.py b/tests/rules/test_git_push.py index c654b2aa..785b08ee 100644 --- a/tests/rules/test_git_push.py +++ b/tests/rules/test_git_push.py @@ -29,7 +29,13 @@ def test_get_new_command(output): == "git push --set-upstream origin master" assert get_new_command(Command('git push -u origin', output))\ == "git push --set-upstream origin master" + assert get_new_command(Command('git push origin', output))\ + == "git push --set-upstream origin master" assert get_new_command(Command('git push --set-upstream origin', output))\ == "git push --set-upstream origin master" assert get_new_command(Command('git push --quiet', output))\ == "git push --set-upstream origin master --quiet" + assert get_new_command(Command('git push --quiet origin', output))\ + == "git push --set-upstream origin master --quiet" + assert get_new_command(Command('git -c test=test push --quiet origin', output))\ + == "git -c test=test push --set-upstream origin master --quiet" diff --git a/thefuck/rules/git_push.py b/thefuck/rules/git_push.py index c5f49a5c..e11938ba 100644 --- a/thefuck/rules/git_push.py +++ b/thefuck/rules/git_push.py @@ -32,10 +32,12 @@ def get_new_command(command): # In case of `git push -u` we don't have next argument: if len(command_parts) > upstream_option_index: command_parts.pop(upstream_option_index) - # If the only argument is the remote/branch, remove it. - # git's suggestion includes it, so it won't be lost, and we would duplicate it otherwise. - elif len(command_parts) is 3 and command_parts[2][0] != '-': - command_parts.pop(2) + else: + # the only non-qualified permitted options are the repository and refspec; git's + # suggestion include them, so they won't be lost, but would be duplicated otherwise. + push_idx = command_parts.index('push') + 1 + while len(command_parts) > push_idx and command_parts[len(command_parts) - 1][0] != '-': + command_parts.pop(len(command_parts) - 1) arguments = re.findall(r'git push (.*)', command.output)[0].strip() return replace_argument(" ".join(command_parts), 'push',