2
0
mirror of https://github.com/frappe/bench.git synced 2024-11-14 09:14:04 +00:00

fix: Command picking & execution

Parse sys.argv appropriately and use them to match commands "better".
Using hacks to match with flags and options appear to be faulty, so
dropped that. Only matching with command names remains.

Fixes https://github.com/frappe/bench/issues/1223
This commit is contained in:
Gavin D'souza 2021-12-28 13:36:01 +05:30
parent 2caf7e7d15
commit 2fa25d8791
2 changed files with 48 additions and 13 deletions

View File

@ -25,6 +25,7 @@ from bench.utils import (
is_root, is_root,
log, log,
setup_logging, setup_logging,
parse_sys_argv,
) )
from bench.utils.bench import get_env_cmd from bench.utils.bench import get_env_cmd
@ -34,21 +35,23 @@ verbose = False
is_envvar_warn_set = None is_envvar_warn_set = None
from_command_line = False # set when commands are executed via the CLI from_command_line = False # set when commands are executed via the CLI
bench.LOG_BUFFER = [] bench.LOG_BUFFER = []
sys_argv = None
change_uid_msg = "You should not run this command as root" change_uid_msg = "You should not run this command as root"
src = os.path.dirname(__file__) src = os.path.dirname(__file__)
def cli(): def cli():
global from_command_line, bench_config, is_envvar_warn_set, verbose global from_command_line, bench_config, is_envvar_warn_set, verbose, sys_argv
from_command_line = True from_command_line = True
command = " ".join(sys.argv) command = " ".join(sys.argv)
argv = set(sys.argv) argv = set(sys.argv)
is_envvar_warn_set = not (os.environ.get("BENCH_DEVELOPER") or os.environ.get("CI")) is_envvar_warn_set = not (os.environ.get("BENCH_DEVELOPER") or os.environ.get("CI"))
is_cli_command = len(sys.argv) > 1 and not argv.intersection({"src", "--version"}) is_cli_command = len(sys.argv) > 1 and not argv.intersection({"src", "--version"})
sys_argv = parse_sys_argv()
if "--verbose" in sys.argv: if "--verbose" in sys_argv.options:
verbose = True verbose = True
change_working_directory() change_working_directory()
@ -92,13 +95,10 @@ def cli():
print(get_frappe_help()) print(get_frappe_help())
return return
if sys.argv[1] in ["--site", "--force", "--profile"]: if (
frappe_cmd() sys_argv.commands.intersection(get_cached_frappe_commands())
or sys_argv.commands.intersection(get_frappe_commands())
if sys.argv[1] in get_cached_frappe_commands(): ):
frappe_cmd()
if sys.argv[1] in get_frappe_commands():
frappe_cmd() frappe_cmd()
if sys.argv[1] in Bench(".").apps: if sys.argv[1] in Bench(".").apps:
@ -188,15 +188,15 @@ def frappe_cmd(bench_path="."):
def get_cached_frappe_commands(): def get_cached_frappe_commands():
if os.path.exists(bench_cache_file): if os.path.exists(bench_cache_file):
command_dump = open(bench_cache_file, "r").read() or "[]" command_dump = open(bench_cache_file, "r").read() or "[]"
return json.loads(command_dump) return set(json.loads(command_dump))
return [] return set()
def get_frappe_commands(): def get_frappe_commands():
if not is_bench_directory(): if not is_bench_directory():
return [] return set()
return generate_command_cache() return set(generate_command_cache())
def get_frappe_help(bench_path="."): def get_frappe_help(bench_path="."):

View File

@ -471,3 +471,38 @@ def get_traceback() -> str:
trace_list = format_exception(exc_type, exc_value, exc_tb) trace_list = format_exception(exc_type, exc_value, exc_tb)
return "".join(trace_list) return "".join(trace_list)
class _dict(dict):
"""dict like object that exposes keys as attributes"""
# bench port of frappe._dict
def __getattr__(self, key):
ret = self.get(key)
# "__deepcopy__" exception added to fix frappe#14833 via DFP
if not ret and key.startswith("__") and key != "__deepcopy__":
raise AttributeError()
return ret
def __setattr__(self, key, value):
self[key] = value
def __getstate__(self):
return self
def __setstate__(self, d):
self.update(d)
def update(self, d):
"""update and return self -- the missing dict feature in python"""
super(_dict, self).update(d)
return self
def copy(self):
return _dict(dict(self).copy())
def parse_sys_argv():
sys_argv = _dict(options=set(), commands=set())
for c in sys.argv[1:]:
if c.startswith("-"):
sys_argv.options.add(c)
else:
sys_argv.commands.add(c)
return sys_argv