From a0a5ca339037a7f2b3a2660fbc5bc3705360423f Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Fri, 18 Oct 2024 07:36:52 -0500 Subject: [PATCH] refactor --- README.md | 64 +++++++++++++++++++++++----- support/src/utils/file_directory.cpp | 12 ++++-- support/src/utils/file_file.cpp | 32 +++++++++++--- 3 files changed, 87 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index fdb3ae49..41b1e5e3 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ on Windows. * Optimized for [Plex Media Server](https://www.plex.tv/) * Single application to mount AWS S3 and/or Sia -* Only 1 Sia mount and 1 S3 mount (per bucket) per user is supported. * Remote mounting of Repertory instances on Linux ~~, OS X~~ and Windows * Securely share your mounts over TCP/IP (`XChaCha20-Poly1305` stream cipher) * Cross-platform support (Linux 64-bit, Linux arm64/aarch64, ~~OS X,~~ Windows 64-bit) @@ -29,26 +28,69 @@ on Windows. * ~~OS X Mojave and above~~ * Windows 64-bit 10, 11 +## Usage + +### Notable Options + +* `-dc` + * Display mount configuration. + * For Sia, `--name` is optional + * For S3, the `-s3` option is required along with `--name` +* `--help` + * Display all mount utility options. +* `--name, -na [name]` + * The `--name` option can be set to any valid value allowed as a file name for your filesystem. + * For Sia, the bucket name will be set to the same value if it is empty in the configuration file. + * If the `--name` option is not specified, `default` will be used. + * For S3, the `--name` option is required and does not affect the bucket name. +* `-set SiaConfig.Bucket` + * Set Sia bucket name for the mount. + * Can be used in combination with `--name` to target a unique configuration. +* `-set S3Config.Bucket` + * S3 bucket name for the mount. + * Must be used in combination with `--name` to target a unique configuration. + * Must be used in combination with `-s3`. + +### Sia + +* Linux + * `repertory /mnt/location` + * `repertory --name default /mnt/location` +* Windows + * `repertory.exe t:` + * `repertory.exe --name default t:` + +### S3 + +* Linux + * `repertory --name storj -s3 /mnt/location` +* Windows + * `repertory.exe --name storj -s3 t:` + ## Compiling * Successful compilation will result in all required files being placed in the `dist/` directory * Linux * Ensure `docker` is installed * For x86_64: - * Release: `scripts/make_unix.sh x86_64` - * Debug: `scripts/make_unix.sh x86_64 debug` + * RelWithDebInfo: `scripts/make_unix.sh` + * Release: `scripts/make_unix.sh x86_64 Release` + * Debug: `scripts/make_unix.sh x86_64 Debug` * For aarch64: - * Release: `scripts/make_unix.sh aarch64` - * Debug: `scripts/make_unix.sh aarch64 debug` + * RelWithDebInfo: `scripts/make_unix.sh aarch64` + * Release: `scripts/make_unix.sh aarch64 Release` + * Debug: `scripts/make_unix.sh aarch64 Debug` * Windows - * RECOMMENDED: Cross-compiling on Linux + * OFFICIAL: Cross-compiling on Linux * Ensure `docker` is installed - * Release: `scripts/make_win32.sh` - * Debug: `scripts/make_win32.sh debug` - * Compiling on Windows + * RelWithDebInfo: `scripts/make_win32.sh` + * Release: `scripts/make_win32.sh x86_64 Release` + * Debug: `scripts/make_win32.sh x86_64 Debug` + * UNOFFICIAL: Compiling on Windows * Ensure latest [MSYS2](https://www.msys2.org/) is installed - * Release: `scripts/make_win32.cmd` - * Debug: `scripts/make_win32.cmd debug` + * RelWithDebInfo: `scripts\make_win32.cmd` + * Release: `scripts\make_win32.cmd x86_64 Release` + * Debug: `scripts\make_win32.cmd x86_64 Debug` ## Credits diff --git a/support/src/utils/file_directory.cpp b/support/src/utils/file_directory.cpp index 6afe4a5a..96562d09 100644 --- a/support/src/utils/file_directory.cpp +++ b/support/src/utils/file_directory.cpp @@ -161,7 +161,7 @@ auto directory::create_directory(std::string_view path) const std::string{abs_path} + '|' + std::to_string(res)); } -#else // !defined(_WIN32) +#else // !defined(_WIN32) auto ret{true}; auto paths = utils::string::split(abs_path, utils::path::directory_seperator, false); @@ -377,10 +377,16 @@ auto directory::remove() -> bool { return utils::retry_action([this]() -> bool { try { #if defined(_WIN32) - return not exists() || (::RemoveDirectoryA(path_.c_str()) != 0); + auto ret = not exists() || (::RemoveDirectoryA(path_.c_str()) != 0); #else // !defined(_WIN32) - return not exists() || (rmdir(path_.c_str()) == 0); + auto ret = not exists() || (rmdir(path_.c_str()) == 0); #endif // defined(_WIN32) + if (not ret) { + utils::error::handle_error(function_name, + "failed to remove directory|" + path_); + } + + return ret; } catch (const std::exception &e) { utils::error::handle_exception(function_name, e); } catch (...) { diff --git a/support/src/utils/file_file.cpp b/support/src/utils/file_file.cpp index e4d747f2..6cc5199f 100644 --- a/support/src/utils/file_file.cpp +++ b/support/src/utils/file_file.cpp @@ -25,6 +25,7 @@ #include "utils/common.hpp" #include "utils/error.hpp" #include "utils/path.hpp" +#include namespace { [[nodiscard]] auto get_file_size(std::string_view path, @@ -397,15 +398,31 @@ auto file::sha256() -> std::optional { #endif // defined(PROJECT_ENABLE_LIBSODIUM) auto file::remove() -> bool { + REPERTORY_USES_FUNCTION_NAME(); + close(); return utils::retry_action([this]() -> bool { + try { #if defined(_WIN32) - return not exists() || (::DeleteFileA(path_.c_str()) != 0); + auto ret = not exists() || (::DeleteFileA(path_.c_str()) != 0); #else // !defined(_WIN32) - std::error_code ec{}; - return not exists() || std::filesystem::remove(path_, ec); + std::error_code ec{}; + auto ret = not exists() || std::filesystem::remove(path_, ec); #endif // defined(_WIN32) + if (not ret) { + utils::error::handle_error(function_name, + "failed to remove file|" + path_); + } + + return ret; + } catch (const std::exception &e) { + utils::error::handle_exception(function_name, e); + } catch (...) { + utils::error::handle_exception(function_name); + } + + return false; }); } @@ -458,17 +475,18 @@ auto file::write(const unsigned char *data, std::size_t to_write, std::size_t bytes_written{0U}; while (bytes_written != to_write) { - res = fwrite(reinterpret_cast(&data[bytes_written]), 1U, - to_write - bytes_written, file_.get()); + auto written = + fwrite(reinterpret_cast(&data[bytes_written]), 1U, + to_write - bytes_written, file_.get()); if (not feof(file_.get()) && ferror(file_.get())) { throw std::runtime_error("failed to write file bytes"); } - if (res == 0) { + if (written == 0U) { break; } - bytes_written += static_cast(res); + bytes_written += res; } flush();