@@ -1,50 +0,0 @@ | |||
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=" ") | |||
# Copy package | |||
package_dest = os.path.join(PACKAGES_DIR, os.path.basename(package_src)) | |||
build.system(f"cp '{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") |
@@ -4,7 +4,6 @@ import sys | |||
RACK_SDK = os.path.abspath("Rack-SDK") | |||
STAGE_DIR = "stage" | |||
PACKAGE_DIR = "../packages" | |||
def system(cmd): | |||
@@ -19,10 +18,6 @@ def stage_package(plugin_dir): | |||
system(f'mv {plugin_dir}/dist/*.zip {STAGE_DIR}/') | |||
def move_stage(): | |||
system(f'mv -vi {STAGE_DIR}/* {PACKAGE_DIR}/') | |||
def delete_stage(): | |||
system(f'rm -rf {STAGE_DIR}') | |||
@@ -0,0 +1,124 @@ | |||
import sys | |||
import os | |||
import glob | |||
import json | |||
import time | |||
import build | |||
import zipfile | |||
PACKAGES_DIR = "../packages" | |||
SCREENSHOTS_DIR = "../screenshots" | |||
MANIFESTS_DIR = "manifests" | |||
RACK_USER_DIR = "~/.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 update --init --recursive") | |||
plugin_filenames = sys.argv[1:] | |||
# Default to all repos, so all out-of-date repos are built | |||
if not plugin_filenames: | |||
plugin_filenames = glob.glob("repos/*") | |||
updated_slugs = set() | |||
for plugin_filename in plugin_filenames: | |||
(plugin_basename, plugin_ext) = os.path.splitext(plugin_filename) | |||
# Extract manifest from plugin dir or package | |||
if os.path.isdir(plugin_filename): | |||
manifest_filename = os.path.join(plugin_filename, "plugin.json") | |||
try: | |||
# Read manifest | |||
with open(manifest_filename, "r") as f: | |||
manifest = json.load(f) | |||
except IOError: | |||
# Skip plugins without plugin.json | |||
continue | |||
elif plugin_ext == ".zip": | |||
# Open ZIP | |||
z = zipfile.ZipFile(plugin_filename) | |||
manifest_filename = [f for f in z.namelist() if f.endswith("/plugin.json")][0] | |||
# Unzip manifest | |||
with z.open(manifest_filename) as f: | |||
manifest = json.load(f) | |||
else: | |||
raise Exception(f"Plugin {plugin_filename} must be a source dir or zip package") | |||
# Get library manifest | |||
slug = manifest['slug'] | |||
library_manifest_filename = os.path.join(MANIFESTS_DIR, f"{slug}.json") | |||
if os.path.isdir(plugin_filename): | |||
# Check if the library manifest is up to date | |||
try: | |||
with open(library_manifest_filename, "r") as f: | |||
library_manifest = json.load(f) | |||
if library_manifest and manifest['version'] == library_manifest['version']: | |||
continue | |||
except IOError: | |||
pass | |||
# Build repo | |||
print() | |||
print(f"Building {slug}") | |||
try: | |||
build.delete_stage() | |||
build.build(plugin_filename) | |||
build.system(f"cp -vi stage/* '{PACKAGES_DIR}'") | |||
build.system(f"cp -vi stage/* '{RACK_USER_PLUGIN_DIR}'") | |||
except Exception as e: | |||
print(e) | |||
print(f"{slug} build failed") | |||
input() | |||
continue | |||
finally: | |||
build.delete_stage() | |||
# Open plugin issue thread | |||
os.system(f"qutebrowser 'https://github.com/VCVRack/library/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+in%3Atitle+{slug}' &") | |||
elif plugin_ext == ".zip": | |||
# Review manifest for errors | |||
print(json.dumps(manifest, indent=" ")) | |||
print("Press enter to approve manifest") | |||
input() | |||
# 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}'") | |||
# Copy manifest | |||
with open(library_manifest_filename, "w") as f: | |||
json.dump(manifest, f, indent=" ") | |||
# Delete screenshot cache | |||
screenshots_dir = os.path.join(SCREENSHOTS_DIR, slug) | |||
build.system(f"rm -rf '{screenshots_dir}'") | |||
updated_slugs.add(slug) | |||
if not updated_slugs: | |||
print("Nothing to build") | |||
exit(0) | |||
print("Press enter to upload packages and push library repo") | |||
input() | |||
# Upload packages | |||
build.system("cd ../packages && make upload") | |||
# Commit repository | |||
build.system("git add manifests") | |||
built_slugs_str = ", ".join(updated_slugs) | |||
build.system(f"git commit -m 'Update manifest for {built_slugs_str}'") | |||
build.system("git push") | |||
print() | |||
print(f"Built {built_slugs_str}") | |||
print("Remember to generate and upload screenshots") |
@@ -1,88 +0,0 @@ | |||
import sys | |||
import os | |||
import glob | |||
import json | |||
import time | |||
import build | |||
build.system("git pull") | |||
build.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: | |||
manifest_filename = f"{plugin_dir}/plugin.json" | |||
try: | |||
with open(manifest_filename, "r") as f: | |||
manifest = json.load(f) | |||
except IOError: | |||
# Skip plugins without plugin.json | |||
continue | |||
slug = manifest['slug'] | |||
library_manifest_filename = f"manifests/{slug}.json" | |||
library_manifest = None | |||
try: | |||
with open(library_manifest_filename, "r") as f: | |||
library_manifest = json.load(f) | |||
except IOError: | |||
pass | |||
# Check if the build is up to date | |||
if library_manifest and manifest['version'] == library_manifest['version']: | |||
continue | |||
# Build repo | |||
print() | |||
print(f"Building {slug}") | |||
try: | |||
build.build(plugin_dir) | |||
build.move_stage() | |||
except Exception as e: | |||
print(e) | |||
print(f"{slug} build failed") | |||
input() | |||
continue | |||
finally: | |||
build.delete_stage() | |||
# Copy manifest | |||
with open(library_manifest_filename, "w") as f: | |||
json.dump(manifest, f, indent=" ") | |||
built_slugs.append(slug) | |||
# Open plugin issue thread | |||
os.system(f"qutebrowser \"https://github.com/VCVRack/library/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+in%3Atitle+{slug}\" &") | |||
if not built_slugs: | |||
print("Nothing to build") | |||
exit(0) | |||
print("Press enter to upload packages and push library repo") | |||
input() | |||
# Upload packages | |||
build.system("cd ../packages && make upload") | |||
# Commit repository | |||
build.system("git add manifests") | |||
built_slugs_str = ", ".join(built_slugs) | |||
build.system(f"git commit -m 'Update build for {built_slugs_str}'") | |||
build.system("git push") | |||
# Delete screenshot cache | |||
for slug in built_slugs: | |||
build.system("rm -rf '../screenshots/{slug}'") | |||
print() | |||
print("Built " + ", ".join(built_slugs)) | |||
print("Remember to generate and upload screenshots") |