Create macOS bundle for simplified installation #58

This commit is contained in:
2025-08-07 21:16:54 -05:00
parent 666b3f2dc5
commit 28800625e4
6 changed files with 97 additions and 44 deletions

19
repertory/Info.plist.in Normal file
View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>@PROJECT_NAME@</string>
<key>CFBundleIdentifier</key>
<string>com.fifthgrid.blockstorage.@PROJECT_NAME@</string>
<key>CFBundleName</key>
<string>@PROJECT_NAME@</string>
<key>CFBundleVersion</key>
<string>@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@-@PROJECT_RELEASE_ITER@_@PROJECT_GIT_REV@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSUIElement</key>
<true/>
</dict>
</plist>

View File

@@ -49,12 +49,22 @@ auto main(int argc, char **argv) -> int {
std::ranges::copy(args_span, std::back_inserter(args));
}
int ret{0};
if (argc == 1) {
#if defined(__APPLE__)
args.push_back("-ui");
#else // !defined(__APPLE__)
args.push_back("-h");
#endif // defined(__APPLE__)
}
int ret{0};
if (utils::cli::has_option(args, utils::cli::options::ui_option)) {
if (utils::cli::has_option(args, utils::cli::options::help_option)) {
cli::actions::help<repertory_drive>(args);
} else if (utils::cli::has_option(args,
utils::cli::options::version_option)) {
cli::actions::version<repertory_drive>(args);
} else if (utils::cli::has_option(args, utils::cli::options::ui_option)) {
ui::mgmt_app_config config{
utils::cli::has_option(args, utils::cli::options::hidden_option),
utils::cli::has_option(args, utils::cli::options::launch_only_option),
@@ -71,7 +81,11 @@ auto main(int argc, char **argv) -> int {
ret = static_cast<std::int32_t>(exit_code::ui_failed);
} else {
httplib::Server server;
#if defined(__APPLE__)
if (not server.set_mount_point("/ui", "../Resources/web")) {
#else // !defined(__APPLE__)
if (not server.set_mount_point("/ui", "./web")) {
#endif // defined(__APPLE__)
ret = static_cast<std::int32_t>(exit_code::ui_failed);
} else {
ui::handlers handlers(&config, &server);
@@ -133,8 +147,7 @@ auto main(int argc, char **argv) -> int {
}
}
}
} else if ((prov == provider_type::s3) || (prov == provider_type::sia) ||
(prov == provider_type::encrypt)) {
} else {
std::string data;
res = utils::cli::parse_string_option(
args, utils::cli::options::name_option, data);
@@ -160,32 +173,25 @@ auto main(int argc, char **argv) -> int {
int mount_result{};
if (res == exit_code::success) {
if (utils::cli::has_option(args, utils::cli::options::help_option)) {
cli::actions::help<repertory_drive>(args);
} else if (utils::cli::has_option(args,
utils::cli::options::version_option)) {
cli::actions::version<repertory_drive>(args);
} else {
res = exit_code::option_not_found;
for (std::size_t idx = 0U;
(res == exit_code::option_not_found) &&
(idx < utils::cli::options::option_list.size());
idx++) {
try {
res = cli::actions::perform_action(
utils::cli::options::option_list[idx], args, data_directory,
prov, unique_id, user, password);
} catch (const std::exception &ex) {
res = exit_code::exception;
} catch (...) {
res = exit_code::exception;
}
res = exit_code::option_not_found;
for (std::size_t idx = 0U;
(res == exit_code::option_not_found) &&
(idx < utils::cli::options::option_list.size());
idx++) {
try {
res = cli::actions::perform_action(
utils::cli::options::option_list[idx], args, data_directory, prov,
unique_id, user, password);
} catch (const std::exception &ex) {
res = exit_code::exception;
} catch (...) {
res = exit_code::exception;
}
}
if (res == exit_code::option_not_found) {
res = cli::actions::mount(args, data_directory, mount_result, prov,
remote_host, remote_port, unique_id);
}
if (res == exit_code::option_not_found) {
res = cli::actions::mount(args, data_directory, mount_result, prov,
remote_host, remote_port, unique_id);
}
}