def update(include_projects=False): import git import taichi as tc g = git.cmd.Git(tc.get_repo_directory()) print(Fore.GREEN + "Updating [taichi]..." + Style.RESET_ALL) try: g.pull('--rebase') print(Fore.GREEN + " ...Done" + Style.RESET_ALL) except git.exc.GitCommandError as e: if 'You have unstaged changes' in e.stderr: print_red_bold( " You have unstaged changes in the Taichi main repo. Please commit your changes first." ) exit(-1) for proj in os.listdir(tc.get_project_directory()): if proj in ['examples', 'toys' ] or proj.startswith('_') or not os.path.isdir( tc.get_project_directory(proj)): continue print(Fore.GREEN + "Updating project [{}]...".format(proj) + Style.RESET_ALL) g = git.cmd.Git(os.path.join(tc.get_project_directory(proj))) try: g.pull('--rebase') print(Fore.GREEN + " ...Done" + Style.RESET_ALL) except git.exc.GitCommandError as e: if 'You have unstaged changes' in e.stderr: print_red_bold( " You have unstaged changes in the project[{}]. Please commit your changes first." .format(proj)) exit(-1)
def get_projects(active=True): import taichi as tc ret = [] for proj in os.listdir(tc.get_project_directory()): if proj not in ['examples', 'toys'] and os.path.isdir(tc.get_project_directory(proj)): activation = not proj.startswith('_') if not activation: proj = proj[1:] if activation == active: ret.append(proj) return ret
def update(include_projects=False): import git import taichi as tc g = git.cmd.Git(tc.get_repo_directory()) print(Fore.GREEN + "Updating [taichi]..." + Style.RESET_ALL) g.pull('--rebase') print(Fore.GREEN + " ...Done" + Style.RESET_ALL) for proj in os.listdir(tc.get_project_directory()): if proj in ['examples', 'toys'] or proj.startswith('_') or not os.path.isdir( tc.get_project_directory(proj)): continue print( Fore.GREEN + "Updating project [{}]...".format(proj) + Style.RESET_ALL) g = git.cmd.Git(os.path.join(tc.get_project_directory(proj))) g.pull('--rebase') print(Fore.GREEN + " ...Done" + Style.RESET_ALL)
def get_packages(): import taichi as tc ret = [] for proj in os.listdir(tc.get_project_directory()): proj_path = tc.get_project_directory(proj) if proj not in ['examples', 'toys'] and os.path.isdir(proj_path): activation = not proj.startswith('_') import git repo = git.Repo(proj_path) commit = repo.head.commit if not activation: proj = proj[1:] ret.append({ 'name': proj, 'active': activation, 'version': commit.hexsha[:8] + ': ' + commit.message, 'time': commit.committed_datetime.strftime('%b %d %Y, %H:%M:%S') }) return ret
def run_pytest(): print("\nRunning python tests...\n") from pathlib import Path import taichi as ti import subprocess hooks = list(filter(lambda x: str(x).endswith('testhook.py'), Path(ti.get_project_directory()).rglob("*.py"))) for hook in map(str, hooks): print("\nRunning testhook {}...\n".format(hook)) cwd = os.getcwd() os.chdir(hook[:hook.rfind('/')]) subprocess.call([sys.executable, hook]) os.chdir(cwd)
def main(): lines = [] print() lines.append(u'{:^43}'.format(u' '.join([u'\u262f'] * 8))) lines.append(u' *******************************************') lines.append(u' ** Taichi **') lines.append(u' ** ~~~~~~ **') lines.append(u' ** Open Source Computer Graphics Library **') lines.append(u' *******************************************') lines.append(u'{:^43}'.format(u"\u2630 \u2631 \u2632 \u2633 " "\u2634 \u2635 \u2636 \u2637")) print(u'\n'.join(lines)) print() import taichi as tc argc = len(sys.argv) if argc == 1 or sys.argv[1] == 'help': print( " Usage: ti run [task name] |-> Run a specific task\n" " ti test |-> Run tests\n" " ti proj |-> List all projects\n" " ti proj activate [name] |-> Activate project\n" " ti proj deactivate [name] |-> Deactivate project\n" " ti build |-> Build C++ files\n" " ti clean asm [*.s] |-> Clean up gcc ASM\n" " ti plot [*.txt] |-> Plot a memory usage curve\n" " ti update |-> Update taichi and projects\n" " ti video |-> Make a video using *.png files in the current folder\n" " ti convert |-> Delete color controllers in a log file\n" " ti exec |-> Invoke a executable in the 'build' folder\n" " ti format |-> Format taichi and projects\n" " (C++ source and python scripts)\n" " ti statement [statement] |-> Execute a single statement (with taichi imported as tc\n" " ti [script.py] |-> Run script\n" " ti debug [script.py] |-> Debug script\n") exit(-1) mode = sys.argv[1] if mode.endswith('.py'): with open(mode) as script: script = script.read() exec(script, {'__name__': '__main__'}) exit() if mode == "run": if argc <= 2: print("Please specify [task name], e.g. test_math") exit(-1) name = sys.argv[2] task = tc.Task(name) task.run(sys.argv[3:]) elif mode == "debug": tc.core.set_core_trigger_gdb_when_crash(True) if argc <= 2: print("Please specify [file name], e.g. render.py") exit(-1) name = sys.argv[2] with open(name) as script: script = script.read() exec(script, {'__name__': '__main__'}) exit() elif mode == "proj": if len(sys.argv) == 2: print_all_projects() elif sys.argv[2] == 'activate': proj = sys.argv[3] assert not os.path.exists(tc.get_project_directory(proj)) assert os.path.exists(tc.get_project_directory('_' + proj)) os.rename(tc.get_project_directory('_' + proj), tc.get_project_directory(proj)) elif sys.argv[2] == 'deactivate': proj = sys.argv[3] assert not os.path.exists(tc.get_project_directory('_' + proj)) assert os.path.exists(tc.get_project_directory(proj)) os.rename(tc.get_project_directory(proj), tc.get_project_directory('_' + proj)) else: assert False elif mode == "test": task = tc.Task('test') task.run(sys.argv[2:]) elif mode == "build": tc.core.build() elif mode == "format": tc.core.format() elif mode == "statement": exec(sys.argv[2]) elif mode == "plot": plot(sys.argv[2]) elif mode == "update": tc.core.update(True) tc.core.build() elif mode == "asm": fn = sys.argv[2] os.system( r"sed '/^\s*\.\(L[A-Z]\|[a-z]\)/ d' {0} > clean_{0}".format(fn)) elif mode == "exec": import subprocess exec_name = sys.argv[2] folder = tc.get_bin_directory() assert exec_name in os.listdir(folder) subprocess.call([os.path.join(folder, exec_name)] + sys.argv[3:]) elif mode == "interpolate": interpolate_frames('.') elif mode == "video": files = sorted(os.listdir('.')) files = list(filter(lambda x: x.endswith('.png'), files)) tc.info('Making video using {} png files...', len(files)) output_fn = 'video.mp4' make_video(files, output_path=output_fn) tc.info('Done! Output video file = {}', output_fn) elif mode == "convert": # http://www.commandlinefu.com/commands/view/3584/remove-color-codes-special-characters-with-sed # TODO: Windows support for fn in sys.argv[2:]: print("Converting logging file: {}".format(fn)) tmp_fn = '/tmp/{}.{:05d}.backup'.format(fn, random.randint(0, 10000)) shutil.move(fn, tmp_fn) command = r'sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"' os.system('{} {} > {}'.format(command, tmp_fn, fn)) else: print("Unknown command '{}'".format(mode)) exit(-1)
def deactivate_package(proj): import taichi as tc assert not os.path.exists(tc.get_project_directory('_' + proj)) assert os.path.exists(tc.get_project_directory(proj)) os.rename(tc.get_project_directory(proj), tc.get_project_directory('_' + proj))