Added options for setting config and ba_root paths

This commit is contained in:
Eric Froemling 2021-02-24 15:38:00 -06:00
parent 6c515672ad
commit ca5f45f3a2
No known key found for this signature in database
GPG Key ID: 89C93F0F8D6D5A98
6 changed files with 136 additions and 59 deletions

View File

@ -3932,26 +3932,26 @@
"assets/build/windows/Win32/ucrtbased.dll": "https://files.ballistica.net/cache/ba1/b5/85/f8b6d0558ddb87267f34254b1450", "assets/build/windows/Win32/ucrtbased.dll": "https://files.ballistica.net/cache/ba1/b5/85/f8b6d0558ddb87267f34254b1450",
"assets/build/windows/Win32/vc_redist.x86.exe": "https://files.ballistica.net/cache/ba1/1c/e1/4a1a2eddda2f4aebd5f8b64ab08e", "assets/build/windows/Win32/vc_redist.x86.exe": "https://files.ballistica.net/cache/ba1/1c/e1/4a1a2eddda2f4aebd5f8b64ab08e",
"assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f", "assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f",
"build/prefab/full/linux_arm64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/b0/41/1773777bea8220fb532b02207bd8", "build/prefab/full/linux_arm64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/84/a1/420d282610456205a0c7317ef587",
"build/prefab/full/linux_arm64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/7a/aa/7db23036581440bd28d245f7b6b0", "build/prefab/full/linux_arm64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/a9/63/eabb9fe980c4686ff48c62dc3215",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e2/ef/7254a413f4bb7618b9d7898d6a7f", "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4c/3f/7bc2491bcb678a964043ba7d25dd",
"build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7b/64/71ddea075764913a51b13c331d88", "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ee/12/8addc0aa42af13c2e2903b1f2cb1",
"build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ee/bf/5aa9ef09d3adf56836c0370e587e", "build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/00/11/ca95947488543f6e9fcb6ff4a122",
"build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/91/b6/f323561fb316ba15a3f5d7d45858", "build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/d8/d9/e4f7c8454210a1bedef3416d1768",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/bc/a6/88edc1066bc69f967a924e84fc5b", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/f7/b9/21faa11f5b965f55e548b6485b2c",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/96/b6/2ba6d3b0ef4dff3a0a1e1fb7b5da", "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ac/aa/b1641c07d4539f673445467ccef9",
"build/prefab/full/mac_arm64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/4b/af/8a1214609ee5f0d207905e384394", "build/prefab/full/mac_arm64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ac/a3/ff8cbd9b0bae767ad4809360e21a",
"build/prefab/full/mac_arm64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/2a/90/f7532756dd8a21f1a07c1ed12ccc", "build/prefab/full/mac_arm64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/46/ee/4c5599f4b9aef54eff51b7702409",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/86/86/a0506a90f1a5845843affb842e09", "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/db/ce/aec9518eee7bcd7fdc8ca80b1d76",
"build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a3/2b/3127e1a79e6e3aece248ef41ec8c", "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d8/dc/6b1c63cb28db2ff64554526d5311",
"build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ae/31/3542167c07e9abd5f1df07d08181", "build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a4/fa/8613c74733350c3cd26945823ed0",
"build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/94/5a/e3b3c60976be78d1728660c638b3", "build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/10/65/62b7f0eb542a037f54ea486be204",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7a/b2/ca6ad8142f08e81d63d65f52e0ce", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/89/6e/569b32f6c9401b17ceed5327257f",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c9/62/4b17a374c663c730e091a1695911", "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/99/dc/5a55ebdf3e5541c74a59f68f3f65",
"build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/75/11/0bbb84a7d2f285e97d5f6e8b8c5e", "build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/9c/58/1be66154a04eab5f00f6aa92d165",
"build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d9/89/1d495c48545be16152915c5933ab", "build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/bd/89/b6210c67baf254ab314317973b5e",
"build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/77/71/570b0118c6e2fe3603b9832a2991", "build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/93/41/617d1b3436173551780992842b6e",
"build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/29/dd/2646ab0b39c07c541ad80a7b4727", "build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/3e/c5/d5a2841dc15918206f8c19b1ce02",
"build/prefab/lib/linux_arm64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4c/bf/393694ea67f3d590dd2706c9955e", "build/prefab/lib/linux_arm64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4c/bf/393694ea67f3d590dd2706c9955e",
"build/prefab/lib/linux_arm64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/78/cb/bb9ae4f896f862074057c8e36e1d", "build/prefab/lib/linux_arm64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/78/cb/bb9ae4f896f862074057c8e36e1d",
"build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ae/bd/39d7b885f7f01e81d0e96f0f85ce", "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ae/bd/39d7b885f7f01e81d0e96f0f85ce",
@ -3960,12 +3960,12 @@
"build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/52/d9/563a6949d2c4db5a915c54460fbc", "build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/52/d9/563a6949d2c4db5a915c54460fbc",
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d0/6a/42fe8d2e34f95e1b3282e8422344", "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d0/6a/42fe8d2e34f95e1b3282e8422344",
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/50/cf/bad44b07a4022aee3001002086b5", "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/50/cf/bad44b07a4022aee3001002086b5",
"build/prefab/lib/mac_arm64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/84/d0/d46d2ce177f1ce6bc0304ce673c9", "build/prefab/lib/mac_arm64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fa/8a/a6aedb3b2c74c055005792710be8",
"build/prefab/lib/mac_arm64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/09/b7/e094fdfa54fa38751f0caa1c9e68", "build/prefab/lib/mac_arm64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4b/97/0b6acf3397515a5fb997b3a81e3d",
"build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/69/6f/c99b2718ac104de79337e35414f7", "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ee/b0/81fbb6e8996205a16e3d8e912000",
"build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d7/76/eecf9cc91f73e3cae73291215216", "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/64/68/e668be0a349bcdd51efe35703b8a",
"build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/77/0f/0ef7575b11fd70a1d897ab261813", "build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4b/06/3e80d9b9efa82e28b77d895562b0",
"build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/45/62/8267446a6c71bcc34234ec5e119a", "build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/34/b1/942b8c6206051dbaa15f225bc8d9",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/78/9b/a5a29e1baa7d5d9d2eaabc9412f9", "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e1/a6/2b3a07d7afe0215ab5843a83809f",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ab/67/4c447ca41efd957bce227a34887c" "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/48/5d/e8c8deb5b42593c805fa9c181c0c"
} }

View File

@ -9,6 +9,8 @@
- Added ba.clipboard_* functions for copying and pasting text on supported platforms. - Added ba.clipboard_* functions for copying and pasting text on supported platforms.
- Implemented clipboard functionality on SDL based builds (such as prefab). - Implemented clipboard functionality on SDL based builds (such as prefab).
- Fixed an issue where click locations on scaled text fields could be incorrectly calculated. - Fixed an issue where click locations on scaled text fields could be incorrectly calculated.
- Server-wrapper improvements allowing config path and ba_root path to be passed explicitly.
- Binary -cfgdir option now properly allows any path, not just './ba_root'.
### 1.5.29 (20246) ### 1.5.29 (20246)
- Exposed ba method/class initing in public C++ layer. - Exposed ba method/class initing in public C++ layer.

View File

@ -10,6 +10,7 @@ import signal
import subprocess import subprocess
import sys import sys
import time import time
from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from threading import Lock, Thread, current_thread from threading import Lock, Thread, current_thread
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
@ -36,7 +37,7 @@ VERSION_STR = '1.1.2'
# Version history: # Version history:
# 1.1.2: # 1.1.2:
# Now accepts config path as sole optional argument. # Added args for setting config path and ba_root path
# 1.1.1: # 1.1.1:
# Switched config reading to use efro.dataclasses.dataclass_from_dict() # Switched config reading to use efro.dataclasses.dataclass_from_dict()
# 1.1.0: # 1.1.0:
@ -58,8 +59,10 @@ class ServerManagerApp:
managing BallisticaCore operating in server mode. managing BallisticaCore operating in server mode.
""" """
def __init__(self, config_path: Optional[str] = None) -> None: def __init__(self, args: Args) -> None:
self._config_path = config_path self._config_path = args.config_path
self._ba_root_path = (args.ba_root_path if args.ba_root_path
is not None else os.path.abspath('dist/ba_root'))
try: try:
self._config = self._load_config() self._config = self._load_config()
except Exception as exc: except Exception as exc:
@ -336,8 +339,9 @@ class ServerManagerApp:
print(f'{Clr.CYN}Launching server subprocess...{Clr.RST}') print(f'{Clr.CYN}Launching server subprocess...{Clr.RST}')
binary_name = ('ballisticacore_headless.exe' binary_name = ('ballisticacore_headless.exe'
if os.name == 'nt' else './ballisticacore_headless') if os.name == 'nt' else './ballisticacore_headless')
assert self._ba_root_path is not None
self._subprocess = subprocess.Popen( self._subprocess = subprocess.Popen(
[binary_name, '-cfgdir', 'ba_root'], [binary_name, '-cfgdir', self._ba_root_path],
stdin=subprocess.PIPE, stdin=subprocess.PIPE,
cwd='dist') cwd='dist')
@ -363,9 +367,12 @@ class ServerManagerApp:
def _prep_subprocess_environment(self) -> None: def _prep_subprocess_environment(self) -> None:
"""Write files that must exist at process launch.""" """Write files that must exist at process launch."""
os.makedirs('dist/ba_root', exist_ok=True)
if os.path.exists('dist/ba_root/config.json'): assert self._ba_root_path is not None
with open('dist/ba_root/config.json') as infile: os.makedirs(self._ba_root_path, exist_ok=True)
cfgpath = os.path.join(self._ba_root_path, 'config.json')
if os.path.exists(cfgpath):
with open(cfgpath) as infile:
bincfg = json.loads(infile.read()) bincfg = json.loads(infile.read())
else: else:
bincfg = {} bincfg = {}
@ -376,7 +383,7 @@ class ServerManagerApp:
bincfg['Auto Balance Teams'] = self._config.auto_balance_teams bincfg['Auto Balance Teams'] = self._config.auto_balance_teams
bincfg['Show Tutorial'] = False bincfg['Show Tutorial'] = False
bincfg['Idle Exit Minutes'] = self._config.idle_exit_minutes bincfg['Idle Exit Minutes'] = self._config.idle_exit_minutes
with open('dist/ba_root/config.json', 'w') as outfile: with open(cfgpath, 'w') as outfile:
outfile.write(json.dumps(bincfg)) outfile.write(json.dumps(bincfg))
def _enqueue_server_command(self, command: ServerCommand) -> None: def _enqueue_server_command(self, command: ServerCommand) -> None:
@ -544,22 +551,61 @@ def _parse_args() -> Optional[str]:
return None return None
@dataclass
class Args:
"""Wraps arguments that can be passed from the command line."""
config_path: Optional[str] = None
ba_root_path: Optional[str] = None
@classmethod
def from_command_line(cls) -> Args:
"""Parse command line args and fill ourself out."""
args = Args()
i = 1
argc = len(sys.argv)
while i < argc:
arg = sys.argv[i]
if arg == '--config':
if i + 1 >= argc:
raise CleanError('Expected a config path as next arg.')
path = sys.argv[i + 1]
if not os.path.exists(path):
raise CleanError(
f"Supplied path does not exist: '{path}'.")
args.config_path = os.path.abspath(path)
i += 2
elif arg == '--root':
if i + 1 >= argc:
raise CleanError('Expected a path as next arg.')
path = sys.argv[i + 1]
# Note: this one doesn't have to exist.
args.ba_root_path = os.path.abspath(path)
i += 2
else:
raise CleanError(f"Invalid arg: '{arg}'.")
return args
def main() -> None: def main() -> None:
"""Run a BallisticaCore server manager in interactive mode.""" """Run a BallisticaCore server manager in interactive mode."""
try: try:
# User can optionally supply a config path. # Note: we need to parse args before we chdir since we might be
# (need to get this before we chdir). # dealing with relative paths.
config_path = _parse_args() args = Args.from_command_line()
# ServerManager expects cwd to be the server dir (containing # ServerManager expects cwd to be the server dir (containing
# dist/, config.yaml, etc.) # dist/, config.yaml, etc.) Let's change our working directory to
# Let's change our working directory to the location of this file # the location of this file so we can run this script from anywhere
# so we can run this script from anywhere and it'll work. # and it'll work.
os.chdir(os.path.abspath(os.path.dirname(__file__))) os.chdir(os.path.abspath(os.path.dirname(__file__)))
ServerManagerApp(config_path=config_path).run_interactive() ServerManagerApp(args).run_interactive()
except CleanError as exc: except CleanError as exc:
# For clean errors, do a simple print and fail; no tracebacks/etc. # For clean errors, do a simple print and fail; no tracebacks/etc.
# Any others will bubble up and give us the usual mess.
exc.pretty_print() exc.pretty_print()
sys.exit(1) sys.exit(1)

View File

@ -21,7 +21,7 @@
namespace ballistica { namespace ballistica {
// These are set automatically via script; don't change here. // These are set automatically via script; don't change here.
const int kAppBuildNumber = 20300; const int kAppBuildNumber = 20303;
const char* kAppVersion = "1.6.0"; const char* kAppVersion = "1.6.0";
// Our standalone globals. // Our standalone globals.

View File

@ -572,25 +572,22 @@ static void HandleArgs(int argc, char** argv) {
if (i + 1 < argc) { if (i + 1 < argc) {
g_app_globals->user_config_dir = argv[i + 1]; g_app_globals->user_config_dir = argv[i + 1];
// Need to remove this limitation!!!
// Don't remember why it's here; something about not being able to
// create nested directories properly in windows. But perhaps we
// can just error if a dir is provided that's invalid.
if (g_app_globals->user_config_dir != "ba_root") {
printf("%s", "ERROR: -cfgdir currently has to be 'ba_root'\n");
fflush(stdout);
exit(-1);
}
// Need to convert this to an abs path since we chdir soon. // Need to convert this to an abs path since we chdir soon.
std::string buffer = g_platform->GetCWD(); bool success =
if (buffer.empty()) { g_platform->AbsPath(argv[i + 1], &g_app_globals->user_config_dir);
printf("%s", "ERROR: unable to get cwd for cfgdir setup\n"); if (!success) {
// This can fail if the path doesn't exist.
if (!g_platform->FilePathExists(argv[i + 1])) {
printf("ERROR: provided config dir does not exist: '%s'\n",
argv[i + 1]);
} else {
printf(
"ERROR: unable to determine absolute path of config dir '%s'\n",
argv[i + 1]);
}
fflush(stdout); fflush(stdout);
exit(-1); exit(-1);
} }
g_app_globals->user_config_dir =
std::string(buffer) + BA_DIRSLASH + g_app_globals->user_config_dir;
} else { } else {
Log("ERROR: expected arg after -cfgdir"); Log("ERROR: expected arg after -cfgdir");
exit(-1); exit(-1);
@ -1150,6 +1147,30 @@ void Platform::Unlink(const char* path) {
#endif #endif
} }
auto Platform::AbsPath(const std::string& path, std::string* outpath) -> bool {
// Ensure all implementations fail if the file does not exist.
if (!FilePathExists(path)) {
return false;
}
return DoAbsPath(path, outpath);
}
auto Platform::DoAbsPath(const std::string& path, std::string* outpath)
-> bool {
// This covers all but windows.
#if BA_OSTYPE_WINDOWS
throw Exception();
#else
char buffer[PATH_MAX + 1];
char* ptr = realpath(path.c_str(), buffer);
if (ptr) {
*outpath = ptr;
return true;
}
return false;
#endif
}
auto Platform::IsEventPushMode() -> bool { return false; } auto Platform::IsEventPushMode() -> bool { return false; }
auto Platform::GetDisplayResolution(int* x, int* y) -> bool { return false; } auto Platform::GetDisplayResolution(int* x, int* y) -> bool { return false; }

View File

@ -105,6 +105,10 @@ class Platform {
// Unlink a file. // Unlink a file.
virtual auto Unlink(const char* path) -> void; virtual auto Unlink(const char* path) -> void;
/// Return the absolute path for the provided path. Note that this requires
/// the path to already exist.
auto AbsPath(const std::string& path, std::string* outpath) -> bool;
#pragma mark CLIPBOARD --------------------------------------------------------- #pragma mark CLIPBOARD ---------------------------------------------------------
/// Return whether clipboard operations are supported at all. /// Return whether clipboard operations are supported at all.
@ -494,6 +498,10 @@ class Platform {
// Should not except if it already exists or if quiet is true. // Should not except if it already exists or if quiet is true.
virtual void DoMakeDir(const std::string& dir, bool quiet); virtual void DoMakeDir(const std::string& dir, bool quiet);
// Attempt to actually get an abs path. This will only be called if
// the path is valid and exists.
virtual auto DoAbsPath(const std::string& path, std::string* outpath) -> bool;
// Calc the user scripts dir path for this platform. // Calc the user scripts dir path for this platform.
// This will be called once and the path cached. // This will be called once and the path cached.
virtual auto DoGetUserPythonDirectory() -> std::string; virtual auto DoGetUserPythonDirectory() -> std::string;