Beispiel #1
0
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)
Beispiel #2
0
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
Beispiel #3
0
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)
Beispiel #4
0
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
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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))