bacloud improvements

This commit is contained in:
Eric 2024-06-26 15:00:43 -07:00
parent 93b1de30af
commit cc55afd1db
No known key found for this signature in database
GPG Key ID: 89C93F0F8D6D5A98
13 changed files with 150 additions and 61 deletions

56
.efrocachemap generated
View File

@ -4038,26 +4038,26 @@
"build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1",
"build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae",
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "d9afde0c1cc61b1fa27aed723afd9ede",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "42fc71b128260196094cc517deba76db",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "764f0b4661e0c92d5c376356f5fa8825",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "a6ae3a8df85d6b245a944164c437471b",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "b5a068b26fc52668bbb4f79eba5c047d",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "b3636e3fb8e268ced15daa2a2256ee44",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "d5b503fe1aa2681724581e02ea049f73",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "d465f04ba2c8fa98624db8cf38e9177e",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "d0b8c22e04f83f712b0033b427282eea",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "03e09fdffcbcb6a0ea967e81c3b0c7c9",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "932a3acd7abd13074eebfc03e0e7d56c",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "bbe5aa04abb57add770af26fc101d488",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "3c33079f35aff14e62117f30f297b2c5",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "36567f3012c97261d54ddff9d682e4da",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "5c30ad4693e19c3f4261711e38b6b5a5",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "ec40d7abbe4d0ad4cc35667fb9685784",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "cb685b901201a75b094c1f5ac655155c",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "0d2c6f859dc14ee5eb5267e06128e090",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "df7849c6f6bee1c20ce74cb46fa591b2",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "069841aea1eb622b693c98eed7482a35",
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "a92a8552dc768a124023921e2d7c8e4b",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "4aed94d02131e7387238efb8e8c88517",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "8b95dbba57e6453070609a8f7c05284e",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "36961e7faa9e949ef714136f6f72ed9d",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "4b96f8141e053abef2796f6970cca7bf",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "7d2542c6f789099c37f1c36a004c0532",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "2b35512a02c77933cc9d1988761e9907",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "30fe1c1ac3a70695001a21ceb7b137ec",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "633e84b17f8e564c904dc85f1b4fa657",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "07cd831fee262def54be88ce219207c8",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "ee638b2db04ebcf3889c5cb6ce70c153",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "360cedd219db792e8910544b028b76cf",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "6338e5613990e5df7592109a77f2ce66",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "d29b1531d1610c5815071c0f5fd596e9",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "6656b4b2bcbc87f94cf573ff9c34648e",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "8153ea67d0e0bdeb852e656a9ff89505",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "4a5f1dd454ff6e2215d63e24b871b226",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "4a6ba058616fddd1d2f3045e7eba5fef",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "79d13825d258fb365b99e1045cff2607",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "7fcfa30b3aab3ce4c31287b7cd15aeef",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "f231b10895bdcb542de87b887ca181fd",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "ae936a119668ede7b36f38c8672f4bf8",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "f231b10895bdcb542de87b887ca181fd",
@ -4074,14 +4074,14 @@
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "efffc4f330e77530accd9a9f82840a6c",
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "c20363fe2af3d54e666b1c8ee67f6b76",
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "efffc4f330e77530accd9a9f82840a6c",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "a75854a744d9f2abe9027fe03ea4d458",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "4581a1ce0934b7b3ea5bf8a46823a761",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "99ee35add584cbdeead0d845a637ad18",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "83ec9375d7c1bc790cc3e784488960b0",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "7838f2899be0eedeb352a9f31bd9f860",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "c27c37020a0c0b29792435f05a8c19b6",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "40326b4848a648ece17d2f2f50e2cc27",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "281f67c8179e1f5d7fd1445ed4069699",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "632d0e121545353cc40577b765c156f9",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "ffe84e846b294dc8517d9af555dad70f",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "ef1743ca2035c525e8884129d69fa582",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "0d215e98b6440a823809d3d582ae542f",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "359f0e344c2f9d6409b675c2ab600df4",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "7467cc9095607857b21f5f55518874e0",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "2680d5d44629d8a19857d1c6b87a6fd2",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "bed37e7b4e1dfcdd31789db7730a388e",
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
"src/assets/ba_data/python/babase/_mgen/enums.py": "5548f407d97e380069f6c596c4e36cd7",
"src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d",

View File

@ -1,5 +1,8 @@
### 1.7.36 (build 21895, api 8, 2024-06-26)
### 1.7.36 (build 21896, api 8, 2024-06-26)
- `bacloud workspace put` is now a bit smarter; you can now do things like
`bacloud workspace put .` and it will work. Previously such cases required
explicitly passing the workspace name as a second argument.
### 1.7.35 (build 21889, api 8, 2024-06-20)
- Fixed an issue where the engine would block at exit on some version of Linux
until Ctrl-D was pressed in the calling terminal.

View File

@ -1,4 +1,5 @@
{
"assets": "a-0.assets1.dev",
"code_source_dirs": [
"src/ballistica"
],

View File

@ -7499,6 +7499,21 @@ assets: assets-cmake assets-win-Win32
clean:
@rm -rf $(BUILD_DIR)
# Modern AssetPackage bits.
# Extract the asset-package version from project-config and stuff it into
# a 'resolved' file. If we are using dev version, clear the file which
# will force an explicit check each time through.
$(PROJ_DIR)/.cache/asset_package_resolved: $(PROJ_DIR)/config/projectconfig.json
@$(PCOMMAND) asset_package_resolve $@
$(PROJ_DIR)/.cache/assetmanifests/cmake-debug.manifest: \
$(PROJ_DIR)/.cache/asset_package_resolved
@$(PCOMMAND) asset_package_fetch $(PROJ_DIR)/.cache/asset_package_resolved \
cmake-debug $@
foo: $(PROJ_DIR)/.cache/assetmanifests/cmake-debug.manifest
# These targets don't correspond to actual files; make sure make knows that.
.PHONY: cmake win mac ios android audio audio-clean fonts fonts-clean data \
data-clean meshes meshes-clean textures-clean scripts scripts-clean \

View File

@ -52,7 +52,7 @@ if TYPE_CHECKING:
# Build number and version of the ballistica binary we expect to be
# using.
TARGET_BALLISTICA_BUILD = 21895
TARGET_BALLISTICA_BUILD = 21896
TARGET_BALLISTICA_VERSION = '1.7.36'

View File

@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int {
namespace ballistica {
// These are set automatically via script; don't modify them here.
const int kEngineBuildNumber = 21895;
const int kEngineBuildNumber = 21896;
const char* kEngineVersion = "1.7.36";
const int kEngineApiVersion = 8;

View File

@ -14,7 +14,7 @@ if TYPE_CHECKING:
# Version is sent to the master-server with all commands. Can be incremented
# if we need to change behavior server-side to go along with client changes.
BACLOUD_VERSION = 8
BACLOUD_VERSION = 9
@ioprepped

View File

@ -94,24 +94,10 @@ class App:
):
raise CleanError('Unable to locate project directory.')
# Also run project env checks so we can hopefully inform the user
# of missing Python modules/etc. instead of just failing cryptically.
try:
subprocess.run(
['make', '--quiet', 'env'],
check=True,
cwd=self._project_root,
)
except subprocess.CalledProcessError as exc:
raise CleanError(
'"make env" check failed. '
'Install missing requirements and try again.'
) from exc
self._load_state()
# Simply pass all args to the server and let it do the thing.
self.run_interactive_command(sys.argv[1:])
self.run_interactive_command(cwd=os.getcwd(), args=sys.argv[1:])
self._save_state()
@ -287,8 +273,13 @@ class App:
os.makedirs(dirname, exist_ok=True)
data_zipped = base64.b64decode(fdata)
data = zlib.decompress(data_zipped)
with open(fname, 'wb') as outfile:
# Write to tmp files first and then move into place. This
# way crashes are less likely to lead to corrupt data.
fnametmp = f'{fname}.tmp'
with open(fnametmp, 'wb') as outfile:
outfile.write(data)
os.rename(fnametmp, fname)
def _handle_dir_prune_empty(self, prunedir: str) -> None:
"""Handle pruning empty directories."""
@ -334,11 +325,14 @@ class App:
print(prompt, end='', flush=True)
self._end_command_args['input'] = input()
def run_interactive_command(self, args: list[str]) -> None:
def run_interactive_command(self, cwd: str, args: list[str]) -> None:
"""Run a single user command to completion."""
# pylint: disable=too-many-branches
nextcall: tuple[str, dict] | None = ('_interactive', {'a': args})
nextcall: tuple[str, dict] | None = (
'_interactive',
{'c': cwd, 'a': args},
)
# Now talk to the server in a loop until there's nothing left to do.
while nextcall is not None:

View File

@ -142,6 +142,8 @@ from batools.pcommands2 import (
wsl_path_to_win,
wsl_build_check_win_drive,
get_modern_make,
asset_package_resolve,
asset_package_fetch,
)
# pylint: enable=unused-import

View File

@ -602,3 +602,75 @@ def get_modern_make() -> None:
print('gmake')
else:
print('make')
def asset_package_resolve() -> None:
"""Resolve exact asset-package-version we'll use (if any)."""
import os
from efro.error import CleanError
from efrotools.project import getprojectconfig
pcommand.disallow_in_batch()
args = pcommand.get_args()
if len(args) != 1:
raise CleanError('Expected 1 arg.')
resolve_path = args[0]
apversion = getprojectconfig(pcommand.PROJROOT).get('assets')
if apversion is None:
raise CleanError("No 'assets' value found in projectconfig.")
splits = apversion.split('.')
if len(splits) != 3:
raise CleanError(
f"'{apversion}' is not a valid asset-package-version id."
)
# 'dev' versions are a special case; in that case we don't create
# a resolve file, which effectively causes our manifest fetch logic
# to run each time.
if splits[2] == 'dev':
if os.path.exists(resolve_path):
os.unlink(resolve_path)
else:
with open(resolve_path, 'w', encoding='utf-8') as outfile:
outfile.write(apversion)
def asset_package_fetch() -> None:
"""Build/fetch an asset-package-manifest."""
import os
from efro.error import CleanError
from efrotools.project import getprojectconfig
pcommand.disallow_in_batch()
args = pcommand.get_args()
if len(args) != 3:
raise CleanError('Expected 3 args.')
resolve_path, _buildtype, outpath = args
# If resolve path exists, it is the exact asset-package-version we
# should use.
apversion: str | None
if os.path.exists(resolve_path):
with open(resolve_path, encoding='utf-8') as infile:
apversion = infile.read()
else:
# If there's no resolve file, look up the value directly from
# project-config. Generally this means it's set to a dev
# version.
apversion = getprojectconfig(pcommand.PROJROOT).get('assets')
if not isinstance(apversion, str):
raise CleanError(
f'Expected a string asset-package-version; got {type(apversion)}.'
)
print('WOULD GO FORWARD WITH', apversion)
os.makedirs(os.path.dirname(outpath), exist_ok=True)
with open(outpath, 'w', encoding='utf-8') as outfile:
outfile.write('foo')

View File

@ -17,20 +17,22 @@ LOCK_DIR_PATH = '.cache/buildlocks'
class BuildLock:
"""Tries to ensure a build is not getting stomped on/etc."""
def __init__(self, name: str) -> None:
def __init__(self, name: str, projroot: str) -> None:
self.name = name
self.projroot = projroot
if '/' in name or '\\' in name:
raise ValueError(f"Illegal BuildLock name: '{name}'.")
self.lockpath = os.path.join(LOCK_DIR_PATH, name)
self.lockpath = os.path.join(self.projroot, LOCK_DIR_PATH, name)
def __enter__(self) -> None:
if not os.path.exists(LOCK_DIR_PATH):
os.makedirs(LOCK_DIR_PATH, exist_ok=True)
lockdir = os.path.dirname(self.lockpath)
if not os.path.exists(lockdir):
os.makedirs(lockdir, exist_ok=True)
# Note: we aren't doing anything super accurate/atomic here. This
# is more intended as a gross check to make noise on clearly broken
# build logic; it isn't important that it catch every corner case
# perfectly.
# Note: we aren't doing anything super accurate/atomic here.
# This is more intended as a gross check to make noise on
# clearly broken build logic; it isn't important that it catch
# every corner case perfectly.
if os.path.exists(self.lockpath):
raise RuntimeError(
f"Build-lock: lock '{self.name}' exists."

View File

@ -106,7 +106,7 @@ class LazyBuildContext:
# sure that only one build for some given purpose is being run at
# once.
if self.buildlockname is not None:
with BuildLock(self.buildlockname):
with BuildLock(self.buildlockname, projroot='.'):
self._run_commands_and_update_target()
else:
self._run_commands_and_update_target()

View File

@ -31,7 +31,7 @@ def with_build_lock() -> None:
raise CleanError(
'Expected one lock-name arg and at least one command arg'
)
with BuildLock(args[0]):
with BuildLock(args[0], projroot=str(pcommand.PROJROOT)):
subprocess.run(' '.join(args[1:]), check=True, shell=True)