| @@ -1,37 +1,32 @@ | |||
| import os | |||
| import sys | |||
| import common | |||
| RACK_SDK = os.path.abspath("Rack-SDK") | |||
| STAGE_DIR = "stage" | |||
| def system(cmd): | |||
| print(cmd) | |||
| err = os.system(cmd) | |||
| if err: | |||
| raise Exception(f"Command failed with error {err}: {cmd}") | |||
| def stage_package(plugin_dir): | |||
| system(f'mkdir -p {STAGE_DIR}') | |||
| system(f'mv {plugin_dir}/dist/*.zip {STAGE_DIR}/') | |||
| common.system(f'mkdir -p {STAGE_DIR}') | |||
| common.system(f'mv {plugin_dir}/dist/*.zip {STAGE_DIR}/') | |||
| def delete_stage(): | |||
| system(f'rm -rf {STAGE_DIR}') | |||
| common.system(f'rm -rf {STAGE_DIR}') | |||
| def build_mac(plugin_dir): | |||
| print(f"Building {plugin_dir} for mac") | |||
| env = f'CC=x86_64-apple-darwin17-clang CXX=x86_64-apple-darwin17-clang++-libc++ STRIP=x86_64-apple-darwin17-strip RACK_DIR={RACK_SDK}' | |||
| make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
| system(f'{make} clean') | |||
| system(f'{make} cleandep') | |||
| system(f'{make} dep') | |||
| system(f'{make} dist') | |||
| common.system(f'{make} clean') | |||
| common.system(f'{make} cleandep') | |||
| common.system(f'{make} dep') | |||
| common.system(f'{make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{make} clean') | |||
| common.system(f'{make} clean') | |||
| print(f"Built {plugin_dir} for mac") | |||
| @@ -39,12 +34,12 @@ def build_win(plugin_dir): | |||
| print(f"Building {plugin_dir} for win") | |||
| env = f'CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ STRIP=x86_64-w64-mingw32-strip RACK_DIR={RACK_SDK}' | |||
| make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
| system(f'{make} clean') | |||
| system(f'{make} cleandep') | |||
| system(f'{make} dep') | |||
| system(f'{make} dist') | |||
| common.system(f'{make} clean') | |||
| common.system(f'{make} cleandep') | |||
| common.system(f'{make} dep') | |||
| common.system(f'{make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{make} clean') | |||
| common.system(f'{make} clean') | |||
| print(f"Built {plugin_dir} for win") | |||
| @@ -55,12 +50,12 @@ def build_lin(plugin_dir): | |||
| # TODO Make this Docker image publicly available | |||
| # It's essentially just Ubuntu 16.04 with plugin build dependencies installed, the workdir, and a user account set up so it matches my own machine's UID to solve file permissions issues. | |||
| docker = f'docker run --rm -v {RACK_SDK}:/Rack-SDK -v {plugin_abs}:/workdir -w /workdir -u vortico -e RACK_DIR=/Rack-SDK rackplugin:1' | |||
| system(f'{docker} {make} clean') | |||
| system(f'{docker} {make} cleandep') | |||
| system(f'{docker} {make} dep') | |||
| system(f'{docker} {make} dist') | |||
| common.system(f'{docker} {make} clean') | |||
| common.system(f'{docker} {make} cleandep') | |||
| common.system(f'{docker} {make} dep') | |||
| common.system(f'{docker} {make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{docker} {make} clean') | |||
| common.system(f'{docker} {make} clean') | |||
| print(f"Built {plugin_dir} for lin") | |||
| @@ -0,0 +1,9 @@ | |||
| import subprocess | |||
| def system(cmd): | |||
| print(cmd) | |||
| result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE) | |||
| if result.returncode != 0: | |||
| raise Exception(f"Command failed with error {result.returncode}: {cmd}") | |||
| return result.stdout.decode('utf-8') | |||
| @@ -6,8 +6,10 @@ import time | |||
| import zipfile | |||
| import re | |||
| import common | |||
| import build | |||
| import update_modulargrid | |||
| import update_cache | |||
| PACKAGES_DIR = "../packages" | |||
| @@ -17,9 +19,9 @@ RACK_USER_DIR = "$HOME/.Rack" | |||
| RACK_USER_PLUGIN_DIR = os.path.join(RACK_USER_DIR, "plugins-v1") | |||
| # Update git before continuing | |||
| build.system("git pull") | |||
| build.system("git submodule sync --quiet") | |||
| build.system("git submodule update --init --recursive") | |||
| common.system("git pull") | |||
| common.system("git submodule sync --quiet") | |||
| common.system("git submodule update --init --recursive") | |||
| plugin_filenames = sys.argv[1:] | |||
| @@ -80,8 +82,8 @@ for plugin_filename in plugin_filenames: | |||
| try: | |||
| build.delete_stage() | |||
| build.build(plugin_filename) | |||
| build.system(f'cp -vi stage/* "{PACKAGES_DIR}"') | |||
| build.system(f'cp -vi stage/*-lin.zip "{RACK_USER_PLUGIN_DIR}"') | |||
| common.system(f'cp -vi stage/* "{PACKAGES_DIR}"') | |||
| common.system(f'cp -vi stage/*-lin.zip "{RACK_USER_PLUGIN_DIR}"') | |||
| except Exception as e: | |||
| print(e) | |||
| print(f"{slug} build failed") | |||
| @@ -101,10 +103,10 @@ for plugin_filename in plugin_filenames: | |||
| # Copy package | |||
| package_dest = os.path.join(PACKAGES_DIR, os.path.basename(plugin_filename)) | |||
| build.system(f'cp "{plugin_filename}" "{package_dest}"') | |||
| build.system(f'touch "{package_dest}"') | |||
| common.system(f'cp "{plugin_filename}" "{package_dest}"') | |||
| common.system(f'touch "{package_dest}"') | |||
| if arch == 'lin': | |||
| build.system(f'cp "{plugin_filename}" "{RACK_USER_PLUGIN_DIR}"') | |||
| common.system(f'cp "{plugin_filename}" "{RACK_USER_PLUGIN_DIR}"') | |||
| # Copy manifest | |||
| with open(library_manifest_filename, "w") as f: | |||
| @@ -112,7 +114,7 @@ for plugin_filename in plugin_filenames: | |||
| # Delete screenshot cache | |||
| screenshots_dir = os.path.join(SCREENSHOTS_DIR, slug) | |||
| build.system(f'rm -rf "{screenshots_dir}"') | |||
| common.system(f'rm -rf "{screenshots_dir}"') | |||
| updated_slugs.add(slug) | |||
| @@ -121,6 +123,7 @@ if not updated_slugs: | |||
| print("Nothing to build") | |||
| exit(0) | |||
| update_cache.update() | |||
| update_modulargrid.update() | |||
| # Upload data | |||
| @@ -133,15 +136,16 @@ print(f"Press enter to upload the following packages and push the library repo: | |||
| input() | |||
| # Upload packages | |||
| build.system("cd ../packages && make upload") | |||
| common.system("cd ../packages && make upload") | |||
| # Upload screenshots | |||
| build.system("cd ../screenshots && make upload") | |||
| common.system("cd ../screenshots && make upload") | |||
| # Commit repository | |||
| build.system("git add manifests") | |||
| build.system(f"git commit -m 'Update manifest for {built_slugs_str}'") | |||
| build.system("git push") | |||
| common.system("git add manifests") | |||
| common.system("git add manifest-cache.json ModularGrid-VCVLibrary.json") | |||
| common.system(f"git commit -m 'Update manifest for {built_slugs_str}'") | |||
| common.system("git push") | |||
| print() | |||
| print(f"Updated {built_slugs_str}") | |||
| @@ -0,0 +1,66 @@ | |||
| import sys | |||
| import os | |||
| import glob | |||
| import json | |||
| import re | |||
| import requests | |||
| import common | |||
| # Get the timestamp of the earliest commit touching the manifest file | |||
| def get_plugin_creation(manifest_filename): | |||
| stdout = common.system(f"git log --format=%ct -- {manifest_filename} | tail -1") | |||
| return float(stdout.strip()) | |||
| # Get the timestamp of the earliest commit having the module slug | |||
| def get_module_creation(manifest_filename, module_slug): | |||
| stdout = common.system(f"git log --format='%H %ct' -- {manifest_filename}") | |||
| for line in stdout.strip().split("\n"): | |||
| hash, time = line.split(" ") | |||
| stdout = common.system(f"git show {hash}:{manifest_filename}") | |||
| print(stdout) | |||
| def update(): | |||
| # Load existing dataset | |||
| cache_filename = "manifest-cache.json" | |||
| with open(cache_filename) as f: | |||
| cache = json.load(f) | |||
| # Iterate plugins | |||
| for manifest_filename in glob.glob('manifests/*.json'): | |||
| with open(manifest_filename) as f: | |||
| plugin = json.load(f) | |||
| plugin_slug = plugin['slug'] | |||
| cache_plugin = cache.get(plugin_slug, {}) | |||
| # Get plugin creation | |||
| if 'creationTimestamp' not in cache_plugin: | |||
| cache_plugin['creationTimestamp'] = get_plugin_creation(manifest_filename) | |||
| # Iterate modules in plugin | |||
| cache_modules = cache.get('modules', {}) | |||
| for module in plugin.get('modules', []): | |||
| module_slug = module['slug'] | |||
| cache_module = cache_modules.get(module_slug, {}) | |||
| # TODO | |||
| # Get module creation | |||
| # get_module_creation() | |||
| # exit() | |||
| cache_modules[module_slug] = cache_module | |||
| cache_plugin['modules'] = cache_modules | |||
| cache[plugin_slug] = cache_plugin | |||
| with open(cache_filename, 'w') as f: | |||
| json.dump(cache, f, indent=2) | |||
| if __name__ == "__main__": | |||
| update() | |||
| @@ -8,6 +8,7 @@ import requests | |||
| def update(): | |||
| # Load existing dataset | |||
| # This dataset is standardized by ModularGrid. Do not change the schema or filename. | |||
| mg_filename = "ModularGrid-VCVLibrary.json" | |||
| with open(mg_filename) as f: | |||
| mg = json.load(f) | |||