mirror of
https://github.com/nvbn/thefuck.git
synced 2025-02-21 20:38:54 +00:00
#87 Add ability to fix branch names in git_checkout
rule
This commit is contained in:
parent
ee87d1c547
commit
4f5659caad
@ -163,7 +163,7 @@ using the matched rule and runs it. Rules enabled by default are as follows:
|
||||
* `git_add` – fix *"Did you forget to 'git add'?"*;
|
||||
* `git_branch_delete` – changes `git branch -d` to `git branch -D`;
|
||||
* `git_branch_list` – catches `git branch list` in place of `git branch` and removes created branch;
|
||||
* `git_checkout` – creates the branch before checking-out;
|
||||
* `git_checkout` – fixes branch name or creates new branch;
|
||||
* `git_diff_staged` – adds `--staged` to previous `git diff` with unexpected output;
|
||||
* `git_no_command` – fixes wrong git commands like `git brnch`;
|
||||
* `git_pull` – sets upstream before executing previous `git pull`;
|
||||
|
@ -12,6 +12,11 @@ def did_not_match(target, did_you_forget=False):
|
||||
return error
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def get_branches(mocker):
|
||||
return mocker.patch('thefuck.rules.git_checkout')
|
||||
|
||||
|
||||
@pytest.mark.parametrize('command', [
|
||||
Command(script='git checkout unknown', stderr=did_not_match('unknown')),
|
||||
Command(script='git commit unknown', stderr=did_not_match('unknown'))])
|
||||
@ -28,10 +33,19 @@ def test_not_match(command):
|
||||
assert not match(command, None)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('command, new_command', [
|
||||
(Command(script='git checkout unknown', stderr=did_not_match('unknown')),
|
||||
@pytest.mark.parametrize('branches, command, new_command', [
|
||||
([],
|
||||
Command(script='git checkout unknown', stderr=did_not_match('unknown')),
|
||||
'git branch unknown && git checkout unknown'),
|
||||
(Command('git commit unknown', stderr=did_not_match('unknown')),
|
||||
'git branch unknown && git commit unknown')])
|
||||
def test_get_new_command(command, new_command):
|
||||
([],
|
||||
Command('git commit unknown', stderr=did_not_match('unknown')),
|
||||
'git branch unknown && git commit unknown'),
|
||||
(['master'],
|
||||
Command(script='git checkout amster', stderr=did_not_match('amster')),
|
||||
'git checkout master'),
|
||||
(['master'],
|
||||
Command(script='git commit amster', stderr=did_not_match('amster')),
|
||||
'git commit master')])
|
||||
def test_get_new_command(branches, command, new_command, get_branches):
|
||||
get_branches.return_value = branches
|
||||
assert get_new_command(command, None) == new_command
|
||||
|
@ -59,3 +59,7 @@ class TestGetClosest(object):
|
||||
|
||||
def test_when_cant_match(self):
|
||||
assert 'status' == get_closest('st', ['status', 'reset'])
|
||||
|
||||
def test_without_fallback(self):
|
||||
assert get_closest('st', ['status', 'reset'],
|
||||
fallback_to_first=False) is None
|
||||
|
@ -1,4 +1,5 @@
|
||||
import re
|
||||
import subprocess
|
||||
from thefuck import shells, utils
|
||||
|
||||
|
||||
@ -9,11 +10,28 @@ def match(command, settings):
|
||||
and "Did you forget to 'git add'?" not in command.stderr)
|
||||
|
||||
|
||||
def get_branches():
|
||||
proc = subprocess.Popen(
|
||||
['git', 'branch', '-a', '--no-color', '--no-column'],
|
||||
stdout=subprocess.PIPE)
|
||||
for line in proc.stdout.readlines():
|
||||
line = line.decode('utf-8')
|
||||
if line.startswith('*'):
|
||||
line = line.split(' ')[1]
|
||||
if '/' in line:
|
||||
line = line.split('/')[-1]
|
||||
yield line.strip()
|
||||
|
||||
|
||||
@utils.git_support
|
||||
def get_new_command(command, settings):
|
||||
missing_file = re.findall(
|
||||
r"error: pathspec '([^']*)' "
|
||||
"did not match any file\(s\) known to git.", command.stderr)[0]
|
||||
|
||||
formatme = shells.and_('git branch {}', '{}')
|
||||
return formatme.format(missing_file, command.script)
|
||||
r"error: pathspec '([^']*)' "
|
||||
"did not match any file\(s\) known to git.", command.stderr)[0]
|
||||
closest_branch = utils.get_closest(missing_file, get_branches(),
|
||||
fallback_to_first=False)
|
||||
if closest_branch:
|
||||
return command.script.replace(missing_file, closest_branch, 1)
|
||||
else:
|
||||
return shells.and_('git branch {}', '{}').format(
|
||||
missing_file, command.script)
|
||||
|
@ -113,10 +113,11 @@ def memoize(fn):
|
||||
memoize.disabled = False
|
||||
|
||||
|
||||
def get_closest(word, possibilities, n=3, cutoff=0.6):
|
||||
def get_closest(word, possibilities, n=3, cutoff=0.6, fallback_to_first=True):
|
||||
"""Returns closest match or just first from possibilities."""
|
||||
possibilities = list(possibilities)
|
||||
try:
|
||||
return get_close_matches(word, possibilities, n, cutoff)[0]
|
||||
except IndexError:
|
||||
return possibilities[0]
|
||||
if fallback_to_first:
|
||||
return possibilities[0]
|
||||
|
Loading…
x
Reference in New Issue
Block a user