#! /usr/bin/env python3 # MegEngine is Licensed under the Apache License, Version 2.0 (the "License") # # Copyright (c) 2014-2021 Megvii Inc. All rights reserved. # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 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:])