Skip to content

Commit

Permalink
fix: Command picking & execution
Browse files Browse the repository at this point in the history
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 #1223
  • Loading branch information
gavindsouza committed Dec 28, 2021
1 parent 2caf7e7 commit 2fa25d8
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 13 deletions.
26 changes: 13 additions & 13 deletions bench/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
is_root,
log,
setup_logging,
parse_sys_argv,
)
from bench.utils.bench import get_env_cmd

Expand All @@ -34,21 +35,23 @@
is_envvar_warn_set = None
from_command_line = False # set when commands are executed via the CLI
bench.LOG_BUFFER = []
sys_argv = None

change_uid_msg = "You should not run this command as root"
src = os.path.dirname(__file__)


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
command = " ".join(sys.argv)
argv = set(sys.argv)
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"})
sys_argv = parse_sys_argv()

if "--verbose" in sys.argv:
if "--verbose" in sys_argv.options:
verbose = True

change_working_directory()
Expand Down Expand Up @@ -92,13 +95,10 @@ def cli():
print(get_frappe_help())
return

if sys.argv[1] in ["--site", "--force", "--profile"]:
frappe_cmd()

if sys.argv[1] in get_cached_frappe_commands():
frappe_cmd()

if sys.argv[1] in get_frappe_commands():
if (
sys_argv.commands.intersection(get_cached_frappe_commands())
or sys_argv.commands.intersection(get_frappe_commands())
):
frappe_cmd()

if sys.argv[1] in Bench(".").apps:
Expand Down Expand Up @@ -188,15 +188,15 @@ def frappe_cmd(bench_path="."):
def get_cached_frappe_commands():
if os.path.exists(bench_cache_file):
command_dump = open(bench_cache_file, "r").read() or "[]"
return json.loads(command_dump)
return []
return set(json.loads(command_dump))
return set()


def get_frappe_commands():
if not is_bench_directory():
return []
return set()

return generate_command_cache()
return set(generate_command_cache())


def get_frappe_help(bench_path="."):
Expand Down
35 changes: 35 additions & 0 deletions bench/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,3 +471,38 @@ def get_traceback() -> str:

trace_list = format_exception(exc_type, exc_value, exc_tb)
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

0 comments on commit 2fa25d8

Please sign in to comment.