mirror of
https://github.com/nvbn/thefuck.git
synced 2025-03-20 09:39:01 +00:00
extract constants to const file, separate logs.confirm_text function, remove confirmation log function, add env variable for double confirms
Moved the constants declared in the fix_command file to the dedicated constants file. seperated the command_text file into two different functions so that there isn't another check for if its in the double confirm dict moved double confirm logic from fix_command into select_command in the ui. I think this would make more sense because the underlying program shouldn't really care about confirmations. making double confirm off by default with a environment variable required to turn it on. This might be helpful if we try to make a pr for this in the main repo. update readme to reflect this
This commit is contained in:
parent
abd8800a92
commit
277546b771
@ -456,6 +456,7 @@ Or via environment variables:
|
|||||||
* `THEFUCK_RULES` – list of enabled rules, like `DEFAULT_RULES:rm_root` or `sudo:no_command`;
|
* `THEFUCK_RULES` – list of enabled rules, like `DEFAULT_RULES:rm_root` or `sudo:no_command`;
|
||||||
* `THEFUCK_EXCLUDE_RULES` – list of disabled rules, like `git_pull:git_push`;
|
* `THEFUCK_EXCLUDE_RULES` – list of disabled rules, like `git_pull:git_push`;
|
||||||
* `THEFUCK_REQUIRE_CONFIRMATION` – require confirmation before running new command, `true/false`;
|
* `THEFUCK_REQUIRE_CONFIRMATION` – require confirmation before running new command, `true/false`;
|
||||||
|
* `THEFUCK_REQUIRE_DOUBLE_CONFIRMATION` – require double confirmation before running potentially volitile commands (eg. `reboot`), value of `true/false`;
|
||||||
* `THEFUCK_WAIT_COMMAND` – max amount of time in seconds for getting previous command output;
|
* `THEFUCK_WAIT_COMMAND` – max amount of time in seconds for getting previous command output;
|
||||||
* `THEFUCK_NO_COLORS` – disable colored output, `true/false`;
|
* `THEFUCK_NO_COLORS` – disable colored output, `true/false`;
|
||||||
* `THEFUCK_PRIORITY` – priority of the rules, like `no_command=9999:apt_get=100`,
|
* `THEFUCK_PRIORITY` – priority of the rules, like `no_command=9999:apt_get=100`,
|
||||||
|
@ -28,10 +28,13 @@ ALL_ENABLED = _GenConst('All rules enabled')
|
|||||||
DEFAULT_RULES = [ALL_ENABLED]
|
DEFAULT_RULES = [ALL_ENABLED]
|
||||||
DEFAULT_PRIORITY = 1000
|
DEFAULT_PRIORITY = 1000
|
||||||
|
|
||||||
|
DOUBLE_CONFIRMATION_SCRIPTS = {"reboot": "Are you sure you would like to reboot the system?"}
|
||||||
|
|
||||||
DEFAULT_SETTINGS = {'rules': DEFAULT_RULES,
|
DEFAULT_SETTINGS = {'rules': DEFAULT_RULES,
|
||||||
'exclude_rules': [],
|
'exclude_rules': [],
|
||||||
'wait_command': 3,
|
'wait_command': 3,
|
||||||
'require_confirmation': True,
|
'require_confirmation': True,
|
||||||
|
'require_double_confirmation': False,
|
||||||
'no_colors': False,
|
'no_colors': False,
|
||||||
'debug': False,
|
'debug': False,
|
||||||
'priority': {},
|
'priority': {},
|
||||||
@ -49,6 +52,7 @@ ENV_TO_ATTR = {'THEFUCK_RULES': 'rules',
|
|||||||
'THEFUCK_EXCLUDE_RULES': 'exclude_rules',
|
'THEFUCK_EXCLUDE_RULES': 'exclude_rules',
|
||||||
'THEFUCK_WAIT_COMMAND': 'wait_command',
|
'THEFUCK_WAIT_COMMAND': 'wait_command',
|
||||||
'THEFUCK_REQUIRE_CONFIRMATION': 'require_confirmation',
|
'THEFUCK_REQUIRE_CONFIRMATION': 'require_confirmation',
|
||||||
|
'THEFUCK_REQUIRE_DOUBLE_CONFIRMATION': 'require_double_confirmation',
|
||||||
'THEFUCK_NO_COLORS': 'no_colors',
|
'THEFUCK_NO_COLORS': 'no_colors',
|
||||||
'THEFUCK_DEBUG': 'debug',
|
'THEFUCK_DEBUG': 'debug',
|
||||||
'THEFUCK_PRIORITY': 'priority',
|
'THEFUCK_PRIORITY': 'priority',
|
||||||
|
@ -29,7 +29,6 @@ def _get_raw_command(known_args):
|
|||||||
def fix_command(known_args):
|
def fix_command(known_args):
|
||||||
"""Fixes previous command. Used when `thefuck` called without arguments."""
|
"""Fixes previous command. Used when `thefuck` called without arguments."""
|
||||||
settings.init(known_args)
|
settings.init(known_args)
|
||||||
double_check_commands = {"reboot": "reboot system?"}
|
|
||||||
with logs.debug_time('Total'):
|
with logs.debug_time('Total'):
|
||||||
logs.debug(u'Run with settings: {}'.format(pformat(settings)))
|
logs.debug(u'Run with settings: {}'.format(pformat(settings)))
|
||||||
raw_command = _get_raw_command(known_args)
|
raw_command = _get_raw_command(known_args)
|
||||||
@ -43,11 +42,7 @@ def fix_command(known_args):
|
|||||||
corrected_commands = get_corrected_commands(command)
|
corrected_commands = get_corrected_commands(command)
|
||||||
selected_command = select_command(corrected_commands)
|
selected_command = select_command(corrected_commands)
|
||||||
|
|
||||||
confirmation = True
|
if selected_command:
|
||||||
if selected_command.script in double_check_commands:
|
|
||||||
confirmation = confirm_command(double_check_commands[selected_command.script])
|
|
||||||
|
|
||||||
if selected_command and confirmation:
|
|
||||||
selected_command.run(command)
|
selected_command.run(command)
|
||||||
else:
|
else:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@ -57,7 +57,6 @@ def show_corrected_command(corrected_command):
|
|||||||
|
|
||||||
|
|
||||||
def confirm_text(corrected_command):
|
def confirm_text(corrected_command):
|
||||||
if corrected_command.script != 'reboot system?':
|
|
||||||
sys.stderr.write(
|
sys.stderr.write(
|
||||||
(u'{prefix}{clear}{bold}{script}{reset}{side_effect} '
|
(u'{prefix}{clear}{bold}{script}{reset}{side_effect} '
|
||||||
u'[{green}enter{reset}/{blue}↑{reset}/{blue}↓{reset}'
|
u'[{green}enter{reset}/{blue}↑{reset}/{blue}↓{reset}'
|
||||||
@ -71,19 +70,21 @@ def confirm_text(corrected_command):
|
|||||||
red=color(colorama.Fore.RED),
|
red=color(colorama.Fore.RED),
|
||||||
reset=color(colorama.Style.RESET_ALL),
|
reset=color(colorama.Style.RESET_ALL),
|
||||||
blue=color(colorama.Fore.BLUE)))
|
blue=color(colorama.Fore.BLUE)))
|
||||||
else:
|
|
||||||
|
def double_confirm_text(confirmation_text):
|
||||||
sys.stderr.write(
|
sys.stderr.write(
|
||||||
(u'{prefix}{clear}{bold}{script}{reset}{side_effect} '
|
(u'{prefix}{clear}{bold}{text}{reset} '
|
||||||
u'[{green}enter{reset}'
|
u'[{green}enter{reset}'
|
||||||
u'/{red}ctrl+c{reset}]').format(
|
u'/{red}ctrl+c{reset}]').format(
|
||||||
prefix=const.USER_COMMAND_MARK,
|
prefix=const.USER_COMMAND_MARK,
|
||||||
script=corrected_command.script,
|
text=confirmation_text,
|
||||||
side_effect=' (+side effect)' if corrected_command.side_effect else '',
|
|
||||||
clear='\033[1K\r',
|
clear='\033[1K\r',
|
||||||
bold=color(colorama.Style.BRIGHT),
|
bold=color(colorama.Style.BRIGHT),
|
||||||
green=color(colorama.Fore.GREEN),
|
green=color(colorama.Fore.GREEN),
|
||||||
red=color(colorama.Fore.RED),
|
red=color(colorama.Fore.RED),
|
||||||
reset=color(colorama.Style.RESET_ALL)))
|
reset=color(colorama.Style.RESET_ALL),
|
||||||
|
))
|
||||||
|
|
||||||
|
|
||||||
def debug(msg):
|
def debug(msg):
|
||||||
if settings.debug:
|
if settings.debug:
|
||||||
@ -152,16 +153,3 @@ def version(thefuck_version, python_version, shell_info):
|
|||||||
u'The Fuck {} using Python {} and {}\n'.format(thefuck_version,
|
u'The Fuck {} using Python {} and {}\n'.format(thefuck_version,
|
||||||
python_version,
|
python_version,
|
||||||
shell_info))
|
shell_info))
|
||||||
|
|
||||||
|
|
||||||
def confirmation(confirm, msg):
|
|
||||||
if confirm is True:
|
|
||||||
sys.stderr.write(u"\n{bold}System will now {message}\n{reset}".format(
|
|
||||||
bold=color(colorama.Style.BRIGHT),
|
|
||||||
message=msg[:-1],
|
|
||||||
reset=color(colorama.Style.RESET_ALL)))
|
|
||||||
else:
|
|
||||||
sys.stderr.write(u"\n{bold}{message} cancelled{reset}\n".format(
|
|
||||||
bold=color(colorama.Style.BRIGHT),
|
|
||||||
message=msg[:-1],
|
|
||||||
reset=color(colorama.Style.RESET_ALL)))
|
|
||||||
|
@ -81,10 +81,13 @@ def select_command(corrected_commands):
|
|||||||
|
|
||||||
logs.confirm_text(selector.value)
|
logs.confirm_text(selector.value)
|
||||||
|
|
||||||
for action in read_actions():
|
selected = False
|
||||||
|
while not selected:
|
||||||
|
action = next(read_actions())
|
||||||
|
|
||||||
if action == const.ACTION_SELECT:
|
if action == const.ACTION_SELECT:
|
||||||
sys.stderr.write('\n')
|
sys.stderr.write('\n')
|
||||||
return selector.value
|
selected = True
|
||||||
elif action == const.ACTION_ABORT:
|
elif action == const.ACTION_ABORT:
|
||||||
logs.failed('\nAborted')
|
logs.failed('\nAborted')
|
||||||
return
|
return
|
||||||
@ -96,25 +99,16 @@ def select_command(corrected_commands):
|
|||||||
logs.confirm_text(selector.value)
|
logs.confirm_text(selector.value)
|
||||||
|
|
||||||
|
|
||||||
def confirm_command(confirmation_text):
|
if not (settings.require_double_confirmation and selector.value.script in const.DOUBLE_CONFIRMATION_SCRIPTS):
|
||||||
"""Returns:
|
return selector.value
|
||||||
|
|
||||||
- the first command when confirmation disabled;
|
confirmation_text = const.DOUBLE_CONFIRMATION_SCRIPTS[selector.value.script]
|
||||||
- None when ctrl+c pressed;
|
logs.double_confirm_text(confirmation_text)
|
||||||
- selected command.
|
|
||||||
|
|
||||||
:type corrected_commands: Iterable[thefuck.types.CorrectedCommand]
|
|
||||||
:rtype: thefuck.types.CorrectedCommand | None
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
logs.confirm_text(CorrectedCommand(confirmation_text, None, 0))
|
|
||||||
|
|
||||||
action = read_actions()
|
|
||||||
for action in read_actions():
|
for action in read_actions():
|
||||||
if action == const.ACTION_SELECT:
|
if action == const.ACTION_SELECT:
|
||||||
logs.confirmation(True, confirmation_text)
|
sys.stderr.write('\n')
|
||||||
return True
|
return selector.value
|
||||||
elif action == const.ACTION_ABORT:
|
elif action == const.ACTION_ABORT:
|
||||||
logs.confirmation(False, confirmation_text)
|
logs.failed('\nAborted')
|
||||||
return False
|
return
|
||||||
|
Loading…
x
Reference in New Issue
Block a user