@@ -0,0 +1,50 @@ | |||
import sys | |||
import json | |||
import os | |||
import glob | |||
import zipfile | |||
import shutil | |||
import build | |||
PACKAGES_DIR = "../packages" | |||
MANIFESTS_DIR = "manifests" | |||
plugin_packages = sys.argv[1:] | |||
slugs = set() | |||
for package_src in plugin_packages: | |||
# Open ZIP | |||
z = zipfile.ZipFile(package_src) | |||
manifest_src = [f for f in z.namelist() if f.endswith("/plugin.json")][0] | |||
# Read manifest | |||
with z.open(manifest_src) as f: | |||
manifest = json.load(f) | |||
# Review manifest | |||
print(json.dumps(manifest, indent=" ")) | |||
input() | |||
# Write manifest | |||
slug = os.path.split(manifest_src)[0] | |||
manifest_dest = os.path.join(MANIFESTS_DIR, slug + ".json") | |||
with open(manifest_dest, "w") as f: | |||
json.dump(manifest, f, indent=" ") | |||
# Move package | |||
package_dest = os.path.join(PACKAGES_DIR, os.path.basename(package_src)) | |||
shutil.move(package_src, package_dest) | |||
build.system(f"touch '{package_dest}'") | |||
slugs.add(slug) | |||
# Upload packages | |||
build.system(f"cd {PACKAGES_DIR} && make upload") | |||
# Commit repository | |||
build.system("git add manifests") | |||
slugs_list = ", ".join(slugs) | |||
build.system(f"git commit -m 'Update manifest for {slugs_list}'") | |||
build.system("git push") |
@@ -27,43 +27,52 @@ def delete_stage(): | |||
def build_mac(plugin_dir): | |||
print(f"Building {plugin_dir} for mac") | |||
env = f'CC=x86_64-apple-darwin15-clang CXX=x86_64-apple-darwin15-clang++-libc++ STRIP=x86_64-apple-darwin15-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') | |||
stage_package(plugin_dir) | |||
system(f'{make} clean') | |||
print(f"Built {plugin_dir} for mac") | |||
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') | |||
stage_package(plugin_dir) | |||
system(f'{make} clean') | |||
print(f"Built {plugin_dir} for win") | |||
def build_lin(plugin_dir): | |||
print(f"Building {plugin_dir} for lin") | |||
make = f'make -j$(nproc)' | |||
plugin_abs = os.path.abspath(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') | |||
stage_package(plugin_dir) | |||
system(f'{docker} {make} clean') | |||
print(f"Built {plugin_dir} for lin") | |||
def build(plugin_dir): | |||
try: | |||
build_lin(plugin_dir) | |||
build_win(plugin_dir) | |||
build_mac(plugin_dir) | |||
build_win(plugin_dir) | |||
move_stage() | |||
finally: | |||
delete_stage() | |||
@@ -1,69 +0,0 @@ | |||
import os | |||
import sys | |||
RACK_SDK = os.path.abspath("Rack-SDK") | |||
def system(cmd): | |||
if os.system(cmd): | |||
raise Exception(f"Failed command: {cmd}") | |||
def stage_package(plugin_dir): | |||
system('mkdir -p stage') | |||
system(f'mv {plugin_dir}/dist/*.zip stage/') | |||
def delete_stage(): | |||
system(f'rm -rf stage') | |||
def build_mac(plugin_dir): | |||
env = f'CC=x86_64-apple-darwin15-clang CXX=x86_64-apple-darwin15-clang++-libc++ STRIP=x86_64-apple-darwin15-strip RACK_DIR={RACK_SDK}' | |||
make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
system(f'{make} clean') | |||
system(f'{make} dist') | |||
stage_package(plugin_dir) | |||
system(f'{make} clean') | |||
def build_win(plugin_dir): | |||
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} dist') | |||
stage_package(plugin_dir) | |||
system(f'{make} clean') | |||
def build_lin(plugin_dir): | |||
env = f'-e RACK_DIR=/Rack-SDK' | |||
make = f'make -j$(nproc)' | |||
plugin_abs = os.path.abspath(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 {env} a0b9c87ec456' | |||
system(f'{docker} {make} clean') | |||
system(f'{docker} {make} dist') | |||
stage_package(plugin_dir) | |||
system(f'{docker} {make} clean') | |||
def build(plugin_dir): | |||
try: | |||
build_lin(plugin_dir) | |||
build_win(plugin_dir) | |||
build_mac(plugin_dir) | |||
except Exception as e: | |||
delete_stage() | |||
print(e) | |||
return False | |||
return True | |||
if __name__ == "__main__": | |||
plugin_dir = sys.argv[1] | |||
if not plugin_dir: | |||
raise "No plugin_dir given" | |||
build(plugin_dir) |
@@ -1,70 +0,0 @@ | |||
import sys | |||
import os | |||
import glob | |||
import json | |||
import time | |||
import build_plugin | |||
build_plugin.system("git pull") | |||
build_plugin.system("git submodule update --init --recursive") | |||
plugin_dirs = sys.argv[1:] | |||
if not plugin_dirs: | |||
plugin_dirs = glob.glob("repos/*") | |||
built_slugs = [] | |||
for plugin_dir in plugin_dirs: | |||
slug = os.path.basename(plugin_dir) | |||
manifest_filename = f"manifests/{slug}.json" | |||
with open(manifest_filename, "r") as f: | |||
manifest = json.load(f) | |||
# We need a repoVersion to build | |||
if 'repoVersion' not in manifest: | |||
continue | |||
# Skip if update is not needed | |||
if 'latestVersion' in manifest and manifest['latestVersion'] == manifest['repoVersion']: | |||
continue | |||
# Build repo | |||
success = build_plugin.build(plugin_dir) | |||
if not success: | |||
print(f"{slug} failed") | |||
input() | |||
continue | |||
build_plugin.system('mv -vi stage/* ../packages/') | |||
build_plugin.delete_stage() | |||
# Update build information | |||
manifest['latestVersion'] = manifest['repoVersion'] | |||
manifest['buildTimestamp'] = round(time.time()) | |||
manifest['status'] = "available" | |||
with open(manifest_filename, "w") as f: | |||
json.dump(manifest, f, indent=" ") | |||
built_slugs.append(slug) | |||
os.system("qutebrowser \"https://github.com/VCVRack/library/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+" + slug + "\" &") | |||
if not built_slugs: | |||
raise Exception("Nothing to build") | |||
# Upload packages | |||
build_plugin.system("cd ../packages && make upload") | |||
# Commit repository | |||
build_plugin.system("git add -u") | |||
build_plugin.system("git commit -m 'Update builds'") | |||
build_plugin.system("git push") | |||
print() | |||
print("Built " + ", ".join(built_slugs)) |
@@ -67,7 +67,8 @@ build.system("cd ../packages && make upload") | |||
# Commit repository | |||
build.system("git add manifests") | |||
build.system("git commit -m 'Update builds'") | |||
built_slugs_list = ", ".join(built_slugs) | |||
build.system(f"git commit -m 'Update build for {built_slugs_list}'") | |||
build.system("git push") | |||