mirror of
https://github.com/nvbn/thefuck.git
synced 2025-11-01 15:42:06 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c534c52bc | ||
|
|
b4392ba706 | ||
|
|
46f918718f | ||
|
|
d71ce76ae4 | ||
|
|
355505a0a8 | ||
|
|
3d425ce831 | ||
|
|
98a9fb3d7d | ||
|
|
903abff77e |
@@ -148,7 +148,7 @@ using the matched rule and runs it. Rules enabled by default are as follows:
|
||||
* `git_branch_list` – catches `git branch list` in place of `git branch` and removes created branch;
|
||||
* `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_not_command` – fixes wrong git commands like `git brnch`;
|
||||
* `git_pull` – sets upstream before executing previous `git pull`;
|
||||
* `git_pull_clone` – clones instead of pulling when the repo does not exist;
|
||||
* `git_push` – adds `--set-upstream origin $branch` to previous failed `git push`;
|
||||
@@ -157,6 +157,7 @@ using the matched rule and runs it. Rules enabled by default are as follows:
|
||||
* `go_run` – appends `.go` extension when compiling/running Go programs
|
||||
* `grep_recursive` – adds `-r` when you trying to grep directory;
|
||||
* `has_exists_script` – prepends `./` when script/binary exists;
|
||||
* `heroku_no_command` – fixes wrong heroku commands like `heroku log`;
|
||||
* `history` – tries to replace command with most similar command from history;
|
||||
* `java` – removes `.java` extension when running Java programs;
|
||||
* `javac` – appends missing `.java` when compiling Java files;
|
||||
|
||||
2
setup.py
2
setup.py
@@ -11,7 +11,7 @@ elif (3, 0) < sys.version_info < (3, 3):
|
||||
' ({}.{} detected).'.format(*sys.version_info[:2]))
|
||||
sys.exit(-1)
|
||||
|
||||
VERSION = '2.2'
|
||||
VERSION = '2.3'
|
||||
|
||||
install_requires = ['psutil', 'colorama', 'six']
|
||||
extras_require = {':python_version<"3.4"': ['pathlib']}
|
||||
|
||||
@@ -41,10 +41,10 @@ def test_not_match(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')),
|
||||
Command(script='git checkout mster', stderr=did_not_match('mster')),
|
||||
'git checkout master'),
|
||||
(['master'],
|
||||
Command(script='git commit amster', stderr=did_not_match('amster')),
|
||||
Command(script='git commit mster', stderr=did_not_match('mster')),
|
||||
'git commit master')])
|
||||
def test_get_new_command(branches, command, new_command, get_branches):
|
||||
get_branches.return_value = branches
|
||||
|
||||
@@ -20,5 +20,5 @@ def test_match(stderr):
|
||||
|
||||
|
||||
def test_get_new_command(stderr):
|
||||
assert get_new_command(Command(stderr=stderr), None)\
|
||||
assert get_new_command(Command('git push', stderr=stderr), None)\
|
||||
== "git push --set-upstream origin master"
|
||||
|
||||
34
tests/rules/test_heroku_not_command.py
Normal file
34
tests/rules/test_heroku_not_command.py
Normal file
@@ -0,0 +1,34 @@
|
||||
import pytest
|
||||
from tests.utils import Command
|
||||
from thefuck.rules.heroku_not_command import match, get_new_command
|
||||
|
||||
|
||||
def suggest_stderr(cmd):
|
||||
return ''' ! `{}` is not a heroku command.
|
||||
! Perhaps you meant `logs`, `pg`.
|
||||
! See `heroku help` for a list of available commands.'''.format(cmd)
|
||||
|
||||
|
||||
no_suggest_stderr = ''' ! `aaaaa` is not a heroku command.
|
||||
! See `heroku help` for a list of available commands.'''
|
||||
|
||||
|
||||
@pytest.mark.parametrize('cmd', ['log', 'pge'])
|
||||
def test_match(cmd):
|
||||
assert match(
|
||||
Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd)), None)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('script, stderr', [
|
||||
('cat log', suggest_stderr('log')),
|
||||
('heroku aaa', no_suggest_stderr)])
|
||||
def test_not_match(script, stderr):
|
||||
assert not match(Command(script, stderr=stderr), None)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('cmd, result', [
|
||||
('log', 'heroku logs'),
|
||||
('pge', 'heroku pg')])
|
||||
def test_get_new_command(cmd, result):
|
||||
command = Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd))
|
||||
assert get_new_command(command, None) == result
|
||||
@@ -36,6 +36,20 @@ def test_git_support(called, command, stderr):
|
||||
assert fn(Command(script=called, stderr=stderr), None) == command
|
||||
|
||||
|
||||
@pytest.mark.parametrize('command, is_git', [
|
||||
('git pull', True),
|
||||
('hub pull', True),
|
||||
('git push --set-upstream origin foo', True),
|
||||
('hub push --set-upstream origin foo', True),
|
||||
('ls', False),
|
||||
('cat git', False),
|
||||
('cat hub', False)])
|
||||
def test_git_support_match(command, is_git):
|
||||
@git_support
|
||||
def fn(command, settings): return True
|
||||
assert fn(Command(script=command), None) == is_git
|
||||
|
||||
|
||||
def test_memoize():
|
||||
fn = Mock(__name__='fn')
|
||||
memoized = memoize(fn)
|
||||
|
||||
@@ -31,7 +31,7 @@ DEFAULT_SETTINGS = {'rules': DEFAULT_RULES,
|
||||
'no_colors': False,
|
||||
'debug': False,
|
||||
'priority': {},
|
||||
'env': {'LANG': 'C', 'GIT_TRACE': '1'}}
|
||||
'env': {'LC_ALL': 'C', 'LANG': 'C', 'GIT_TRACE': '1'}}
|
||||
|
||||
ENV_TO_ATTR = {'THEFUCK_RULES': 'rules',
|
||||
'THEFUCK_WAIT_COMMAND': 'wait_command',
|
||||
|
||||
@@ -4,8 +4,7 @@ from thefuck import utils, shells
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and 'did not match any file(s) known to git.' in command.stderr
|
||||
return ('did not match any file(s) known to git.' in command.stderr
|
||||
and "Did you forget to 'git add'?" in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ from thefuck import utils
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git branch -d' in command.script
|
||||
return ('branch -d' in command.script
|
||||
and 'If you are sure you want to delete it' in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ from thefuck import utils, shells
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
# catches "git branch list" in place of "git branch"
|
||||
return command.script.split() == 'git branch list'.split()
|
||||
return command.script.split()[1:] == 'branch list'.split()
|
||||
|
||||
|
||||
@utils.git_support
|
||||
|
||||
@@ -5,8 +5,7 @@ from thefuck import shells, utils
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and 'did not match any file(s) known to git.' in command.stderr
|
||||
return ('did not match any file(s) known to git.' in command.stderr
|
||||
and "Did you forget to 'git add'?" not in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@ from thefuck import utils
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script and
|
||||
'diff' in command.script and
|
||||
return ('diff' in command.script and
|
||||
'--staged' not in command.script)
|
||||
|
||||
|
||||
|
||||
@@ -4,8 +4,7 @@ from thefuck.utils import get_closest, git_support
|
||||
|
||||
@git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and " is not a git command. See 'git --help'." in command.stderr
|
||||
return (" is not a git command. See 'git --help'." in command.stderr
|
||||
and 'Did you mean' in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@ from thefuck import shells, utils
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and 'pull' in command.script
|
||||
return ('pull' in command.script
|
||||
and 'set-upstream' in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import re
|
||||
from thefuck import utils, shells
|
||||
from thefuck import utils
|
||||
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git pull' in command.script
|
||||
and 'fatal: Not a git repository' in command.stderr
|
||||
return ('fatal: Not a git repository' in command.stderr
|
||||
and "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@ from thefuck import utils
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and 'push' in command.script
|
||||
return ('push' in command.script
|
||||
and 'set-upstream' in command.stderr)
|
||||
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@ from thefuck import utils
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and 'push' in command.script
|
||||
return ('push' in command.script
|
||||
and '! [rejected]' in command.stderr
|
||||
and 'failed to push some refs to' in command.stderr
|
||||
and 'Updates were rejected because the tip of your current branch is behind' in command.stderr)
|
||||
|
||||
@@ -4,8 +4,7 @@ from thefuck.shells import and_
|
||||
|
||||
@utils.git_support
|
||||
def match(command, settings):
|
||||
return ('git' in command.script
|
||||
and 'push' in command.script
|
||||
return ('push' in command.script
|
||||
and '! [rejected]' in command.stderr
|
||||
and 'failed to push some refs to' in command.stderr
|
||||
and 'Updates were rejected because the tip of your current branch is behind' in command.stderr)
|
||||
|
||||
@@ -5,7 +5,7 @@ from thefuck import shells, utils
|
||||
def match(command, settings):
|
||||
# catches "Please commit or stash them" and "Please, commit your changes or
|
||||
# stash them before you can switch branches."
|
||||
return 'git' in command.script and 'or stash them' in command.stderr
|
||||
return 'or stash them' in command.stderr
|
||||
|
||||
|
||||
@utils.git_support
|
||||
|
||||
20
thefuck/rules/heroku_not_command.py
Normal file
20
thefuck/rules/heroku_not_command.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import re
|
||||
from thefuck.utils import get_closest
|
||||
|
||||
|
||||
def match(command, settings):
|
||||
return command.script.startswith('heroku') and \
|
||||
'is not a heroku command' in command.stderr and \
|
||||
'Perhaps you meant' in command.stderr
|
||||
|
||||
|
||||
def _get_suggests(stderr):
|
||||
for line in stderr.split('\n'):
|
||||
if 'Perhaps you meant' in line:
|
||||
return re.findall(r'`([^`]+)`', line)
|
||||
|
||||
|
||||
def get_new_command(command, settings):
|
||||
wrong = re.findall(r'`(\w+)` is not a heroku command', command.stderr)[0]
|
||||
correct = get_closest(wrong, _get_suggests(command.stderr))
|
||||
return command.script.replace(' {}'.format(wrong), ' {}'.format(correct), 1)
|
||||
@@ -75,12 +75,19 @@ def sudo_support(fn):
|
||||
|
||||
|
||||
def git_support(fn):
|
||||
"""Resolve git aliases."""
|
||||
"""Resolves git aliases and supports testing for both git and hub."""
|
||||
@wraps(fn)
|
||||
def wrapper(command, settings):
|
||||
if (command.script.startswith('git') and
|
||||
'trace: alias expansion:' in command.stderr):
|
||||
# supports GitHub's `hub` command
|
||||
# which is recommended to be used with `alias git=hub`
|
||||
# but at this point, shell aliases have already been resolved
|
||||
is_git_cmd = command.script.startswith(('git', 'hub'))
|
||||
|
||||
if not is_git_cmd:
|
||||
return False
|
||||
|
||||
# perform git aliases expansion
|
||||
if 'trace: alias expansion:' in command.stderr:
|
||||
search = re.search("trace: alias expansion: ([^ ]*) => ([^\n]*)",
|
||||
command.stderr)
|
||||
alias = search.group(1)
|
||||
@@ -93,6 +100,7 @@ def git_support(fn):
|
||||
new_script = command.script.replace(alias, expansion)
|
||||
|
||||
command = Command._replace(command, script=new_script)
|
||||
|
||||
return fn(command, settings)
|
||||
|
||||
return wrapper
|
||||
|
||||
Reference in New Issue
Block a user