|
|
@@ -6,6 +6,7 @@ import time |
|
|
|
import re |
|
|
|
import tempfile |
|
|
|
import random |
|
|
|
import functools |
|
|
|
|
|
|
|
import common |
|
|
|
import update_modulargrid |
|
|
@@ -16,12 +17,43 @@ TOOLCHAIN_DIR = "../toolchain-v2" |
|
|
|
PACKAGES_DIR = "../packages" |
|
|
|
MANIFESTS_DIR = "manifests" |
|
|
|
RACK_SYSTEM_DIR = "../Rack2" |
|
|
|
RACK_USER_DIR = "$HOME/.Rack2" |
|
|
|
RACK_USER_DIR = "$HOME/.local/share/Rack2" |
|
|
|
SCREENSHOTS_DIR = os.path.join(RACK_USER_DIR, "screenshots") |
|
|
|
PLUGIN_DIR = os.path.join(RACK_USER_DIR, "plugins-lin-x64") |
|
|
|
FILES_DIR = "../files/packages" |
|
|
|
|
|
|
|
BUILD_MAC_ARM64_ONLY = False |
|
|
|
|
|
|
|
def version_part_less(a, b): |
|
|
|
try: |
|
|
|
ai = int(a) |
|
|
|
except ValueError: |
|
|
|
ai = None |
|
|
|
|
|
|
|
try: |
|
|
|
bi = int(b) |
|
|
|
except ValueError: |
|
|
|
bi = None |
|
|
|
|
|
|
|
if ai is not None and bi is not None: |
|
|
|
return ai < bi |
|
|
|
elif ai is not None: |
|
|
|
return False |
|
|
|
elif bi is not None: |
|
|
|
return True |
|
|
|
else: |
|
|
|
return a < b |
|
|
|
|
|
|
|
|
|
|
|
def version_less(a, b): |
|
|
|
a_parts = a.split(".") |
|
|
|
b_parts = b.split(".") |
|
|
|
|
|
|
|
for a_part, b_part in zip(a_parts, b_parts): |
|
|
|
if a_part == b_part: |
|
|
|
continue |
|
|
|
return version_part_less(a_part, b_part) |
|
|
|
|
|
|
|
return len(a_parts) < len(b_parts) |
|
|
|
|
|
|
|
|
|
|
|
def package_exists(slug, version, os_, cpu): |
|
|
@@ -53,24 +85,21 @@ def print_missing_mac_arm64(): |
|
|
|
|
|
|
|
print(f"{slug} {version}\t\t{email}\t\t{license}") |
|
|
|
|
|
|
|
# print_missing_mac_arm64() |
|
|
|
# exit(0) |
|
|
|
|
|
|
|
|
|
|
|
# Update git before continuing |
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
common.system("git pull") |
|
|
|
common.system("git submodule sync --recursive --quiet") |
|
|
|
common.system("git submodule update --init --recursive") |
|
|
|
common.system("git pull") |
|
|
|
common.system("git submodule sync --recursive --quiet") |
|
|
|
common.system("git submodule update --init --recursive") |
|
|
|
|
|
|
|
plugin_paths = sys.argv[1:] |
|
|
|
|
|
|
|
# Default to all repos, so all out-of-date repos are built |
|
|
|
if not plugin_paths: |
|
|
|
plugin_paths = glob.glob("repos/*") |
|
|
|
plugin_paths.sort() |
|
|
|
|
|
|
|
# Randomize repo order |
|
|
|
plugin_paths = random.sample(plugin_paths, len(plugin_paths)) |
|
|
|
# plugin_paths = random.sample(plugin_paths, len(plugin_paths)) |
|
|
|
|
|
|
|
manifest_versions = {} |
|
|
|
|
|
|
@@ -131,30 +160,25 @@ for plugin_path in plugin_paths: |
|
|
|
library_manifest = json.load(f) |
|
|
|
except IOError: |
|
|
|
# Warn if manifest is new |
|
|
|
print(f"Manifest {slug} is new, press enter to approve.") |
|
|
|
if input() != '': |
|
|
|
continue |
|
|
|
# print(f"Manifest {slug} is new, press enter to approve.") |
|
|
|
# if input() != '': |
|
|
|
# continue |
|
|
|
pass |
|
|
|
|
|
|
|
# Ensure that no modules are removed from library |
|
|
|
if library_manifest: |
|
|
|
library_modules = set(module['slug'] for module in library_manifest['modules']) |
|
|
|
modules = set(module['slug'] for module in manifest['modules']) |
|
|
|
removed_modules = library_modules - modules |
|
|
|
if removed_modules: |
|
|
|
raise Exception(f"Plugin {slug} removes modules {", ".join(removed_modules)}") |
|
|
|
|
|
|
|
# Source dir |
|
|
|
if os.path.isdir(plugin_path): |
|
|
|
# Check library manifest version |
|
|
|
if library_manifest and version == library_manifest['version']: |
|
|
|
# Build only if library manifest is out of date |
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
continue |
|
|
|
else: |
|
|
|
# Build Mac ARM64 only if library manifest is up to date |
|
|
|
if BUILD_MAC_ARM64_ONLY: |
|
|
|
continue |
|
|
|
|
|
|
|
# Build repo |
|
|
|
if BUILD_MAC_ARM64_ONLY: |
|
|
|
if package_exists(slug, version, 'mac', 'arm64'): |
|
|
|
print(f"{slug} {version} Mac ARM64 package already exists") |
|
|
|
continue |
|
|
|
if not package_exists(slug, version, 'mac', 'x64'): |
|
|
|
print(f"{slug} {version} Mac x64 doesn't exist, not building") |
|
|
|
# Ensure that version is higher than library version |
|
|
|
if library_manifest: |
|
|
|
# if not version_less(library_manifest['version'], version): |
|
|
|
if library_manifest['version'] == version: |
|
|
|
continue |
|
|
|
|
|
|
|
print() |
|
|
@@ -164,17 +188,16 @@ for plugin_path in plugin_paths: |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make plugin-build-clean') |
|
|
|
# Build repo for each arch |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-mac-arm64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-mac-x64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-win-x64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-lin-x64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-mac-x64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-win-x64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make -j2 plugin-build-lin-x64 PLUGIN_DIR="{plugin_path}"') |
|
|
|
# Copy package to packages dir |
|
|
|
common.system(f'cp -v "{TOOLCHAIN_DIR}"/plugin-build/* "{PACKAGES_DIR}"/') |
|
|
|
# Copy Mac ARM64 package to files dir for testing |
|
|
|
common.system(f'cp -v "{TOOLCHAIN_DIR}"/plugin-build/*-mac-arm64.vcvplugin "{FILES_DIR}"/') |
|
|
|
# Copy Mac packages to files dir for testing |
|
|
|
# common.system(f'cp -v "{TOOLCHAIN_DIR}"/plugin-build/*-mac-x64.vcvplugin "{FILES_DIR}"/') |
|
|
|
# common.system(f'cp -v "{TOOLCHAIN_DIR}"/plugin-build/*-mac-arm64.vcvplugin "{FILES_DIR}"/') |
|
|
|
# Install Linux package for testing |
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
common.system(f'cp -v "{TOOLCHAIN_DIR}"/plugin-build/*-lin-x64.vcvplugin "{PLUGIN_DIR}"/') |
|
|
|
common.system(f'cp -v "{TOOLCHAIN_DIR}"/plugin-build/*-lin-x64.vcvplugin "{PLUGIN_DIR}"/') |
|
|
|
except Exception as e: |
|
|
|
print(e) |
|
|
|
print(f"{slug} build failed") |
|
|
@@ -184,8 +207,7 @@ for plugin_path in plugin_paths: |
|
|
|
common.system(f'cd "{TOOLCHAIN_DIR}" && make plugin-build-clean') |
|
|
|
|
|
|
|
# Open plugin issue thread |
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
os.system(f"xdg-open 'https://github.com/VCVRack/library/issues?q=is%3Aissue+in%3Atitle+{slug}' &") |
|
|
|
os.system(f"xdg-open 'https://github.com/VCVRack/library/issues?q=is%3Aissue+sort%3Aupdated-desc+in%3Atitle+{slug}' &") |
|
|
|
|
|
|
|
# Plugin package |
|
|
|
elif plugin_ext == ".vcvplugin": |
|
|
@@ -200,34 +222,25 @@ for plugin_path in plugin_paths: |
|
|
|
package_filename = os.path.basename(plugin_path) |
|
|
|
common.system(f'touch "{PACKAGES_DIR}/{package_filename}"') |
|
|
|
# Copy Mac ARM64 package to files dir for testing |
|
|
|
if os_ == 'mac' and cpu == 'arm64': |
|
|
|
common.system(f'cp -v "{plugin_path}" "{FILES_DIR}"/') |
|
|
|
# if os_ == 'mac' and cpu == 'arm64': |
|
|
|
# common.system(f'cp -v "{plugin_path}" "{FILES_DIR}"/') |
|
|
|
# Install Linux package for testing |
|
|
|
if os_ == 'lin': |
|
|
|
common.system(f'cp "{plugin_path}" "{PLUGIN_DIR}/"') |
|
|
|
|
|
|
|
# Copy manifest |
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
with open(library_manifest_filename, "w") as f: |
|
|
|
json.dump(manifest, f, indent=" ") |
|
|
|
with open(library_manifest_filename, "w") as f: |
|
|
|
json.dump(manifest, f, indent=" ") |
|
|
|
|
|
|
|
if not BUILD_MAC_ARM64_ONLY: |
|
|
|
# Delete screenshot cache |
|
|
|
screenshots_dir = os.path.join(SCREENSHOTS_DIR, slug) |
|
|
|
common.system(f'rm -rf "{screenshots_dir}"') |
|
|
|
# Delete screenshot cache |
|
|
|
screenshots_dir = os.path.join(SCREENSHOTS_DIR, slug) |
|
|
|
common.system(f'rm -rf "{screenshots_dir}"') |
|
|
|
|
|
|
|
manifest_versions[slug] = version |
|
|
|
|
|
|
|
manifest_versions_str = ", ".join(map(lambda pair: pair[0] + " to " + pair[1], manifest_versions.items())) |
|
|
|
|
|
|
|
|
|
|
|
if BUILD_MAC_ARM64_ONLY: |
|
|
|
print() |
|
|
|
print(f"Test plugins on Mac ARM64 and press enter if approved: {manifest_versions_str}") |
|
|
|
input() |
|
|
|
common.system("cd ../packages && make upload") |
|
|
|
exit(0) |
|
|
|
|
|
|
|
if not manifest_versions: |
|
|
|
print("Nothing to build") |
|
|
|
exit(0) |
|
|
@@ -235,14 +248,14 @@ if not manifest_versions: |
|
|
|
update_cache.update() |
|
|
|
update_modulargrid.update() |
|
|
|
|
|
|
|
# Upload data |
|
|
|
|
|
|
|
# Test plugins |
|
|
|
print() |
|
|
|
print(f"Press enter to launch Rack and test the following packages: {manifest_versions_str}") |
|
|
|
input() |
|
|
|
try: |
|
|
|
common.system(f"cd {RACK_SYSTEM_DIR} && ./Rack") |
|
|
|
common.system(f"cd {RACK_USER_DIR} && grep 'warn' log.txt || true") |
|
|
|
common.system(f"cd {RACK_USER_DIR} && grep '\\bwarn|debug\\b' log.txt || true") |
|
|
|
except: |
|
|
|
print(f"Rack failed! Enter to continue if desired") |
|
|
|
|
|
|
@@ -256,18 +269,16 @@ except: |
|
|
|
print(f"Rack failed! Enter to continue if desired") |
|
|
|
common.system("cd ../screenshots && make -j$(nproc)") |
|
|
|
|
|
|
|
# Commit git repo |
|
|
|
common.system("git add manifests") |
|
|
|
common.system("git add manifests-cache.json ModularGrid-VCVLibrary.json") |
|
|
|
common.system(f"git commit -m 'Update manifest {manifest_versions_str}'") |
|
|
|
|
|
|
|
# Upload packages |
|
|
|
common.system("cd ../packages && make upload") |
|
|
|
|
|
|
|
# Upload screenshots |
|
|
|
common.system("cd ../screenshots && make upload") |
|
|
|
|
|
|
|
# Push git repo |
|
|
|
# Commit git repo |
|
|
|
common.system("git add manifests") |
|
|
|
common.system("git add manifests-cache.json ModularGrid-VCVLibrary.json") |
|
|
|
common.system(f"git commit -m 'Update manifest {manifest_versions_str}'") |
|
|
|
common.system("git push") |
|
|
|
|
|
|
|
print() |
|
|
|