import argparse
import ntpath
import os
import pathlib
import platform
import sys
from glob import glob
import megengine
def add_completion(tools_path, write_path) :
script_files = [os.path.basename(p) for p in tools_path.glob("*.py")]
param_script = []
for script_name in script_files:
temp = ntpath.splitext(script_name)[0]
if temp=="__init__" or temp=="mge":
continue
param_script.append(temp)
completion_template_head = '''
_mge(){
local cur prev script_name
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
case "${prev}" in
mge)
words="compare_binary_iodump draw_graph load_network_and_run network_visualize profile_analyze"
COMPREPLY=( $(compgen -W "${words}" -- ${cur} ) )
return
;;
'''
completion_template_body = ""
completion_template_tail2=""
for param in param_script:
words_command = 'grep -Eso \'"-[[:alnum:]-]*[_[:alnum:]]*"\' {}/{}.py | xargs'.format(str(tools_path),param)
words = os.popen(words_command).read().strip()
completion_template_body+= '''
{})
words="{}"
COMPREPLY=($(compgen -W "$words" -- $cur))
return
;;
'''.format(param ,words)
completion_template_tail2+= '''
{})
words="{}"
COMPREPLY=($(compgen -W "$words" -- $cur))
return
;;
'''.format(param ,words)
completion_template_tail1='''
esac
case $cur in
-*)
script_name="${COMP_WORDS[1]}"
case $script_name in
'''
completion_template_tail3='''
esac
;;
esac
return
}
complete -o bashdefault -F _mge mge
'''
completion_template = completion_template_head + completion_template_body + completion_template_tail1 + completion_template_tail2 + completion_template_tail3
wp = pathlib.Path(write_path)
wp.parent.mkdir(parents=True, exist_ok = True)
with open(write_path, 'w+') as f:
f.write(completion_template)
def init(path) :
engine_path = pathlib.Path(megengine.__path__[0])
add_completion(engine_path/'tools',path)
def main(argv) :
if len(argv) == 0:
return
script_file = argv[0]
args = " ".join(argv[1:])
call_command = "python3 -m megengine.tools.{} {}".format(script_file,args)
os.system(call_command)
if __name__ == "__main__":
usage = 'usage: mge [-h|--help|--h] [--init] [script_name --script_param xxx]'
if len(sys.argv) <= 1 or sys.argv[1] == '-h' or sys.argv[1] =='--help' or sys.argv[1] =='--h':
print(usage)
sys.exit(0)
if sys.argv[1] == '--init':
sysstr = platform.system()
if(sysstr == "Windows"):
print("WARNING: windows doesn't support hinting")
else:
path = "{}/.local/share/bash-completion/completions/mge".format(os.environ.get("HOME"))
init(path)
shell = os.environ.get("SHELL")
if shell.find('zsh') != -1:
print("if you don't have zsh completion init, please excute command: 'autoload -Uz compinit && compinit'")
print("Guess you are using zsh, please add 'source %s' to your ~/.zshrc" % path)
elif shell.find('bash') != -1:
print("Guess you are using bash, please relogin or do 'source %s'" % path)
else:
print("Current {} doesn't support hinting shell completion".format(shell))
sys.exit(0)
else:
main(sys.argv[1:])