| @@ -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() | |||