12 Commits

Author SHA1 Message Date
8f4a9f5d55 updated build system
All checks were successful
Public/monitarr/pipeline/head This commit looks good
2025-10-10 17:41:01 -05:00
2ee4578c06 updated build system
Some checks failed
Public/monitarr/pipeline/head Something is wrong with the build of this commit
2025-10-10 17:37:15 -05:00
c22df23cfa fix
Some checks are pending
Public/monitarr/pipeline/head Build queued...
2025-10-10 17:35:45 -05:00
5926c11e8a fix
Some checks failed
Public/monitarr/pipeline/head Something is wrong with the build of this commit
2025-10-10 17:20:24 -05:00
5fe4700446 updated build system
Some checks failed
Public/monitarr/pipeline/head Something is wrong with the build of this commit
2025-10-10 12:53:46 -05:00
b190099228 updated build system
Some checks are pending
Public/monitarr/pipeline/head Build queued...
2025-10-10 08:50:43 -05:00
166afcb3b6 updated build system
Some checks failed
Public/monitarr/pipeline/head Something is wrong with the build of this commit
2025-10-10 07:50:09 -05:00
586f4cb036 updated build system
All checks were successful
Public/monitarr/pipeline/head This commit looks good
2025-08-01 16:17:38 -05:00
55ad50d6f4 updated build system
All checks were successful
Public/monitarr/pipeline/head This commit looks good
2025-07-25 17:09:54 -05:00
30d1984da7 updated build system
All checks were successful
Public/monitarr/pipeline/head This commit looks good
2025-04-25 23:28:29 -05:00
8e1b5072fd updated version
All checks were successful
Public/monitarr/pipeline/head This commit looks good
2025-04-13 12:00:20 -05:00
1c115b2758 v1.1.0-release (#1)
All checks were successful
Public/monitarr/pipeline/head This commit looks good
## v1.1.0-release

### Changes from v1.0.0-release

* Added labels to log entries
* Detect and remove stalled torrent import
2025-04-13 11:49:16 -05:00
137 changed files with 6156 additions and 906 deletions

4
.gitattributes vendored Normal file
View File

@@ -0,0 +1,4 @@
*.tgz filter=lfs diff=lfs merge=lfs -text
*.tar.gz filter=lfs diff=lfs merge=lfs -text
*.tar.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text

8
CHANGELOG.md Normal file
View File

@@ -0,0 +1,8 @@
# Changelog
## v1.1.0-release
### Changes from v1.0.0-release
* Added labels to log entries
* Detect and remove stalled torrent import

View File

@@ -51,6 +51,10 @@ if(PROJECT_IS_ARM64)
add_definitions(-DPROJECT_IS_ARM64) add_definitions(-DPROJECT_IS_ARM64)
endif() endif()
if(PROJECT_IS_DARWIN)
add_definitions(-DPROJECT_IS_DARWIN)
endif()
if(PROJECT_IS_MINGW) if(PROJECT_IS_MINGW)
option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF) option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF)
if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES) if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
@@ -115,6 +119,16 @@ if(PROJECT_BUILD)
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp
@ONLY @ONLY
) )
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.iss.in")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.iss.in
${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss
@ONLY
)
endif()
find_package(ICU REQUIRED COMPONENTS data i18n io uc)
else() else()
message(STATUS "-=[CMake Settings]=-") message(STATUS "-=[CMake Settings]=-")
message(STATUS " C standard: ${CMAKE_C_STANDARD}") message(STATUS " C standard: ${CMAKE_C_STANDARD}")
@@ -164,9 +178,12 @@ endif()
-DPROJECT_INTERFACE=1 -DPROJECT_INTERFACE=1
-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE} -DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE}
-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64} -DPROJECT_IS_ARM64=${PROJECT_IS_ARM64}
-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN}
-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW} -DPROJECT_IS_MINGW=${PROJECT_IS_MINGW}
-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX} -DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX}
-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION} -DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION}
-DPROJECT_MACOS_BUNDLE_ID=${PROJECT_MACOS_BUNDLE_ID}
-DPROJECT_MACOS_ICNS_NAME=${PROJECT_MACOS_ICNS_NAME}
-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION} -DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION}
-DPROJECT_NAME=${PROJECT_NAME} -DPROJECT_NAME=${PROJECT_NAME}
-DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER} -DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER}

View File

@@ -35,13 +35,9 @@ list(APPEND PROJECT_CXXFLAGS_LIST
-Wcast-align -Wcast-align
-Wconversion -Wconversion
-Wdouble-promotion -Wdouble-promotion
-Wduplicated-branches
-Wduplicated-cond
-Wextra -Wextra
-Wformat=2 -Wformat=2
-Wlogical-op
-Wmisleading-indentation -Wmisleading-indentation
-Wno-useless-cast
-Wnon-virtual-dtor -Wnon-virtual-dtor
-Wnull-dereference -Wnull-dereference
-Wold-style-cast -Wold-style-cast
@@ -52,6 +48,15 @@ list(APPEND PROJECT_CXXFLAGS_LIST
-Wunused -Wunused
) )
if (NOT PROJECT_IS_DARWIN)
list(APPEND PROJECT_CXXFLAGS_LIST
-Wduplicated-branches
-Wduplicated-cond
-Wlogical-op
-Wno-useless-cast
)
endif()
list(APPEND PROJECT_CFLAGS_LIST list(APPEND PROJECT_CFLAGS_LIST
${PROJECT_COMMON_FLAG_LIST} ${PROJECT_COMMON_FLAG_LIST}
-std=c${CMAKE_C_STANDARD} -std=c${CMAKE_C_STANDARD}
@@ -62,7 +67,7 @@ list(APPEND PROJECT_CXXFLAGS_LIST
-std=gnu++${CMAKE_CXX_STANDARD} -std=gnu++${CMAKE_CXX_STANDARD}
) )
if(PROJECT_STATIC_LINK) if(NOT PROJECT_IS_DARWIN AND PROJECT_STATIC_LINK)
list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS
-static-libgcc -static-libgcc
-static-libstdc++ -static-libstdc++
@@ -89,7 +94,11 @@ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${PROJECT_RELEASE_FLAG_L
set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}")
set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility -fext-numeric-literals ${PROJECT_COMMON_FLAG_LIST}") set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility ${PROJECT_COMMON_FLAG_LIST}")
if (NOT PROJECT_IS_DARWIN)
set(EXTERNAL_CMAKE_CXX_FLAGS "-fext-numeric-literals ${EXTERNAL_CMAKE_CXX_FLAGS}")
endif()
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
-DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE} -DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE}
-DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE} -DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE}

View File

@@ -1,3 +1,7 @@
if (PROJECT_MACOS_ICNS_NAME)
set(PROJECT_MACOS_ICNS_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/assets/${PROJECT_MACOS_ICNS_NAME}")
endif()
function(set_common_target_options name) function(set_common_target_options name)
target_compile_definitions(${name} PUBLIC target_compile_definitions(${name} PUBLIC
${PROJECT_DEFINITIONS} ${PROJECT_DEFINITIONS}
@@ -12,6 +16,17 @@ function(set_common_target_options name)
${PROJECT_EXTERNAL_BUILD_ROOT}/lib ${PROJECT_EXTERNAL_BUILD_ROOT}/lib
) )
if (PROJECT_STATIC_LINK)
target_compile_definitions(${name} PRIVATE U_STATIC_IMPLEMENTATION)
endif()
target_link_libraries(${name} PRIVATE
ICU::io
ICU::i18n
ICU::uc
ICU::data
)
target_include_directories(${name} AFTER PUBLIC target_include_directories(${name} AFTER PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include
${name}_INCLUDES ${name}_INCLUDES
@@ -31,11 +46,31 @@ function(add_project_executable2 name dependencies libraries headers sources is_
list(APPEND sources ${PROJECT_WINDOWS_VERSION_RC}) list(APPEND sources ${PROJECT_WINDOWS_VERSION_RC})
endif() endif()
if (PROJECT_IS_DARWIN AND PROJECT_MACOS_ICNS_SOURCE AND "${name}" STREQUAL "${PROJECT_NAME}")
set_source_files_properties(${PROJECT_MACOS_ICNS_SOURCE} PROPERTIES
MACOSX_PACKAGE_LOCATION "Resources"
)
add_executable(${name}
MACOSX_BUNDLE
${headers}
${sources}
${PROJECT_MACOS_ICNS_SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
)
set_target_properties(${name} PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_ICON_FILE "${PROJECT_MACOS_ICNS_NAME}"
RESOURCE "${PROJECT_MACOS_ICNS_SOURCE}"
)
else()
add_executable(${name} add_executable(${name}
${headers} ${headers}
${sources} ${sources}
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
) )
endif()
foreach(dependency ${dependencies}) foreach(dependency ${dependencies})
set_common_target_options(${dependency}) set_common_target_options(${dependency})

View File

@@ -1,14 +1,15 @@
set(BINUTILS_HASH b53606f443ac8f01d1d5fc9c39497f2af322d99e14cea5c0b4b124d630379365) set(BINUTILS_HASH ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237)
set(CPP_HTTPLIB_HASH c9b9e0524666e1cd088f0874c57c1ce7c0eaa8552f9f4e15c755d5201fc8c608) set(CPP_HTTPLIB_HASH a66f908f50ccb119769adce44fe1eac75f81b6ffab7c4ac0211bb663ffeb2688)
set(CURL_HASH 6edc063d1ebaf9cf3b3b46e9fef2f3cd8932694989ecd43d005d6e828426d09f) set(CURL_HASH d4d9a5001b491f5726efe9b50bc4aad03029506e73c9261272e809c64b05e814)
set(EXPAT_HASH 372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2) set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb)
set(GCC_HASH 7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293) set(GCC_HASH 7294d65cc1a0558cb815af0ca8c7763d86f7a31199794ede3f630c0d1b0a5723)
set(GTEST_HASH 78c676fc63881529bf97bf9d45948d905a66833fbfa5318ea2cd7478cb98f399) set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c)
set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2) set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2)
set(JSON_HASH 0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406) set(INNOSETUP_HASH fa73bf47a4da250d185d07561c2bfda387e5e20db77e4570004cf6a133cc10b1)
set(MINGW_HASH cc41898aac4b6e8dd5cffd7331b9d9515b912df4420a3a612b5ea2955bbeed2f) set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187)
set(OPENSSL_HASH 002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3) set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf)
set(OPENSSL_HASH b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9)
set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591) set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591)
set(ROCKSDB_HASH fdccab16133c9d927a183c2648bcea8d956fb41eb1df2aacaa73eb0b95e43724) set(ROCKSDB_HASH 7ec942baab802b2845188d02bc5d4e42c29236e61bcbc08f5b3a6bdd92290c22)
set(SPDLOG_HASH 25c843860f039a1600f232c6eb9e01e6627f7d030a2ae5e232bdd3c9205d26cc) set(SPDLOG_HASH 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67)
set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c) set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c)

View File

@@ -4,12 +4,16 @@ set(Boost_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
set(CURL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK}) set(CURL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
set(OPENSSL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK}) set(OPENSSL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
set(SFML_STATIC_LIBRARIES ${PROJECT_STATIC_LINK}) set(SFML_STATIC_LIBRARIES ${PROJECT_STATIC_LINK})
if (PROJECT_IS_DARWIN)
set(ZLIB_USE_STATIC_LIBS OFF)
else()
set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK}) set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
endif()
set(wxWidgets_USE_STATIC ${PROJECT_STATIC_LINK}) set(wxWidgets_USE_STATIC ${PROJECT_STATIC_LINK})
set(ICU_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
include(cmake/libraries/icu.cmake)
include(cmake/libraries/openssl.cmake) include(cmake/libraries/openssl.cmake)
include(cmake/libraries/backward_cpp.cmake) include(cmake/libraries/backward_cpp.cmake)
include(cmake/libraries/cpp_httplib.cmake) include(cmake/libraries/cpp_httplib.cmake)
include(cmake/libraries/curl.cmake) include(cmake/libraries/curl.cmake)
@@ -53,7 +57,7 @@ if(PROJECT_BUILD)
winspool winspool
ws2_32 ws2_32
) )
else() elseif(NOT PROJECT_IS_DARWIN)
link_libraries( link_libraries(
uring uring
) )

View File

@@ -15,6 +15,7 @@ if(PROJECT_ENABLE_CPP_HTTPLIB)
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON -DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DHTTPLIB_REQUIRE_BROTLI=OFF -DHTTPLIB_REQUIRE_BROTLI=OFF
-DHTTPLIB_REQUIRE_OPENSSL=ON -DHTTPLIB_REQUIRE_OPENSSL=ON
-DHTTPLIB_REQUIRE_ZLIB=ON -DHTTPLIB_REQUIRE_ZLIB=ON

View File

@@ -27,8 +27,8 @@ if(PROJECT_ENABLE_CURL)
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_CURL=ON -DBUILD_STATIC_CURL=ON
-DBUILD_STATIC_LIBS=ON -DBUILD_STATIC_LIBS=ON
-DBUILD_STATIC_LIBS=ON
-DBUILD_TESTING=OFF -DBUILD_TESTING=OFF
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DCURL_BROTLI=OFF -DCURL_BROTLI=OFF
-DCURL_CA_BUNDLE=./cacert.pem -DCURL_CA_BUNDLE=./cacert.pem
-DCURL_CA_FALLBACK=ON -DCURL_CA_FALLBACK=ON
@@ -37,11 +37,13 @@ if(PROJECT_ENABLE_CURL)
-DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH2=OFF
-DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL} -DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
-DCURL_ZLIB=ON -DCURL_ZLIB=ON
-DCURL_ZSTD=OFF
-DENABLE_CURL_MANUAL=OFF -DENABLE_CURL_MANUAL=OFF
-DENABLE_THREADED_RESOLVER=ON -DENABLE_THREADED_RESOLVER=ON
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS} -DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
-DUSE_LIBIDN2=OFF -DUSE_LIBIDN2=OFF
-DUSE_NGHTTP2=OFF
-DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS} -DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS}
) )

24
cmake/libraries/icu.cmake Normal file
View File

@@ -0,0 +1,24 @@
if((PROJECT_IS_DARWIN OR PROJECT_REQUIRE_ALPINE) AND NOT PROJECT_IS_MINGW AND NOT PROJECT_BUILD)
if(PROJECT_BUILD_SHARED_LIBS)
set(ICU_ENABLE_SHARED yes)
else()
set(ICU_ENABLE_SHARED no)
endif()
ExternalProject_Add(icu_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/mingw64/icu-release-${ICU_VERSION}.tar.gz
URL_HASH SHA256=${ICU_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
PATCH_COMMAND chmod +x ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
CONFIGURE_COMMAND cd icu4c/source && ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
${PROJECT_MARCH}
${PROJECT_EXTERNAL_BUILD_ROOT}
${ICU_ENABLE_SHARED}
BUILD_COMMAND cd icu4c/source && make -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
INSTALL_COMMAND cd icu4c/source && make install
)
list(APPEND PROJECT_DEPENDENCIES icu_project)
endif()

View File

@@ -18,6 +18,7 @@ if(PROJECT_ENABLE_JSON)
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON -DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DJSON_BuildTests=OFF -DJSON_BuildTests=OFF
-DJSON_Install=ON -DJSON_Install=ON
-DJSON_MultipleHeaders=OFF -DJSON_MultipleHeaders=OFF

View File

@@ -15,6 +15,12 @@ if(PROJECT_ENABLE_OPENSSL)
elseif(NOT PROJECT_IS_MINGW) elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_IS_MINGW) if(PROJECT_IS_MINGW)
set(OPENSSL_COMPILE_TYPE mingw64) set(OPENSSL_COMPILE_TYPE mingw64)
elseif(PROJECT_IS_DARWIN)
if(PROJECT_IS_ARM64)
set(OPENSSL_COMPILE_TYPE darwin64-arm64)
else()
set(OPENSSL_COMPILE_TYPE darwin64-x86_64)
endif()
elseif(PROJECT_IS_ARM64) elseif(PROJECT_IS_ARM64)
set(OPENSSL_COMPILE_TYPE linux-aarch64) set(OPENSSL_COMPILE_TYPE linux-aarch64)
else() else()

View File

@@ -14,12 +14,14 @@ if(PROJECT_ENABLE_ROCKSDB)
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=OFF -DBUILD_SHARED_LIBS=OFF
-DBUILD_STATIC_LIBS=ON -DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DFAIL_ON_WARNINGS=OFF -DFAIL_ON_WARNINGS=OFF
-DPORTABLE=1 -DPORTABLE=1
-DROCKSDB_BUILD_SHARED=OFF -DROCKSDB_BUILD_SHARED=OFF
-DROCKSDB_INSTALL_ON_WINDOWS=ON -DROCKSDB_INSTALL_ON_WINDOWS=ON
-DWITH_BENCHMARK=OFF -DWITH_BENCHMARK=OFF
-DWITH_BENCHMARK_TOOLS=OFF -DWITH_BENCHMARK_TOOLS=OFF
-DWITH_BZ2=OFF
-DWITH_CORE_TOOLS=OFF -DWITH_CORE_TOOLS=OFF
-DWITH_EXAMPLES=OFF -DWITH_EXAMPLES=OFF
-DWITH_GFLAGS=OFF -DWITH_GFLAGS=OFF

View File

@@ -15,6 +15,7 @@ if(PROJECT_ENABLE_SPDLOG)
LIST_SEPARATOR | LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DSPDLOG_BUILD_EXAMPLE=OFF -DSPDLOG_BUILD_EXAMPLE=OFF
-DSPDLOG_FMT_EXTERNAL=OFF -DSPDLOG_FMT_EXTERNAL=OFF
-DSPDLOG_FMT_EXTERNAL_HO=OFF -DSPDLOG_FMT_EXTERNAL_HO=OFF

View File

@@ -10,6 +10,7 @@ if (PROJECT_ENABLE_TESTING)
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON -DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
) )
list(APPEND PROJECT_DEPENDENCIES gtest_project) list(APPEND PROJECT_DEPENDENCIES gtest_project)

View File

@@ -2,10 +2,6 @@ if(MSVC)
message(FATAL_ERROR "MSVC will not be supported") message(FATAL_ERROR "MSVC will not be supported")
endif() endif()
if(UNIX AND APPLE)
message(FATAL_ERROR "Apple is not currently supported")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
message(FATAL_ERROR "FreeBSD is not currently supported") message(FATAL_ERROR "FreeBSD is not currently supported")
endif() endif()
@@ -13,3 +9,15 @@ endif()
if(PROJECT_REQUIRE_ALPINE AND NOT PROJECT_IS_ALPINE AND PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX) if(PROJECT_REQUIRE_ALPINE AND NOT PROJECT_IS_ALPINE AND PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
message(FATAL_ERROR "Project requires Alpine Linux to build") message(FATAL_ERROR "Project requires Alpine Linux to build")
endif() endif()
if (PROJECT_IS_DARWIN)
if (PROJECT_IS_ARM64)
set(CMAKE_OSX_ARCHITECTURES "arm64")
else()
set(CMAKE_OSX_ARCHITECTURES "x86_64")
endif()
endif()
if (PROJECT_IS_DARWIN AND NOT PROJECT_MACOS_BUNDLE_ID)
message(FATAL_ERROR "'PROJECT_MACOS_BUNDLE_ID' is not set in 'config.sh'")
endif()

View File

@@ -1,23 +1,23 @@
set(BINUTILS_VERSION 2.43) set(BINUTILS_VERSION 2.44)
set(BOOST_MAJOR_VERSION 1)
set(BOOST_MINOR_VERSION 87)
set(BOOST_PATCH_VERSION 0)
set(BOOST2_MAJOR_VERSION 1) set(BOOST2_MAJOR_VERSION 1)
set(BOOST2_MINOR_VERSION 76) set(BOOST2_MINOR_VERSION 76)
set(BOOST2_PATCH_VERSION 0) set(BOOST2_PATCH_VERSION 0)
set(CPP_HTTPLIB_VERSION 0.19.0) set(BOOST_MAJOR_VERSION 1)
set(CURL_VERSION 8.12.1) set(BOOST_MINOR_VERSION 89)
set(CURL2_VERSION 8_12_1) set(BOOST_PATCH_VERSION 0)
set(EXPAT_VERSION 2.6.4) set(CPP_HTTPLIB_VERSION 0.26.0)
set(EXPAT2_VERSION 2_6_4) set(CURL2_VERSION 8_16_0)
set(GCC_VERSION 14.2.0) set(CURL_VERSION 8.16.0)
set(GTEST_VERSION 1.16.0) set(EXPAT2_VERSION 2_7_1)
set(EXPAT_VERSION 2.7.1)
set(GCC_VERSION 15.2.0)
set(GTEST_VERSION 1.17.0)
set(ICU_VERSION 76-1) set(ICU_VERSION 76-1)
set(JSON_VERSION 3.11.3) set(INNOSETUP_VERSION 6.5.4)
set(MESA_VERSION 23.3.3) set(JSON_VERSION 3.12.0)
set(MINGW_VERSION 12.0.0) set(MINGW_VERSION 13.0.0)
set(OPENSSL_VERSION 3.4.1) set(OPENSSL_VERSION 3.6.0)
set(PKG_CONFIG_VERSION 0.29.2) set(PKG_CONFIG_VERSION 0.29.2)
set(ROCKSDB_VERSION 9.10.0) set(ROCKSDB_VERSION 10.5.1)
set(SPDLOG_VERSION 1.15.1) set(SPDLOG_VERSION 1.15.3)
set(ZLIB_VERSION 1.3.1) set(ZLIB_VERSION 1.3.1)

View File

@@ -8,10 +8,10 @@ PROJECT_DESC="Utility to remove, block and search stalled downloads in lidarr, r
PROJECT_URL="https://git.fifthgrid.com/public/monitarr" PROJECT_URL="https://git.fifthgrid.com/public/monitarr"
PROJECT_MAJOR_VERSION=1 PROJECT_MAJOR_VERSION=1
PROJECT_MINOR_VERSION=0 PROJECT_MINOR_VERSION=1
PROJECT_REVISION_VERSION=0 PROJECT_REVISION_VERSION=1
PROJECT_RELEASE_NUM=0 PROJECT_RELEASE_NUM=0
PROJECT_RELEASE_ITER=release PROJECT_RELEASE_ITER=rc
PROJECT_APP_LIST=(${PROJECT_NAME}) PROJECT_APP_LIST=(${PROJECT_NAME})

View File

@@ -1,5 +1,5 @@
#comment #comment
FROM arm64v8/alpine:3.21.3 FROM arm64v8/alpine:3.22.2
MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com> MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com>
CMD bash CMD bash
@@ -31,9 +31,7 @@ RUN apk add \
gflags \ gflags \
gflags-dev \ gflags-dev \
git \ git \
icu-dev \ git-lfs \
icu-libs \
icu-static \
libogg-dev \ libogg-dev \
libogg-static \ libogg-static \
libtool \ libtool \

View File

@@ -1,5 +1,5 @@
#comment #comment
FROM alpine:3.21.3 FROM alpine:3.22.2
MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com> MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com>
CMD bash CMD bash
@@ -31,9 +31,7 @@ RUN apk add \
gflags \ gflags \
gflags-dev \ gflags-dev \
git \ git \
icu-dev \ git-lfs \
icu-libs \
icu-static \
libogg-dev \ libogg-dev \
libogg-static \ libogg-static \
libtool \ libtool \

View File

@@ -11,7 +11,6 @@ RUN apt-get install -y \
gdb \ gdb \
git \ git \
lib32stdc++6 \ lib32stdc++6 \
libgconf-2-4 \
libglu1-mesa \ libglu1-mesa \
libstdc++6 \ libstdc++6 \
python3 \ python3 \

View File

@@ -1,5 +1,5 @@
#comment #comment
FROM alpine:3.21.3 FROM alpine:3.22.2
RUN apk update RUN apk update
RUN apk upgrade RUN apk upgrade
@@ -12,12 +12,14 @@ RUN apk add \
bzip2 \ bzip2 \
clang17-extra-tools \ clang17-extra-tools \
cmake \ cmake \
curl \
file \ file \
flex \ flex \
g++ \ g++ \
gcc \ gcc \
gettext \ gettext \
git \ git \
git-lfs \
gmp \ gmp \
gmp-dev \ gmp-dev \
gperf \ gperf \
@@ -42,6 +44,7 @@ RUN apk add \
ruby \ ruby \
texinfo \ texinfo \
unzip \ unzip \
xvfb \
wget \ wget \
wine \ wine \
xz \ xz \
@@ -101,6 +104,39 @@ RUN echo -e \
"system = 'windows'\n"\ "system = 'windows'\n"\
> ${MY_TOOLCHAIN_FILE_MESON} > ${MY_TOOLCHAIN_FILE_MESON}
RUN mkdir -p /opt/bin;echo -e \
"#!/bin/sh\n"\
"COUNT=0\n"\
"echo \"Start waiting on \$@\"\n"\
"while pgrep \"\$@\" > /dev/null; do \n"\
" echo \"waiting ...\"\n"\
" sleep 1;\n"\
" COUNT=\$((COUNT+1))\n"\
" if [ \$COUNT -eq 60 ]; then\n"\
" exit 3;\n"\
" fi\n"\
"done\n"\
"echo \"\$@ completed\"\n"\
> /opt/bin/waitonprocess && \
chmod +x /opt/bin/waitonprocess && \
cat /opt/bin/waitonprocess
RUN echo -e \
"#!/bin/sh\n"\
"Xvfb \$DISPLAY &\n"\
"tokill=\$!\n"\
"wine wineboot --init\n"\
"waitonprocess wineserver\n"\
"\"\$@\"\n"\
"retval=\$?\n"\
"kill -15 \$tokill\n"\
"wine wineboot --shutdown\n"\
"return \$retval\n"\
> /opt/bin/wine-x11-run && \
chmod +x /opt/bin/wine-x11-run && \
cat /opt/bin/wine-x11-run
ENV PATH="/opt/bin:${PATH}"
SHELL [ "/bin/bash", "-c" ] SHELL [ "/bin/bash", "-c" ]
RUN mkdir -p \ RUN mkdir -p \
@@ -350,9 +386,9 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./expat-${MY_EXPAT_VERSION}.tar.gz.sha
ARG FONTCONFIG_VERSION ARG FONTCONFIG_VERSION
ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION} ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION}
RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz" ]; then \ RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz" ]; then \
cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz.sha256 && cd - \ cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz.sha256 && cd - \
&& tar xvzf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz \ && tar xvJf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz \
&& cd fontconfig-${MY_FONTCONFIG_VERSION} \ && cd fontconfig-${MY_FONTCONFIG_VERSION} \
&& meson setup \ && meson setup \
--cross-file ${MY_TOOLCHAIN_FILE_MESON} \ --cross-file ${MY_TOOLCHAIN_FILE_MESON} \
@@ -710,6 +746,7 @@ RUN if [ -f "/3rd_party/cpp-httplib-${MY_CPP_HTTPLIB_VERSION}.tar.gz" ]; then \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \ -DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
-DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \ -DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \
-DCMAKE_SYSTEM_VERSION="10.0.0" \
-DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ -DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \
-DHTTPLIB_REQUIRE_BROTLI=OFF \ -DHTTPLIB_REQUIRE_BROTLI=OFF \
-DHTTPLIB_REQUIRE_OPENSSL=ON \ -DHTTPLIB_REQUIRE_OPENSSL=ON \
@@ -798,6 +835,7 @@ RUN if [ -f "/3rd_party/libevent-${MY_LIBEVENT_VERSION}-stable.tar.gz" ]; then \
&& cmake .. \ && cmake .. \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \ -DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
-DCMAKE_C_FLAGS="-include winsock2.h -include ws2tcpip.h -include iphlpapi.h" \
-DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \ -DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \
-DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ -DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \
-DEVENT__DISABLE_OPENSSL=ON \ -DEVENT__DISABLE_OPENSSL=ON \
@@ -887,6 +925,7 @@ RUN if [ -f "/3rd_party/rocksdb-${MY_ROCKSDB_VERSION}.tar.gz" ]; then \
-DROCKSDB_INSTALL_ON_WINDOWS=ON \ -DROCKSDB_INSTALL_ON_WINDOWS=ON \
-DWITH_BENCHMARK=OFF \ -DWITH_BENCHMARK=OFF \
-DWITH_BENCHMARK_TOOLS=OFF \ -DWITH_BENCHMARK_TOOLS=OFF \
-DWITH_BZ2=OFF \
-DWITH_CORE_TOOLS=OFF \ -DWITH_CORE_TOOLS=OFF \
-DWITH_EXAMPLES=OFF \ -DWITH_EXAMPLES=OFF \
-DWITH_GFLAGS=OFF \ -DWITH_GFLAGS=OFF \
@@ -1118,6 +1157,33 @@ RUN if [ -f "/3rd_party/libdsm-${MY_LIBDSM_VERSION}.tar.gz" ]; then \
&& rm -r libdsm-${MY_LIBDSM_VERSION} \ && rm -r libdsm-${MY_LIBDSM_VERSION} \
; fi ; fi
RUN (mv ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \ ENV DISPLAY=:90
ENV WINEDEBUG=-all,err+all
ARG INNOSETUP_VERSION
ENV MY_INNOSETUP_VERSION=${INNOSETUP_VERSION}
RUN rm -rf /root/.wine; \
wine64 reg add 'HKEY_CURRENT_USER\Software\Wine' /v ShowDotFiles /d Y \
&& while [ ! -f /root/.wine/user.reg ]; do sleep 1; done; \
wine-x11-run wine64 /3rd_party/mingw64/innosetup-${MY_INNOSETUP_VERSION}.exe /SP- /VERYSILENT /ALLUSERS /SUPPRESSMSGBOXES /DOWNLOADISCRYPT=1
ARG UID=1000
ARG GID=1000
ARG USERNAME=myuser
RUN delgroup scanner || echo "no scanner group found"
RUN addgroup -g $GID $USERNAME && \
adduser -D -u $UID -G $USERNAME -h /home/$USERNAME $USERNAME
RUN rsync -av --progress /root/.wine/ /home/$USERNAME/.wine/ && \
chown -R $UID:$GID -R /home/$USERNAME/.wine/
RUN (cp ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \
&& chmod 0777 -R ${MY_MINGW_DIR} \ && chmod 0777 -R ${MY_MINGW_DIR} \
&& rm -rf /3rd_party && rm -rf /3rd_party \
&& rm -rf /root/.wine
USER $USERNAME
WORKDIR /home/$USERNAME

View File

@@ -1,24 +1,3 @@
/*
Copyright <2018-2025> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef LIBMONITARR_INCLUDE_INITIALIZE_HPP_ #ifndef LIBMONITARR_INCLUDE_INITIALIZE_HPP_
#define LIBMONITARR_INCLUDE_INITIALIZE_HPP_ #define LIBMONITARR_INCLUDE_INITIALIZE_HPP_

View File

@@ -40,7 +40,8 @@ auto list_cmd(int argc, char **argv, const app_config &cfg) -> int {
const auto &server = cfg.server_list.at(utils::string::to_uint64(*idx)); const auto &server = cfg.server_list.at(utils::string::to_uint64(*idx));
utils::error::handle_info( utils::error::handle_info(
function_name, fmt::format("list queue|{}|{}", server.id, server.url)); function_name,
fmt::format("list queue|sid|{}|url|{}", server.id, server.url));
return list_queue(server); return list_queue(server);
} }
} // namespace monitarr } // namespace monitarr

View File

@@ -40,8 +40,8 @@ monitarr::stop_type stop_requested{false};
void quit_handler(int sig) { void quit_handler(int sig) {
MONITARR_USES_FUNCTION_NAME(); MONITARR_USES_FUNCTION_NAME();
monitarr::utils::error::handle_info(function_name, monitarr::utils::error::handle_info(
fmt::format("stop requested|{}", sig)); function_name, fmt::format("stop requested|signal|{}", sig));
stop_requested = true; stop_requested = true;
monitarr::mutex_lock lock(mtx); monitarr::mutex_lock lock(mtx);
@@ -53,8 +53,9 @@ namespace monitarr {
static void check_server(const server_cfg &server, data_db &state_db) { static void check_server(const server_cfg &server, data_db &state_db) {
MONITARR_USES_FUNCTION_NAME(); MONITARR_USES_FUNCTION_NAME();
utils::error::handle_info(function_name, fmt::format("checking server|{}|{}", utils::error::handle_info(
server.id, server.url)); function_name,
fmt::format("checking server|sid|{}|url|{}", server.id, server.url));
auto cli = create_client(server); auto cli = create_client(server);
@@ -69,14 +70,15 @@ static void check_server(const server_cfg &server, data_db &state_db) {
if (not response) { if (not response) {
utils::error::handle_error( utils::error::handle_error(
function_name, function_name,
fmt::format("check server request failed|{}|{}|no response", fmt::format("check server request failed|sid|{}|url|{}|no response",
server.id, server.url)); server.id, server.url));
break; break;
} }
if (response->status != httplib::StatusCode::OK_200) { if (response->status != httplib::StatusCode::OK_200) {
utils::error::handle_error( utils::error::handle_error(
function_name, fmt::format("check server request failed|{}|{}|{}", function_name,
fmt::format("check server request failed|sid|{}|url|{}|status|{}",
server.id, server.url, response->status)); server.id, server.url, response->status));
break; break;
} }
@@ -101,23 +103,29 @@ static void check_server(const server_cfg &server, data_db &state_db) {
auto movie_id = record.contains("movieId") auto movie_id = record.contains("movieId")
? record["movieId"].get<std::uint64_t>() ? record["movieId"].get<std::uint64_t>()
: std::uint64_t{0U}; : std::uint64_t{0U};
auto size = record.at("size").get<std::uint64_t>();
auto size_left = record.at("sizeleft").get<std::uint64_t>(); auto size_left = record.at("sizeleft").get<std::uint64_t>();
auto title = record.at("title").get<std::string>(); auto title = record.at("title").get<std::string>();
auto is_downloading = utils::string::contains( auto is_downloading =
record.at("status").get<std::string>(), "downloading"); utils::string::contains(record.at("status").get<std::string>(),
"downloading") ||
size == 0U;
auto data = state_db.get(download_id); auto data = state_db.get(download_id);
const auto update_entry = [&download_id, &now, server_id = server.id, const auto update_entry = [&download_id, &now, server_id = server.id,
&size_left, &state_db, &title, &size, &size_left, &state_db, &title,
url = server.url](auto last_size_left) { url = server.url](auto last_size_left) {
if (size_left == 0U) { if (size != 0U && size_left == 0U) {
state_db.remove(download_id); state_db.remove(download_id);
return; return;
} }
utils::error::handle_info( utils::error::handle_info(
function_name, fmt::format("updating {}|{}|{}|{}|{}", download_id, function_name,
title, now, size_left, last_size_left)); fmt::format(
"updating "
"id|{}|title|{}|now|{}|size|{}|size_left|{}|last_size_left|{}",
download_id, title, now, size, size_left, last_size_left));
state_db.set(data_entry{ state_db.set(data_entry{
download_id, download_id,
now, now,
@@ -129,10 +137,12 @@ static void check_server(const server_cfg &server, data_db &state_db) {
if (std::chrono::nanoseconds(now - data->last_check) >= if (std::chrono::nanoseconds(now - data->last_check) >=
server.timeout) { server.timeout) {
utils::error::handle_info( utils::error::handle_info(
function_name, function_name, fmt::format("processing timeout "
fmt::format("processing timeout {}|{}|{}|{}|{}", download_id, "id|{}|title|{}|now|{}|size|{}|size_"
title, now, size_left, data->size_left)); "left|{}|last_size_left|{}",
if (size_left == data->size_left) { download_id, title, now, size,
size_left, data->size_left));
if (size == 0U || size_left == data->size_left) {
remove_stalled(download_id, title, episode_id, movie_id, server, remove_stalled(download_id, title, episode_id, movie_id, server,
&state_db); &state_db);
} else if (size_left == 0U || not is_downloading) { } else if (size_left == 0U || not is_downloading) {
@@ -140,10 +150,10 @@ static void check_server(const server_cfg &server, data_db &state_db) {
} else { } else {
update_entry(data->size_left); update_entry(data->size_left);
} }
} else if (size_left == 0U || not is_downloading) { } else if ((size != 0U && size_left == 0U) || not is_downloading) {
state_db.remove(download_id); state_db.remove(download_id);
} }
} else if (is_downloading && size_left > 0U) { } else if (is_downloading && (size == 0U || size_left > 0U)) {
update_entry(0U); update_entry(0U);
} }
} }
@@ -168,15 +178,15 @@ static void cleanup_entries(const server_cfg &server, data_db &state_db) {
} }
utils::error::handle_warn( utils::error::handle_warn(
function_name, fmt::format("download not found|{}|{}|{}", server.id, function_name, fmt::format("download not found|sid|{}|url|{}|id|{}",
server.url, entry.download_id)); server.id, server.url, entry.download_id));
if (not is_not_found) { if (not is_not_found) {
continue; continue;
} }
utils::error::handle_warn( utils::error::handle_warn(
function_name, fmt::format("removing download|{}|{}|{}", server.id, function_name, fmt::format("removing download|sid|{}|url|{}|id|{}",
server.url, entry.download_id)); server.id, server.url, entry.download_id));
state_db.remove(entry.download_id); state_db.remove(entry.download_id);
} }
} }
@@ -222,8 +232,8 @@ auto run_cmd(const app_config &cfg, std::string_view log_dir) -> int {
} }
utils::error::handle_info( utils::error::handle_info(
function_name, function_name, fmt::format("waiting for next check|interval|{}",
fmt::format("waiting for next check|{}", cfg.check_interval)); cfg.check_interval));
notify.wait_for(lock, cfg.check_interval); notify.wait_for(lock, cfg.check_interval);
} }
@@ -238,7 +248,7 @@ auto run_cmd(const app_config &cfg, std::string_view log_dir) -> int {
} }
utils::error::handle_info(function_name, utils::error::handle_info(function_name,
fmt::format("exiting application|{}", ret)); fmt::format("exiting application|ret|{}", ret));
return ret; return ret;
} }

View File

@@ -1,8 +1,8 @@
#include "version.hpp" #include "version.hpp"
namespace { namespace {
static constexpr const std::string_view git_rev = "@PROJECT_GIT_REV@"; constexpr std::string_view git_rev = "@PROJECT_GIT_REV@";
static constexpr const std::string_view version = constexpr std::string_view version =
"@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@" "@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@"
"-@PROJECT_RELEASE_ITER@"; "-@PROJECT_RELEASE_ITER@";
} // namespace } // namespace

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_MINGW64_COPY_DEPENDENCIES=() PROJECT_MINGW64_COPY_DEPENDENCIES=()
@@ -15,6 +15,7 @@ if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_STATIC_LINK}" == "OFF" ]; th
/mingw64/bin/libstdc++-6.dll /mingw64/bin/libstdc++-6.dll
/mingw64/bin/libwinpthread-1.dll /mingw64/bin/libwinpthread-1.dll
/mingw64/bin/libzlib1.dll /mingw64/bin/libzlib1.dll
/mingw64/bin/libzstd.dll
/mingw64/bin/zlib1.dll /mingw64/bin/zlib1.dll
) )
@@ -193,7 +194,7 @@ if [ "${PROJECT_ENABLE_WINFSP}" == "ON" ]; then
fi fi
if [ "${WINFSP_DLL_PART}" != "" ]; then if [ "${WINFSP_DLL_PART}" != "" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/bin/winfsp-${WINFSP_DLL_PART}.dll) PROJECT_MINGW64_COPY_DEPENDENCIES+=(${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/bin/winfsp-${WINFSP_DLL_PART}.dll)
fi fi
fi fi

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
DEST_DIR=$1 DEST_DIR=$1
DIST_DIR=$2 DIST_DIR=$2
@@ -35,7 +35,7 @@ fi
pushd "${PROJECT_SOURCE_DIR}" pushd "${PROJECT_SOURCE_DIR}"
BRANCH=$(git branch --show-current) BRANCH=$(git branch --show-current)
RELEASE=$(grep PROJECT_RELEASE_ITER= ./config.sh | sed s/PROJECT_RELEASE_ITER=//g) RELEASE=$(grep PROJECT_RELEASE_ITER= ./config.sh | ${SED} s/PROJECT_RELEASE_ITER=//g)
popd popd
if [ "${BRANCH}" == "master" ] || [ "${BRANCH}" == "alpha" ] || if [ "${BRANCH}" == "master" ] || [ "${BRANCH}" == "alpha" ] ||
@@ -62,10 +62,41 @@ if [ "${PROJECT_PRIVATE_KEY}" != "" ] && [ ! -f "./${PROJECT_OUT_FILE}.sig" ]; t
error_exit "failed to find file: ${PROJECT_OUT_FILE}.sig" 1 error_exit "failed to find file: ${PROJECT_OUT_FILE}.sig" 1
fi fi
cp -f ./${PROJECT_OUT_FILE} ${DEST_DIR} || error_exit "failed to deliver file: ${PROJECT_OUT_FILE}" 1 cp -f ./${PROJECT_OUT_FILE} ${DEST_DIR} ||
cp -f ./${PROJECT_OUT_FILE}.sha256 ${DEST_DIR} || error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sha256" 1 error_exit "failed to deliver file: ${PROJECT_OUT_FILE}" 1
cp -f ./${PROJECT_OUT_FILE}.sha256 ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sha256" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
cp -f ./${PROJECT_OUT_FILE}.sig ${DEST_DIR} || error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sig" 1 cp -f ./${PROJECT_OUT_FILE}.sig ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sig" 1
fi
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe" ]; then
cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}" 1
cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sha256" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sha256" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sig" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sig" 1
fi
fi
if [ "${PROJECT_IS_DARWIN}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg" ]; then
cp -f -X "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg" 1
cp -f -X "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sha256" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sha256" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
cp -f -X "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sig" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sig" 1
fi
fi fi
popd popd

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ] && if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ] &&
[ "${PROJECT_ENABLE_MULTIARCH_DOCKER}" == "1" ]; then [ "${PROJECT_ENABLE_MULTIARCH_DOCKER}" == "1" ]; then
@@ -26,10 +26,16 @@ if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then
docker build ${APP_VERSION_BUILD_ARGS} \ docker build ${APP_VERSION_BUILD_ARGS} \
--platform linux/arm64 \ --platform linux/arm64 \
--build-arg NUM_JOBS=${NUM_JOBS} \ --build-arg NUM_JOBS=${NUM_JOBS} \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
--build-arg USERNAME=$(id -un) \
-t ${DOCKER_TAG} . || exit 1 -t ${DOCKER_TAG} . || exit 1
else else
docker build ${APP_VERSION_BUILD_ARGS} \ docker build ${APP_VERSION_BUILD_ARGS} \
--build-arg NUM_JOBS=${NUM_JOBS} \ --build-arg NUM_JOBS=${NUM_JOBS} \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
--build-arg USERNAME=$(id -un) \
-t ${DOCKER_TAG} . || exit 1 -t ${DOCKER_TAG} . || exit 1
fi fi
rm Dockerfile rm Dockerfile

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_BUILD_ARCH=$1 PROJECT_BUILD_ARCH=$1
PROJECT_CMAKE_BUILD_TYPE=$2 PROJECT_CMAKE_BUILD_TYPE=$2
@@ -47,18 +47,34 @@ done
PROJECT_APP_LIST=() PROJECT_APP_LIST=()
PROJECT_CMAKE_OPTS="" PROJECT_CMAKE_OPTS=""
PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF
PROJECT_ENABLE_V2_ERRORS=OFF PROJECT_ENABLE_V2_ERRORS=OFF
PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF
PROJECT_IS_ALPINE=0 PROJECT_IS_ALPINE=0
PROJECT_IS_ARM64=0 PROJECT_IS_ARM64=0
PROJECT_IS_DARWIN=0
PROJECT_MINGW64_COPY_DEPENDENCIES=() PROJECT_MINGW64_COPY_DEPENDENCIES=()
PROJECT_MSYS2_PACKAGE_LIST=() PROJECT_MSYS2_PACKAGE_LIST=()
PROJECT_REQUIRE_ALPINE=OFF PROJECT_REQUIRE_ALPINE=OFF
PROJECT_STATIC_LINK=OFF PROJECT_STATIC_LINK=OFF
PROJECT_MACOS_BUNDLE_ID=""
PROJECT_MACOS_ICNS_NAME=""
if [ "$(uname -s)" == "Darwin" ]; then
PROJECT_IS_DARWIN=1
export SED=gsed
else
export SED=sed
fi
if [ "${PROJECT_BUILD_ARCH}" == "" ]; then if [ "${PROJECT_BUILD_ARCH}" == "" ]; then
if [ "$(uname -m)" == "arm64" ]; then
PROJECT_BUILD_ARCH=aarch64
else
PROJECT_BUILD_ARCH=x86_64 PROJECT_BUILD_ARCH=x86_64
elif [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then fi
fi
if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then
PROJECT_IS_ARM64=1 PROJECT_IS_ARM64=1
fi fi
@@ -173,7 +189,11 @@ if [ "${PROJECT_STATIC_LINK}" == "ON" ]; then
PROJECT_BUILD_SHARED_LIBS=OFF PROJECT_BUILD_SHARED_LIBS=OFF
PROJECT_ENABLE_BACKWARD_CPP=OFF PROJECT_ENABLE_BACKWARD_CPP=OFF
PROJECT_LINK_TYPE=static PROJECT_LINK_TYPE=static
if [ "${PROJECT_IS_DARWIN}" == "0" ]; then
PROJECT_REQUIRE_ALPINE=ON PROJECT_REQUIRE_ALPINE=ON
else
PROJECT_REQUIRE_ALPINE=OFF
fi
else else
PROJECT_BUILD_SHARED_LIBS=ON PROJECT_BUILD_SHARED_LIBS=ON
PROJECT_LINK_TYPE=shared PROJECT_LINK_TYPE=shared
@@ -186,6 +206,9 @@ PROJECT_DIST_DIR=${PROJECT_SOURCE_DIR}/dist/${PROJECT_CMAKE_BUILD_TYPE_LOWER}/${
if [ "${PROJECT_IS_MINGW}" == "1" ]; then if [ "${PROJECT_IS_MINGW}" == "1" ]; then
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/win32 PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/win32
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/win32 PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/win32
elif [ "${PROJECT_IS_DARWIN}" == "1" ]; then
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/darwin
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/darwin
else else
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/linux PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/linux
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/linux PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/linux
@@ -220,12 +243,12 @@ if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; th
fi fi
if [ -f "${PROJECT_SOURCE_DIR}/cmake/versions.cmake" ]; then if [ -f "${PROJECT_SOURCE_DIR}/cmake/versions.cmake" ]; then
VERSIONS=($(sed -e s/\ /=/g -e s/set\(//g -e s/\)//g "${PROJECT_SOURCE_DIR}/cmake/versions.cmake")) VERSIONS=($(${SED} -e s/\ /=/g -e s/set\(//g -e s/\)//g "${PROJECT_SOURCE_DIR}/cmake/versions.cmake"))
PROJECT_MINGW64_DOCKER_BUILD_ARGS=() PROJECT_MINGW64_DOCKER_BUILD_ARGS=()
for VERSION in "${VERSIONS[@]}"; do for VERSION in "${VERSIONS[@]}"; do
LOOKUP_NAME=$(echo ${VERSION} | sed s/_VERSION.*// | sed s/GTEST/TESTING/g) LOOKUP_NAME=$(echo ${VERSION} | ${SED} s/_VERSION.*// | sed s/GTEST/TESTING/g)
ENABLE_NAME=PROJECT_ENABLE_${LOOKUP_NAME} ENABLE_NAME=PROJECT_ENABLE_${LOOKUP_NAME}
if [ "${!ENABLE_NAME}" != "OFF" ]; then if [ "${!ENABLE_NAME}" != "OFF" ]; then
PROJECT_MINGW64_DOCKER_BUILD_ARGS+=("--build-arg ${VERSION}") PROJECT_MINGW64_DOCKER_BUILD_ARGS+=("--build-arg ${VERSION}")
@@ -247,8 +270,11 @@ PROJECT_CMAKE_OPTS="-DPROJECT_EXTERNAL_BUILD_ROOT=${PROJECT_EXTERNAL_BUILD_ROOT}
PROJECT_CMAKE_OPTS="-DPROJECT_GIT_REV=${PROJECT_GIT_REV} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_GIT_REV=${PROJECT_GIT_REV} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MACOS_BUNDLE_ID=${PROJECT_MACOS_BUNDLE_ID} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MACOS_ICNS_NAME=${PROJECT_MACOS_ICNS_NAME} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_NAME=${PROJECT_NAME} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_NAME=${PROJECT_NAME} ${PROJECT_CMAKE_OPTS}"
@@ -277,6 +303,8 @@ PATH="${PROJECT_EXTERNAL_BUILD_ROOT}/bin:${PATH}"
if [ "${PROJECT_IS_MINGW}" == "1" ]; then if [ "${PROJECT_IS_MINGW}" == "1" ]; then
PROJECT_OS=windows PROJECT_OS=windows
elif [ "${PROJECT_IS_DARWIN}" == "1" ]; then
PROJECT_OS=darwin
else else
PROJECT_OS=linux PROJECT_OS=linux
fi fi
@@ -292,6 +320,8 @@ if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" != "1" ]; th
MSYS=winsymlinks:nativestrict MSYS=winsymlinks:nativestrict
fi fi
PROJECT_ENABLE_INNOSETUP=1
export MSYS export MSYS
export NUM_JOBS export NUM_JOBS
export OPENSSL_ROOT_DIR export OPENSSL_ROOT_DIR
@@ -319,9 +349,12 @@ export PROJECT_FLUTTER_BASE_HREF
export PROJECT_GIT_REV export PROJECT_GIT_REV
export PROJECT_IS_ALPINE export PROJECT_IS_ALPINE
export PROJECT_IS_ARM64 export PROJECT_IS_ARM64
export PROJECT_IS_DARWIN
export PROJECT_IS_MINGW export PROJECT_IS_MINGW
export PROJECT_IS_MINGW_UNIX export PROJECT_IS_MINGW_UNIX
export PROJECT_LINK_TYPE export PROJECT_LINK_TYPE
export PROJECT_MACOS_BUNDLE_ID
export PROJECT_MACOS_ICNS_NAME
export PROJECT_MAJOR_VERSION export PROJECT_MAJOR_VERSION
export PROJECT_MINGW64_COPY_DEPENDENCIES export PROJECT_MINGW64_COPY_DEPENDENCIES
export PROJECT_MINGW64_DOCKER_BUILD_ARGS export PROJECT_MINGW64_DOCKER_BUILD_ARGS
@@ -371,6 +404,7 @@ echo " File part: ${PROJECT_FILE_PART}"
echo " Flutter base href: ${PROJECT_FLUTTER_BASE_HREF}" echo " Flutter base href: ${PROJECT_FLUTTER_BASE_HREF}"
echo " Is ARM64: ${PROJECT_IS_ARM64}" echo " Is ARM64: ${PROJECT_IS_ARM64}"
echo " Is Alpine: ${PROJECT_IS_ALPINE}" echo " Is Alpine: ${PROJECT_IS_ALPINE}"
echo " Is Darwin: ${PROJECT_IS_DARWIN}"
echo " Is MINGW on Unix: ${PROJECT_IS_MINGW_UNIX}" echo " Is MINGW on Unix: ${PROJECT_IS_MINGW_UNIX}"
echo " Is MINGW: ${PROJECT_IS_MINGW}" echo " Is MINGW: ${PROJECT_IS_MINGW}"
echo " Job count: ${NUM_JOBS}" echo " Job count: ${NUM_JOBS}"
@@ -378,6 +412,10 @@ echo " Link type: ${PROJECT_LINK_TYPE}"
if [ "${PROJECT_IS_MINGW}" == "1" ]; then if [ "${PROJECT_IS_MINGW}" == "1" ]; then
echo " Long path names: ${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES}" echo " Long path names: ${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES}"
fi fi
if [ "${PROJECT_IS_DARWIN}" == "1" ]; then
echo " macOS bundle ID: ${PROJECT_MACOS_BUNDLE_ID}"
echo " macOS icns name: ${PROJECT_MACOS_ICNS_NAME}"
fi
echo " Meson toolchain file: ${PROJECT_TOOLCHAIN_FILE_MESON}" echo " Meson toolchain file: ${PROJECT_TOOLCHAIN_FILE_MESON}"
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then
echo " MinGW docker build args: ${PROJECT_MINGW64_DOCKER_BUILD_ARGS}" echo " MinGW docker build args: ${PROJECT_MINGW64_DOCKER_BUILD_ARGS}"

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_LIBRARIES=( PROJECT_LIBRARIES=(
BACKWARD_CPP BACKWARD_CPP
@@ -20,6 +20,7 @@ PROJECT_CLEANUP[EXPAT]="3rd_party/mingw64/expat-*"
PROJECT_CLEANUP[GCC]="3rd_party/mingw64/gcc-*" PROJECT_CLEANUP[GCC]="3rd_party/mingw64/gcc-*"
PROJECT_CLEANUP[ICU]="3rd_party/mingw64/icu-release-*" PROJECT_CLEANUP[ICU]="3rd_party/mingw64/icu-release-*"
PROJECT_CLEANUP[JSON]="3rd_party/json-*" PROJECT_CLEANUP[JSON]="3rd_party/json-*"
PROJECT_CLEANUP[INNOSETUP]="3rd_party/mingw64/innosetup-*"
PROJECT_CLEANUP[LIBBITCOIN_SYSTEM_ON]="3rd_party/boost_${PROJECT_VERSIONS[BOOST_MAJOR]}_${PROJECT_VERSIONS[BOOST_MINOR]}_*" PROJECT_CLEANUP[LIBBITCOIN_SYSTEM_ON]="3rd_party/boost_${PROJECT_VERSIONS[BOOST_MAJOR]}_${PROJECT_VERSIONS[BOOST_MINOR]}_*"
PROJECT_CLEANUP[MINGW]="3rd_party/mingw64/mingw-w64-*" PROJECT_CLEANUP[MINGW]="3rd_party/mingw64/mingw-w64-*"
PROJECT_CLEANUP[OPENSSL]="3rd_party/openssl-*" PROJECT_CLEANUP[OPENSSL]="3rd_party/openssl-*"
@@ -36,10 +37,11 @@ PROJECT_DOWNLOADS[BOOST2]="https://archives.boost.io/release/${PROJECT_VERSIONS[
PROJECT_DOWNLOADS[CPP_HTTPLIB]="https://github.com/yhirose/cpp-httplib/archive/refs/tags/v${PROJECT_VERSIONS[CPP_HTTPLIB]}.tar.gz;cpp-httplib-${PROJECT_VERSIONS[CPP_HTTPLIB]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[CPP_HTTPLIB]="https://github.com/yhirose/cpp-httplib/archive/refs/tags/v${PROJECT_VERSIONS[CPP_HTTPLIB]}.tar.gz;cpp-httplib-${PROJECT_VERSIONS[CPP_HTTPLIB]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[CURL]="https://github.com/curl/curl/archive/refs/tags/curl-${PROJECT_VERSIONS[CURL2]}.tar.gz;curl-${PROJECT_VERSIONS[CURL]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[CURL]="https://github.com/curl/curl/archive/refs/tags/curl-${PROJECT_VERSIONS[CURL2]}.tar.gz;curl-${PROJECT_VERSIONS[CURL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[EXPAT]="https://github.com/libexpat/libexpat/archive/refs/tags/R_${PROJECT_VERSIONS[EXPAT2]}.tar.gz;expat-${PROJECT_VERSIONS[EXPAT]}.tar.gz;3rd_party/mingw64" PROJECT_DOWNLOADS[EXPAT]="https://github.com/libexpat/libexpat/archive/refs/tags/R_${PROJECT_VERSIONS[EXPAT2]}.tar.gz;expat-${PROJECT_VERSIONS[EXPAT]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[GCC]="https://ftp.gnu.org/gnu/gcc/gcc-${PROJECT_VERSIONS[GCC]}/gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;3rd_party/mingw64" PROJECT_DOWNLOADS[GCC]="https://mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-${PROJECT_VERSIONS[GCC]}/gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[GTEST]="https://github.com/google/googletest/archive/refs/tags/v${PROJECT_VERSIONS[GTEST]}.tar.gz;googletest-${PROJECT_VERSIONS[GTEST]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[GTEST]="https://github.com/google/googletest/archive/refs/tags/v${PROJECT_VERSIONS[GTEST]}.tar.gz;googletest-${PROJECT_VERSIONS[GTEST]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[ICU]="https://github.com/unicode-org/icu/archive/refs/tags/release-${PROJECT_VERSIONS[ICU]}.tar.gz;icu-release-${PROJECT_VERSIONS[ICU]}.tar.gz;3rd_party/mingw64" PROJECT_DOWNLOADS[ICU]="https://github.com/unicode-org/icu/archive/refs/tags/release-${PROJECT_VERSIONS[ICU]}.tar.gz;icu-release-${PROJECT_VERSIONS[ICU]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[JSON]="https://github.com/nlohmann/json/archive/refs/tags/v${PROJECT_VERSIONS[JSON]}.tar.gz;json-${PROJECT_VERSIONS[JSON]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[JSON]="https://github.com/nlohmann/json/archive/refs/tags/v${PROJECT_VERSIONS[JSON]}.tar.gz;json-${PROJECT_VERSIONS[JSON]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[INNOSETUP]="https://files.jrsoftware.org/is/6/innosetup-${PROJECT_VERSIONS[INNOSETUP]}.exe;innosetup-${PROJECT_VERSIONS[INNOSETUP]}.exe;3rd_party/mingw64"
PROJECT_DOWNLOADS[MINGW]="https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;;mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;3rd_party/mingw64" PROJECT_DOWNLOADS[MINGW]="https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;;mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;3rd_party/mingw64"
PROJECT_DOWNLOADS[OPENSSL]="https://github.com/openssl/openssl/releases/download/openssl-${PROJECT_VERSIONS[OPENSSL]}/openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[OPENSSL]="https://github.com/openssl/openssl/releases/download/openssl-${PROJECT_VERSIONS[OPENSSL]}/openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[PKG_CONFIG]="https://pkgconfig.freedesktop.org/releases/pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;3rd_party/mingw64" PROJECT_DOWNLOADS[PKG_CONFIG]="https://pkgconfig.freedesktop.org/releases/pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;3rd_party/mingw64"

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
@@ -43,8 +43,8 @@ make -j${CMAKE_BUILD_PARALLEL_LEVEL} || exit 1
popd popd
popd popd
if [ "${PROJECT_IS_MINGW}" != "1" ] && [ "${PROJECT_REQUIRE_ALPINE}" == "ON" ]; then if [ -f "${PROJECT_SOURCE_DIR}/LICENSE.md" ]; then
rsync -av --progress /usr/share/icu/74.2/ "${PROJECT_DIST_DIR}/icu/" rsync -av --progress "${PROJECT_SOURCE_DIR}/LICENSE.md" "${PROJECT_DIST_DIR}/"
fi fi
if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ] && [ "${PROJECT_IS_MINGW}" != "1" ]; then if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ] && [ "${PROJECT_IS_MINGW}" != "1" ]; then
@@ -57,12 +57,26 @@ fi
for APP in ${PROJECT_APP_LIST[@]}; do for APP in ${PROJECT_APP_LIST[@]}; do
if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ]; then if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ]; then
if [ "${PROJECT_IS_MINGW}" != "1" ]; then if [ "${PROJECT_IS_MINGW}" == "1" ]; then
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/"
else
rm "${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}" rm "${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
if [ "${PROJECT_ENABLE_CURL}" == "ON" ]; then if [ "${PROJECT_ENABLE_CURL}" == "ON" ]; then
mv "${PROJECT_DIST_DIR}/cacert.pem" "${PROJECT_DIST_DIR}/bin/cacert.pem" mv "${PROJECT_DIST_DIR}/cacert.pem" "${PROJECT_DIST_DIR}/bin/cacert.pem"
fi fi
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/bin/" rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/bin/"
if [ "${PROJECT_IS_DARWIN}" == "1" ]; then
cat <<EOF >>"${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
#!/bin/sh
PROJECT_SCRIPTS_DIR=\$(realpath "\$0")
PROJECT_SCRIPTS_DIR=\$(dirname "\${PROJECT_SCRIPTS_DIR}")
DYLD_LIBRARY_PATH="\${PROJECT_SCRIPTS_DIR}/lib:\${PROJECT_SCRIPTS_DIR}/lib64:\${DYLD_LIBRARY_PATH}"
export DYLD_LIBRARY_PATH
\${PROJECT_SCRIPTS_DIR}/bin/${APP}${PROJECT_APP_BINARY_EXT} \$*
EOF
else
cat <<EOF >>"${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}" cat <<EOF >>"${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
#!/bin/sh #!/bin/sh
PROJECT_SCRIPTS_DIR=\$(realpath "\$0") PROJECT_SCRIPTS_DIR=\$(realpath "\$0")
@@ -72,19 +86,29 @@ export LD_LIBRARY_PATH="\${PROJECT_SCRIPTS_DIR}/lib:\${PROJECT_SCRIPTS_DIR}/lib6
\${PROJECT_SCRIPTS_DIR}/bin/${APP}${PROJECT_APP_BINARY_EXT} \$* \${PROJECT_SCRIPTS_DIR}/bin/${APP}${PROJECT_APP_BINARY_EXT} \$*
EOF EOF
chmod +x "${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
else
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/"
fi fi
else chmod +x "${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
fi
elif [ ! -d "${PROJECT_BUILD_DIR}/build/${APP}.app" ]; then
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/" rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/"
fi fi
done done
if [ -d "${PROJECT_BUILD_DIR}/build/${PROJECT_NAME}.app" ]; then
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${PROJECT_NAME}.app/" \
"${PROJECT_DIST_DIR}/${PROJECT_NAME}.app/"
fi
if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then
if [ -d "${PROJECT_DIST_DIR}/${PROJECT_NAME}.app" ]; then
rsync -av --progress "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/build/web/" \
"${PROJECT_DIST_DIR}/${PROJECT_NAME}.app/Contents/Resources/web/"
cp "${PROJECT_DIST_DIR}/cacert.pem" "${PROJECT_DIST_DIR}/${PROJECT_NAME}.app/Contents/MacOS/cacert.pem"
else
rsync -av --progress "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/build/web/" \ rsync -av --progress "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/build/web/" \
"${PROJECT_DIST_DIR}/web/" "${PROJECT_DIST_DIR}/web/"
fi fi
fi
if [ "${PROJECT_IS_MINGW}" == "1" ]; then if [ "${PROJECT_IS_MINGW}" == "1" ]; then
. "${PROJECT_SCRIPTS_DIR}/copy_mingw64_deps.sh" "$1" "$2" "$3" "$4" "$5" . "${PROJECT_SCRIPTS_DIR}/copy_mingw64_deps.sh" "$1" "$2" "$3" "$4" "$5"

View File

@@ -1,11 +1,11 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" . "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5"
if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then
if [ "${PROJECT_IS_MINGW}" == "0" ] || [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then if [[ "${PROJECT_IS_DARWIN}" == "0" && ("${PROJECT_IS_MINGW}" == "0" || "${PROJECT_IS_MINGW_UNIX}" == "1") ]]; then
FLUTTER_CONTAINER_NAME="${PROJECT_NAME}_flutter" FLUTTER_CONTAINER_NAME="${PROJECT_NAME}_flutter"
FLUTTER_TAG_NAME="${PROJECT_NAME}:flutter" FLUTTER_TAG_NAME="${PROJECT_NAME}:flutter"

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
TEMP_DIR=$(mktemp -d) TEMP_DIR=$(mktemp -d)
@@ -12,6 +12,24 @@ function error_exit() {
exit $2 exit $2
} }
function cleanup_packages() {
local SOURCE_FILE=$1
pushd "${PROJECT_DIST_DIR}"
if [ -f "${SOURCE_FILE}" ]; then
rm -f "${SOURCE_FILE}" || error_exit "failed to delete file: ${SOURCE_FILE}" 1
fi
if [ -f "${SOURCE_FILE}.sha256" ]; then
rm -f "${SOURCE_FILE}.sha256" || error_exit "failed to delete file: ${SOURCE_FILE}.sha256" 1
fi
if [ -f "${SOURCE_FILE}.sig" ]; then
rm -f "${SOURCE_FILE}.sig" || error_exit "failed to delete file: ${SOURCE_FILE}.sig" 1
fi
popd
}
function create_file_validations() { function create_file_validations() {
local SOURCE_FILE=$1 local SOURCE_FILE=$1
sha256sum ${SOURCE_FILE} >${SOURCE_FILE}.sha256 || error_exit "failed to create sha256 for file: ${SOURCE_FILE}" 1 sha256sum ${SOURCE_FILE} >${SOURCE_FILE}.sha256 || error_exit "failed to create sha256 for file: ${SOURCE_FILE}" 1
@@ -25,32 +43,26 @@ if [ ! -d "${PROJECT_DIST_DIR}" ]; then
error_exit "dist directory not found: ${PROJECT_DIST_DIR}" 2 error_exit "dist directory not found: ${PROJECT_DIST_DIR}" 2
fi fi
pushd "${PROJECT_DIST_DIR}" cleanup_packages "${PROJECT_OUT_FILE}"
if [ -f "${PROJECT_OUT_FILE}" ]; then cleanup_packages "${PROJECT_FILE_PART}_setup.exe"
rm -f "${PROJECT_OUT_FILE}" || error_exit "failed to delete file: ${PROJECT_OUT_FILE}" 1 cleanup_packages "${PROJECT_FILE_PART}.dmg"
fi
if [ -f "${PROJECT_OUT_FILE}.sha256" ]; then
rm -f "${PROJECT_OUT_FILE}.sha256" || error_exit "failed to delete file: ${PROJECT_OUT_FILE}.sha256" 1
fi
if [ -f "${PROJECT_OUT_FILE}.sig" ]; then
rm -f "${PROJECT_OUT_FILE}.sig" || error_exit "failed to delete file: ${PROJECT_OUT_FILE}.sig" 1
fi
popd
rsync -av --progress ${PROJECT_DIST_DIR}/ ${TEMP_DIR}/${PROJECT_NAME}/ || error_exit "failed to rsync" 1 rsync -av --progress ${PROJECT_DIST_DIR}/ ${TEMP_DIR}/${PROJECT_NAME}/ || error_exit "failed to rsync" 1
for APP in ${PROJECT_APP_LIST[@]}; do for APP in ${PROJECT_APP_LIST[@]}; do
if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ] && [ "${PROJECT_IS_MINGW}" != "1" ]; then if [ -d "${TEMP_DIR}/${PROJECT_NAME}/${APP}.app" ]; then
strip ${TEMP_DIR}/${PROJECT_NAME}/bin/${APP}${PROJECT_APP_BINARY_EXT} strip "${TEMP_DIR}/${PROJECT_NAME}/${APP}.app/Contents/MacOS/${APP}${PROJECT_APP_BINARY_EXT}"
elif [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ] && [ "${PROJECT_IS_MINGW}" != "1" ]; then
strip "${TEMP_DIR}/${PROJECT_NAME}/bin/${APP}${PROJECT_APP_BINARY_EXT}"
else else
strip ${TEMP_DIR}/${PROJECT_NAME}/${APP}${PROJECT_APP_BINARY_EXT} strip "${TEMP_DIR}/${PROJECT_NAME}/${APP}${PROJECT_APP_BINARY_EXT}"
fi fi
done done
pushd "${TEMP_DIR}/${PROJECT_NAME}/" pushd "${TEMP_DIR}/${PROJECT_NAME}/"
IFS=$'\n' IFS=$'\n'
set -f set -f
FILE_LIST=$(find . -type f) FILE_LIST=$(find . -type f -not -path "*/.app/*")
for FILE in ${FILE_LIST}; do for FILE in ${FILE_LIST}; do
create_file_validations "${FILE}" create_file_validations "${FILE}"
done done
@@ -63,4 +75,79 @@ tar cvzf "${PROJECT_OUT_FILE}" -C ${TEMP_DIR} . || error_exit "failed to create
create_file_validations "${PROJECT_OUT_FILE}" create_file_validations "${PROJECT_OUT_FILE}"
popd popd
if [ -d "${TEMP_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.app" ]; then
APP_SRC="${TEMP_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.app"
DMG_ROOT="${TEMP_DIR}/dmgroot"
mkdir -p "${DMG_ROOT}" || error_exit "failed to create dmgroot" 1
INSTALLER="${DMG_ROOT}/Install ${PROJECT_NAME}.command"
INSTALLER_SRC="${PROJECT_SOURCE_DIR}/${PROJECT_NAME}/Install ${PROJECT_NAME}.command"
if [ -f "${INSTALLER_SRC}" ]; then
HIDDEN_DIR="${DMG_ROOT}/.payload"
mkdir -p "${HIDDEN_DIR}" || error_exit "failed to create payload dir" 1
APP_DEST_DIR="${HIDDEN_DIR}"
else
APP_DEST_DIR="${DMG_ROOT}"
fi
rsync -a "${APP_SRC}" "${APP_DEST_DIR}/" || error_exit "failed to stage app bundle" 1
if [ -f "${INSTALLER_SRC}" ]; then
chflags hidden "${HIDDEN_DIR}" "${HIDDEN_DIR}/${PROJECT_NAME}.app" 2>/dev/null || true
fi
ln -s /Applications "${DMG_ROOT}/Applications" 2>/dev/null || true
if [ -f "${INSTALLER_SRC}" ]; then
cp -f "${INSTALLER_SRC}" "${INSTALLER}" || error_exit "failed to copy install command" 1
chmod +x "${INSTALLER}" || error_exit "failed to chmod install command" 1
SAFE_PREFIX="$(printf '%s' "${PROJECT_MACOS_BUNDLE_ID}" | sed -e 's/[\/&]/\\&/g')"
/usr/bin/sed -i '' -e "s|^LABEL_PREFIX=.*$|LABEL_PREFIX=\"${SAFE_PREFIX}\"|g" "${INSTALLER}"
LABEL_ASSIGNED="$(/usr/bin/awk -F= '/^LABEL_PREFIX=/{sub(/^[^=]*=/,""); gsub(/^"|"$/,""); print; exit}' "${INSTALLER}")"
if ! /usr/bin/awk -v v="${LABEL_ASSIGNED}" '
BEGIN {
if (length(v) == 0) exit 1;
if (v == "__LABEL_PREFIX__") exit 1;
if (v !~ /^[A-Za-z0-9._-]+$/) exit 1;
if (v !~ /\./) exit 1;
exit 0;
}'; then
error_exit "DMG build abort: invalid LABEL_PREFIX written to installer (value: \"${LABEL_ASSIGNED}\"). Check PROJECT_MACOS_BUNDLE_ID and sed substitution." 1
fi
fi
DMG_OUT="${PROJECT_FILE_PART}.dmg"
hdiutil create \
-volname "${PROJECT_NAME}" \
-fs HFS+ \
-srcfolder "${DMG_ROOT}" \
-ov -format UDZO \
"${PROJECT_DIST_DIR}/${DMG_OUT}" || error_exit "hdiutil failed" 1
pushd "${PROJECT_DIST_DIR}"
create_file_validations "${DMG_OUT}"
popd
elif [ "${PROJECT_IS_MINGW}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss" ]; then
cp -f "${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss" "${TEMP_DIR}/${PROJECT_NAME}.iss"
rsync -av --progress --delete ${PROJECT_SOURCE_DIR}/support/3rd_party/*.msi ${TEMP_DIR}/3rd_party/
pushd "${TEMP_DIR}"
if [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then
wine64 "c:/Program Files (x86)/Inno Setup 6/iscc.exe" "${PROJECT_NAME}.iss" || exit 1
else
iscc "${PROJECT_NAME}.iss" || exit 1
fi
pushd "Output"
create_file_validations "${PROJECT_FILE_PART}_setup.exe"
cp -f * "${PROJECT_DIST_DIR}/"
popd
popd
fi
error_exit "created package ${PROJECT_FILE_PART}" 0 error_exit "created package ${PROJECT_FILE_PART}" 0

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
@@ -11,7 +11,7 @@ fi
"${PROJECT_SOURCE_DIR}/scripts/make_flutter.sh" "${PROJECT_BUILD_ARCH}" "${PROJECT_CMAKE_BUILD_TYPE}" "${PROJECT_BUILD_CLEAN}" 0 0 || exit 1 "${PROJECT_SOURCE_DIR}/scripts/make_flutter.sh" "${PROJECT_BUILD_ARCH}" "${PROJECT_CMAKE_BUILD_TYPE}" "${PROJECT_BUILD_CLEAN}" 0 0 || exit 1
if [ "${PROJECT_REQUIRE_ALPINE}" == "ON" ] || [ "${PROJECT_IS_ARM64}" == "1" ]; then if [[ "${PROJECT_IS_DARWIN}" == "0" && ("${PROJECT_REQUIRE_ALPINE}" == "ON" || "${PROJECT_IS_ARM64}" == "1") ]]; then
DOCKER_NAME=alpine DOCKER_NAME=alpine
DOCKER_CONTAINER=${PROJECT_NAME}_${DOCKER_NAME}_${PROJECT_BUILD_ARCH} DOCKER_CONTAINER=${PROJECT_NAME}_${DOCKER_NAME}_${PROJECT_BUILD_ARCH}
DOCKER_TAG=${PROJECT_NAME}:${DOCKER_NAME} DOCKER_TAG=${PROJECT_NAME}:${DOCKER_NAME}

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
DOCKER_NAME=$1 DOCKER_NAME=$1

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0") PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
PROJECT_MSYS2_PACKAGE_LIST=() PROJECT_MSYS2_PACKAGE_LIST=()

View File

@@ -1,27 +1,27 @@
#!/bin/bash #!/usr/bin/env bash
declare -A PROJECT_VERSIONS declare -A PROJECT_VERSIONS
PROJECT_VERSIONS[BINUTILS]="2.43" PROJECT_VERSIONS[BINUTILS]="2.44"
PROJECT_VERSIONS[BOOST2_MAJOR]="1" PROJECT_VERSIONS[BOOST2_MAJOR]="1"
PROJECT_VERSIONS[BOOST2_MINOR]="76" PROJECT_VERSIONS[BOOST2_MINOR]="76"
PROJECT_VERSIONS[BOOST2_PATCH]="0" PROJECT_VERSIONS[BOOST2_PATCH]="0"
PROJECT_VERSIONS[BOOST_MAJOR]="1" PROJECT_VERSIONS[BOOST_MAJOR]="1"
PROJECT_VERSIONS[BOOST_MINOR]="87" PROJECT_VERSIONS[BOOST_MINOR]="89"
PROJECT_VERSIONS[BOOST_PATCH]="0" PROJECT_VERSIONS[BOOST_PATCH]="0"
PROJECT_VERSIONS[CPP_HTTPLIB]="0.19.0" PROJECT_VERSIONS[CPP_HTTPLIB]="0.26.0"
PROJECT_VERSIONS[CURL]="8.12.1" PROJECT_VERSIONS[CURL]="8.16.0"
PROJECT_VERSIONS[CURL2]="8_12_1" PROJECT_VERSIONS[CURL2]="8_16_0"
PROJECT_VERSIONS[EXPAT]="2.6.4" PROJECT_VERSIONS[EXPAT]="2.7.1"
PROJECT_VERSIONS[EXPAT2]="2_6_4" PROJECT_VERSIONS[EXPAT2]="2_7_1"
PROJECT_VERSIONS[GCC]="14.2.0" PROJECT_VERSIONS[GCC]="15.2.0"
PROJECT_VERSIONS[GTEST]="1.16.0" PROJECT_VERSIONS[GTEST]="1.17.0"
PROJECT_VERSIONS[ICU]="76-1" PROJECT_VERSIONS[ICU]="76-1"
PROJECT_VERSIONS[JSON]="3.11.3" PROJECT_VERSIONS[INNOSETUP]="6.5.4"
PROJECT_VERSIONS[MESA]="23.3.3" PROJECT_VERSIONS[JSON]="3.12.0"
PROJECT_VERSIONS[MINGW]="12.0.0" PROJECT_VERSIONS[MINGW]="13.0.0"
PROJECT_VERSIONS[OPENSSL]="3.4.1" PROJECT_VERSIONS[OPENSSL]="3.6.0"
PROJECT_VERSIONS[PKG_CONFIG]="0.29.2" PROJECT_VERSIONS[PKG_CONFIG]="0.29.2"
PROJECT_VERSIONS[ROCKSDB]="9.10.0" PROJECT_VERSIONS[ROCKSDB]="10.5.1"
PROJECT_VERSIONS[SPDLOG]="1.15.1" PROJECT_VERSIONS[SPDLOG]="1.15.3"
PROJECT_VERSIONS[ZLIB]="1.3.1" PROJECT_VERSIONS[ZLIB]="1.3.1"
export PROJECT_VERSIONS export PROJECT_VERSIONS

Binary file not shown.

View File

@@ -1 +0,0 @@
c9b9e0524666e1cd088f0874c57c1ce7c0eaa8552f9f4e15c755d5201fc8c608 *cpp-httplib-0.19.0.tar.gz

BIN
support/3rd_party/cpp-httplib-0.26.0.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
a66f908f50ccb119769adce44fe1eac75f81b6ffab7c4ac0211bb663ffeb2688 cpp-httplib-0.26.0.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
6edc063d1ebaf9cf3b3b46e9fef2f3cd8932694989ecd43d005d6e828426d09f *curl-8.12.1.tar.gz

BIN
support/3rd_party/curl-8.16.0.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
d4d9a5001b491f5726efe9b50bc4aad03029506e73c9261272e809c64b05e814 curl-8.16.0.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
7b42b4d6ed48810c5362c265a17faebe90dc2373c885e5216439d37927f02926 googletest-1.15.2.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
78c676fc63881529bf97bf9d45948d905a66833fbfa5318ea2cd7478cb98f399 *googletest-1.16.0.tar.gz

BIN
support/3rd_party/googletest-1.17.0.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c googletest-1.17.0.tar.gz

16
support/3rd_party/icu_configure.sh vendored Executable file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
if [ "$(uname -m)" == "arm64" ] &&
[ "${PROJECT_IS_ARM64}" == "0" ]; then
HOST_CFG="--host=x86_64-apple-darwin"
export CC="clang -arch x86_64"
export CXX="clang++ -arch x86_64"
fi
CXXFLAGS="-std=gnu++17 -march=$1 -mtune=generic" ./configure \
--disable-samples \
--disable-tests \
--enable-shared=$3 \
--enable-static=yes \
--prefix="$2" \
${HOST_CFG}

Binary file not shown.

View File

@@ -1 +0,0 @@
0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406 json-3.11.3.tar.gz

BIN
support/3rd_party/json-3.12.0.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187 *json-3.12.0.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
b53606f443ac8f01d1d5fc9c39497f2af322d99e14cea5c0b4b124d630379365 binutils-2.43.tar.xz

BIN
support/3rd_party/mingw64/binutils-2.44.tar.xz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237 binutils-2.44.tar.xz

Binary file not shown.

View File

@@ -1 +0,0 @@
372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2 *expat-2.6.4.tar.gz

BIN
support/3rd_party/mingw64/expat-2.7.1.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb expat-2.7.1.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293 gcc-14.2.0.tar.gz

BIN
support/3rd_party/mingw64/gcc-15.2.0.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
7294d65cc1a0558cb815af0ca8c7763d86f7a31199794ede3f630c0d1b0a5723 gcc-15.2.0.tar.gz

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
fa73bf47a4da250d185d07561c2bfda387e5e20db77e4570004cf6a133cc10b1 innosetup-6.5.4.exe

View File

@@ -1 +0,0 @@
cc41898aac4b6e8dd5cffd7331b9d9515b912df4420a3a612b5ea2955bbeed2f mingw-w64-v12.0.0.tar.bz2

View File

@@ -0,0 +1 @@
5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf mingw-w64-v13.0.0.tar.bz2

Binary file not shown.

Binary file not shown.

View File

@@ -1 +0,0 @@
002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3 *openssl-3.4.1.tar.gz

BIN
support/3rd_party/openssl-3.6.0.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9 openssl-3.6.0.tar.gz

BIN
support/3rd_party/rocksdb-10.5.1.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
7ec942baab802b2845188d02bc5d4e42c29236e61bcbc08f5b3a6bdd92290c22 rocksdb-10.5.1.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
fdccab16133c9d927a183c2648bcea8d956fb41eb1df2aacaa73eb0b95e43724 *rocksdb-9.10.0.tar.gz

Binary file not shown.

View File

@@ -1 +0,0 @@
25c843860f039a1600f232c6eb9e01e6627f7d030a2ae5e232bdd3c9205d26cc *spdlog-1.15.1.tar.gz

BIN
support/3rd_party/spdlog-1.15.3.tar.gz LFS vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67 spdlog-1.15.3.tar.gz

View File

@@ -24,6 +24,7 @@
#include "utils/config.hpp" #include "utils/config.hpp"
#include "utils/atomic.hpp"
#include "utils/base64.hpp" #include "utils/base64.hpp"
#include "utils/collection.hpp" #include "utils/collection.hpp"
#if defined(_WIN32) #if defined(_WIN32)
@@ -49,6 +50,7 @@
#include "utils/path.hpp" #include "utils/path.hpp"
#include "utils/string.hpp" #include "utils/string.hpp"
#include "utils/time.hpp" #include "utils/time.hpp"
#include "utils/ttl_cache.hpp"
#if !defined(_WIN32) #if !defined(_WIN32)
#include "utils/unix.hpp" #include "utils/unix.hpp"
#endif // !defined(_WIN32) #endif // !defined(_WIN32)

View File

@@ -0,0 +1,118 @@
/*
Copyright <2018-2025> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef MONITARR_INCLUDE_UTILS_ATOMIC_HPP_
#define MONITARR_INCLUDE_UTILS_ATOMIC_HPP_
#include "utils/config.hpp"
namespace monitarr::utils {
template <typename data_t> class atomic final {
public:
atomic() : mtx_(std::make_shared<std::mutex>()) {}
atomic(const atomic &at_data)
: data_(at_data.load()), mtx_(std::make_shared<std::mutex>()) {}
atomic(data_t data)
: data_(std::move(data)), mtx_(std::make_shared<std::mutex>()) {}
atomic(atomic &&) = default;
~atomic() = default;
private:
data_t data_;
std::shared_ptr<std::mutex> mtx_;
public:
[[nodiscard]] auto load() const -> data_t {
mutex_lock lock(*mtx_);
return data_;
}
auto store(data_t data) -> data_t {
mutex_lock lock(*mtx_);
data_ = std::move(data);
return data_;
}
auto operator=(const atomic &at_data) -> atomic & {
if (&at_data == this) {
return *this;
}
store(at_data.load());
return *this;
}
auto operator=(atomic &&) -> atomic & = default;
auto operator=(data_t data) -> atomic & {
if (&data == &data_) {
return *this;
}
store(std::move(data));
return *this;
}
[[nodiscard]] auto operator==(const atomic &at_data) const -> bool {
if (&at_data == this) {
return true;
}
mutex_lock lock(*mtx_);
return at_data.load() == data_;
}
[[nodiscard]] auto operator==(const data_t &data) const -> bool {
if (&data == &data_) {
return true;
}
mutex_lock lock(*mtx_);
return data == data_;
}
[[nodiscard]] auto operator!=(const atomic &at_data) const -> bool {
if (&at_data == this) {
return false;
}
mutex_lock lock(*mtx_);
return at_data.load() != data_;
}
[[nodiscard]] auto operator!=(const data_t &data) const -> bool {
if (&data == &data_) {
return false;
}
mutex_lock lock(*mtx_);
return data != data_;
}
[[nodiscard]] operator data_t() const { return load(); }
};
} // namespace monitarr::utils
#endif // MONITARR_INCLUDE_UTILS_ATOMIC_HPP_

View File

@@ -1,10 +1,11 @@
// NOLINTBEGIN // NOLINTBEGIN
#ifndef _MACARON_BASE64_H_ #ifndef MACARON_BASE64_H_
#define _MACARON_BASE64_H_ #define MACARON_BASE64_H_
/** /**
* The MIT License (MIT) * The MIT License (MIT)
* Copyright (c) 2016 tomykaira * Copyright (c) 2016 tomykaira
* Copyright (c) 2025 scott.e.graves@protonmail.com
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the * a copy of this software and associated documentation files (the
@@ -39,12 +40,16 @@
#endif #endif
#include <array> #include <array>
#include <stdexcept>
#include <string> #include <string>
#include <string_view>
#include <vector> #include <vector>
namespace macaron::Base64 { namespace macaron::Base64 {
static std::string Encode(const unsigned char *data, std::size_t len) {
static constexpr std::array<unsigned char, 64U> sEncodingTable{ // --- Alphabets --------------------------------------------------------------
static constexpr std::array<unsigned char, 64U> kStdAlphabet{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
@@ -52,108 +57,255 @@ static std::string Encode(const unsigned char *data, std::size_t len) {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
}; };
auto in_len{len}; static constexpr std::array<unsigned char, 64U> kUrlAlphabet{
std::string ret; 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
if (in_len > 0) { 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
std::size_t out_len{4U * ((in_len + 2U) / 3U)}; 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
ret = std::string(out_len, '\0'); 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
std::size_t i; '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_',
auto *p = reinterpret_cast<unsigned char *>(ret.data());
for (i = 0U; i < in_len - 2U; i += 3U) {
*p++ = sEncodingTable[(data[i] >> 2U) & 0x3F];
*p++ = sEncodingTable[((data[i] & 0x3) << 4U) |
((int)(data[i + 1U] & 0xF0) >> 4U)];
*p++ = sEncodingTable[((data[i + 1] & 0xF) << 2) |
((int)(data[i + 2U] & 0xC0) >> 6U)];
*p++ = sEncodingTable[data[i + 2U] & 0x3F];
}
if (i < in_len) {
*p++ = sEncodingTable[(data[i] >> 2U) & 0x3F];
if (i == (in_len - 1U)) {
*p++ = sEncodingTable[((data[i] & 0x3) << 4U)];
*p++ = '=';
} else {
*p++ = sEncodingTable[((data[i] & 0x3) << 4U) |
((int)(data[i + 1U] & 0xF0) >> 4U)];
*p++ = sEncodingTable[((data[i + 1U] & 0xF) << 2U)];
}
*p++ = '=';
}
}
return ret;
}
[[maybe_unused]] static std::string Encode(std::string_view data) {
return Encode(reinterpret_cast<const unsigned char *>(data.data()),
data.size());
}
[[maybe_unused]] static std::vector<unsigned char>
Decode(std::string_view input) {
static constexpr std::array<unsigned char, 256> kDecodingTable{
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 64, 64, 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64,
}; };
// Decoding table that accepts BOTH standard and URL-safe alphabets.
static constexpr std::array<unsigned char, 256U> kDecodingTable = [] {
std::array<unsigned char, 256U> t{};
t.fill(64U);
// 'A'-'Z'
for (unsigned char c = 'A'; c <= 'Z'; ++c)
t[c] = static_cast<unsigned char>(c - 'A');
// 'a'-'z'
for (unsigned char c = 'a'; c <= 'z'; ++c)
t[c] = static_cast<unsigned char>(26 + c - 'a');
// '0'-'9'
for (unsigned char c = '0'; c <= '9'; ++c)
t[c] = static_cast<unsigned char>(52 + c - '0');
// Standard extras
t[static_cast<unsigned char>('+')] = 62U;
t[static_cast<unsigned char>('/')] = 63U;
// URL-safe extras
t[static_cast<unsigned char>('-')] = 62U;
t[static_cast<unsigned char>('_')] = 63U;
return t;
}();
// --- Encoding ---------------------------------------------------------------
/**
* Encode to Base64.
* @param data pointer to bytes
* @param len number of bytes
* @param url_safe if true, use URL-safe alphabet ("-","_") instead of ("+","/")
* @param pad if true, add '=' padding; if false, omit padding (RFC 4648
* §5)
*/
static std::string Encode(const unsigned char *data, std::size_t len,
bool url_safe = false, bool pad = true) {
const auto &alpha = url_safe ? kUrlAlphabet : kStdAlphabet;
std::string out;
if (len == 0U) {
return out;
}
const std::size_t full_blocks = len / 3U;
const std::size_t rem = len % 3U;
std::size_t out_len{};
if (pad) {
out_len = 4U * ((len + 2U) / 3U);
} else {
// Unpadded length per RFC 4648 §5
out_len = 4U * full_blocks + (rem == 0U ? 0U : (rem == 1U ? 2U : 3U));
}
out.assign(out_len, '\0');
auto *p = reinterpret_cast<unsigned char *>(out.data());
std::size_t i = 0;
// Full 3-byte blocks -> 4 chars
for (; i + 2U < len; i += 3U) {
const unsigned char b0 = data[i + 0U];
const unsigned char b1 = data[i + 1U];
const unsigned char b2 = data[i + 2U];
*p++ = alpha[(b0 >> 2U) & 0x3F];
*p++ = alpha[((b0 & 0x03U) << 4U) | ((b1 >> 4U) & 0x0FU)];
*p++ = alpha[((b1 & 0x0FU) << 2U) | ((b2 >> 6U) & 0x03U)];
*p++ = alpha[b2 & 0x3FU];
}
// Remainder
if (rem == 1U) {
const unsigned char b0 = data[i];
*p++ = alpha[(b0 >> 2U) & 0x3F];
*p++ = alpha[(b0 & 0x03U) << 4U];
if (pad) {
*p++ = '=';
*p++ = '=';
}
} else if (rem == 2U) {
const unsigned char b0 = data[i + 0U];
const unsigned char b1 = data[i + 1U];
*p++ = alpha[(b0 >> 2U) & 0x3F];
*p++ = alpha[((b0 & 0x03U) << 4U) | ((b1 >> 4U) & 0x0FU)];
*p++ = alpha[(b1 & 0x0FU) << 2U];
if (pad) {
*p++ = '=';
}
}
return out;
}
[[maybe_unused]] static std::string
Encode(std::string_view data, bool url_safe = false, bool pad = true) {
return Encode(reinterpret_cast<const unsigned char *>(data.data()),
data.size(), url_safe, pad);
}
[[maybe_unused]] static std::string
EncodeUrlSafe(const unsigned char *data, std::size_t len, bool pad = false) {
return Encode(data, len, /*url_safe=*/true, /*pad=*/pad);
}
[[maybe_unused]] static std::string EncodeUrlSafe(std::string_view data,
bool pad = false) {
return Encode(reinterpret_cast<const unsigned char *>(data.data()),
data.size(), /*url_safe=*/true, /*pad=*/pad);
}
// --- Decoding ---------------------------------------------------------------
/**
* Decode standard OR URL-safe Base64.
* Accepts inputs with or without '=' padding.
* Throws std::runtime_error on malformed input.
*/
[[maybe_unused]] static std::vector<unsigned char>
Decode(std::string_view input) {
std::vector<unsigned char> out; std::vector<unsigned char> out;
if (not input.empty()) { if (input.empty()) {
auto in_len{input.size()}; return out;
if (in_len % 4U != 0U) {
throw std::runtime_error("Input data size is not a multiple of 4");
} }
std::size_t out_len{in_len / 4U * 3U}; std::size_t inLen = input.size();
if (input[in_len - 1U] == '=') { std::size_t rem = inLen % 4U;
out_len--;
// padded if multiple of 4 and last char is '='
bool hasPadding = (rem == 0U) && (inLen >= 4U) && (input[inLen - 1U] == '=');
// compute output length
std::size_t outLen{};
if (hasPadding) {
outLen = (inLen / 4U) * 3U;
if (input[inLen - 1U] == '=')
outLen--;
if (input[inLen - 2U] == '=')
outLen--;
} else {
if (rem == 1U) {
throw std::runtime_error("Invalid Base64 length (mod 4 == 1)");
} }
if (input[in_len - 2U] == '=') { outLen = (inLen / 4U) * 3U + (rem == 0U ? 0U : (rem == 2U ? 1U : 2U));
out_len--;
} }
out.resize(out_len); out.resize(outLen);
for (std::size_t i = 0U, j = 0U; i < in_len;) { auto readVal = [](unsigned char c) -> unsigned char {
std::uint32_t a = unsigned char v = kDecodingTable[c];
input.at(i) == '=' if (v == 64U) {
? 0U & i++ throw std::runtime_error("Invalid Base64 character");
: kDecodingTable[static_cast<unsigned char>(input.at(i++))]; }
std::uint32_t b = return v;
input.at(i) == '=' };
? 0U & i++
: kDecodingTable[static_cast<unsigned char>(input.at(i++))];
std::uint32_t c =
input.at(i) == '='
? 0U & i++
: kDecodingTable[static_cast<unsigned char>(input.at(i++))];
std::uint32_t d =
input.at(i) == '='
? 0U & i++
: kDecodingTable[static_cast<unsigned char>(input.at(i++))];
std::uint32_t triple = std::size_t i = 0U;
(a << 3U * 6U) + (b << 2U * 6U) + (c << 1U * 6U) + (d << 0U * 6U); std::size_t j = 0U;
if (j < out_len) // process all full unpadded quartets
out[j++] = (triple >> 2U * 8U) & 0xFF; std::size_t lastFull =
if (j < out_len) hasPadding ? (inLen - 4U) : (rem == 0U ? inLen : (inLen - rem));
out[j++] = (triple >> 1U * 8U) & 0xFF;
if (j < out_len) while (i + 4U <= lastFull) {
out[j++] = (triple >> 0U * 8U) & 0xFF; unsigned char a = readVal(static_cast<unsigned char>(input[i + 0U]));
unsigned char b = readVal(static_cast<unsigned char>(input[i + 1U]));
unsigned char c = readVal(static_cast<unsigned char>(input[i + 2U]));
unsigned char d = readVal(static_cast<unsigned char>(input[i + 3U]));
i += 4U;
std::uint32_t triple = (static_cast<std::uint32_t>(a) << 18U) |
(static_cast<std::uint32_t>(b) << 12U) |
(static_cast<std::uint32_t>(c) << 6U) |
(static_cast<std::uint32_t>(d));
if (j < outLen)
out[j++] = static_cast<unsigned char>((triple >> 16U) & 0xFFU);
if (j < outLen)
out[j++] = static_cast<unsigned char>((triple >> 8U) & 0xFFU);
if (j < outLen)
out[j++] = static_cast<unsigned char>(triple & 0xFFU);
}
// tail: padded quartet or unpadded remainder
if (i < inLen) {
std::size_t left = inLen - i;
if (left == 4U) {
bool thirdIsPad = (input[i + 2U] == '=');
bool fourthIsPad = (input[i + 3U] == '=');
// '=' is never allowed in positions 1 or 2 of any quartet
if (input[i + 0U] == '=' || input[i + 1U] == '=') {
throw std::runtime_error("Invalid Base64 padding placement");
}
unsigned char a = readVal(static_cast<unsigned char>(input[i + 0U]));
unsigned char b = readVal(static_cast<unsigned char>(input[i + 1U]));
unsigned char c = 0U;
unsigned char d = 0U;
if (!thirdIsPad) {
c = readVal(static_cast<unsigned char>(input[i + 2U]));
if (!fourthIsPad) {
d = readVal(static_cast<unsigned char>(input[i + 3U]));
}
} else {
// if the 3rd is '=', the 4th must also be '='
if (!fourthIsPad) {
throw std::runtime_error("Invalid Base64 padding placement");
}
}
i += 4U;
std::uint32_t triple = (static_cast<std::uint32_t>(a) << 18U) |
(static_cast<std::uint32_t>(b) << 12U) |
(static_cast<std::uint32_t>(c) << 6U) |
(static_cast<std::uint32_t>(d));
if (j < outLen)
out[j++] = static_cast<unsigned char>((triple >> 16U) & 0xFFU);
if (!thirdIsPad && j < outLen)
out[j++] = static_cast<unsigned char>((triple >> 8U) & 0xFFU);
if (!fourthIsPad && !thirdIsPad && j < outLen)
out[j++] = static_cast<unsigned char>(triple & 0xFFU);
} else if (left == 2U || left == 3U) {
unsigned char a = readVal(static_cast<unsigned char>(input[i + 0U]));
unsigned char b = readVal(static_cast<unsigned char>(input[i + 1U]));
unsigned char c = (left == 3U)
? readVal(static_cast<unsigned char>(input[i + 2U]))
: 0U;
i += left;
std::uint32_t triple = (static_cast<std::uint32_t>(a) << 18U) |
(static_cast<std::uint32_t>(b) << 12U) |
(static_cast<std::uint32_t>(c) << 6U);
if (j < outLen)
out[j++] = static_cast<unsigned char>((triple >> 16U) & 0xFFU);
if (left == 3U && j < outLen)
out[j++] = static_cast<unsigned char>((triple >> 8U) & 0xFFU);
} else {
throw std::runtime_error("Invalid Base64 length (mod 4 == 1)");
} }
} }
@@ -169,6 +321,5 @@ Decode(std::string_view input) {
#pragma clang diagnostic pop #pragma clang diagnostic pop
#endif #endif
#endif /* _MACARON_BASE64_H_ */ #endif /* MACARON_BASE64_H_ */
// NOLINTEND // NOLINTEND

View File

@@ -75,7 +75,7 @@ template <typename val_t>
-> bool { -> bool {
MONITARR_USES_FUNCTION_NAME(); MONITARR_USES_FUNCTION_NAME();
static constexpr const auto base16{16}; static constexpr auto base16{16};
try { try {
val.clear(); val.clear();
@@ -158,7 +158,7 @@ template <typename col_t>
inline auto to_hex_string(const col_t &collection) -> std::string { inline auto to_hex_string(const col_t &collection) -> std::string {
static_assert(sizeof(typename col_t::value_type) == 1U, static_assert(sizeof(typename col_t::value_type) == 1U,
"value_type must be 1 byte in size"); "value_type must be 1 byte in size");
static constexpr const auto mask = 0xFF; static constexpr auto mask{0xFF};
std::stringstream stream{}; std::stringstream stream{};
for (auto &&val : collection) { for (auto &&val : collection) {

View File

@@ -46,7 +46,7 @@ struct com_init_wrapper final {
[[nodiscard]] auto is_initialized() const -> bool { return initialized_; } [[nodiscard]] auto is_initialized() const -> bool { return initialized_; }
private: private:
BOOL initialized_; BOOL initialized_{};
}; };
} // namespace monitarr::utils } // namespace monitarr::utils

View File

@@ -35,9 +35,10 @@ struct result final {
using retryable_action_t = std::function<bool()>; using retryable_action_t = std::function<bool()>;
[[nodiscard]] inline constexpr auto [[nodiscard]] constexpr auto calculate_read_size(std::uint64_t total_size,
calculate_read_size(std::uint64_t total_size, std::size_t read_size, std::size_t read_size,
std::uint64_t offset) -> std::size_t { std::uint64_t offset)
-> std::size_t {
return static_cast<std::size_t>( return static_cast<std::size_t>(
((offset + read_size) > total_size) ((offset + read_size) > total_size)
? ((offset < total_size) ? total_size - offset : 0U) ? ((offset < total_size) ? total_size - offset : 0U)

View File

@@ -25,7 +25,7 @@
#define NOMINMAX #define NOMINMAX
#if defined(_WIN32) #if defined(_WIN32)
#define WINVER 0x0602 #define WINVER 0x0A00
#define _WIN32_WINNT WINVER #define _WIN32_WINNT WINVER
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
@@ -106,9 +106,7 @@
#include <bit> #include <bit>
#include <cerrno> #include <cerrno>
#include <chrono> #include <chrono>
#include <ciso646>
#include <climits> #include <climits>
#include <codecvt>
#include <condition_variable> #include <condition_variable>
#include <csignal> #include <csignal>
#include <cstdint> #include <cstdint>
@@ -147,8 +145,12 @@
#include <utility> #include <utility>
#include <variant> #include <variant>
#include <vector> #include <vector>
#include <version>
#endif // defined(__cplusplus) #endif // defined(__cplusplus)
#include <unicode/uchar.h>
#include <unicode/utf.h>
#if defined(PROJECT_ENABLE_CURL) #if defined(PROJECT_ENABLE_CURL)
#include "curl/curl.h" #include "curl/curl.h"
#include "curl/multi.h" #include "curl/multi.h"
@@ -415,11 +417,16 @@ using vlc_string_t = std::unique_ptr<char, vlc_string_deleter>;
#endif // defined(PROJECT_ENABLE_TPL) #endif // defined(PROJECT_ENABLE_TPL)
#if defined(PROJECT_ENABLE_WINFSP) #if defined(PROJECT_ENABLE_WINFSP)
#if defined(_ReadWriteBarrier)
#undef _ReadWriteBarrier
#endif // defined(_ReadWriteBarrier)
#include "winfsp/winfsp.hpp" #include "winfsp/winfsp.hpp"
#endif // defined(PROJECT_ENABLE_WINFSP) #endif // defined(PROJECT_ENABLE_WINFSP)
namespace monitarr { namespace monitarr {
using data_buffer = std::vector<unsigned char>; using data_buffer = std::vector<unsigned char>;
using data_span = std::span<unsigned char>;
using data_cspan = std::span<const unsigned char>;
using mutex_lock = std::lock_guard<std::mutex>; using mutex_lock = std::lock_guard<std::mutex>;
using recur_mutex_lock = std::lock_guard<std::recursive_mutex>; using recur_mutex_lock = std::lock_guard<std::recursive_mutex>;
using stop_type = std::atomic_bool; using stop_type = std::atomic_bool;
@@ -429,14 +436,14 @@ using unique_recur_mutex_lock = std::unique_lock<std::recursive_mutex>;
#if defined(_WIN32) #if defined(_WIN32)
#if defined(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES) #if defined(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
inline constexpr const auto max_path_length = std::size_t{32767U}; inline constexpr auto max_path_length = std::size_t{32767U};
#else // !defined(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES) #else // !defined(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
inline constexpr const auto max_path_length = std::size_t{MAX_PATH}; inline constexpr auto max_path_length = std::size_t{MAX_PATH};
#endif // defined(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES) #endif // defined(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
using native_handle = HANDLE; using native_handle = HANDLE;
#else // !defined(_WIN32) #else // !defined(_WIN32)
inline constexpr const auto max_path_length = std::size_t{PATH_MAX}; inline constexpr auto max_path_length = std::size_t{PATH_MAX};
using native_handle = int; using native_handle = int;
#if !defined(INVALID_HANDLE_VALUE) #if !defined(INVALID_HANDLE_VALUE)
#define INVALID_HANDLE_VALUE (-1) #define INVALID_HANDLE_VALUE (-1)
@@ -482,7 +489,7 @@ using http_ranges = std::vector<http_range>;
#endif // defined(__cplusplus) #endif // defined(__cplusplus)
#define MONITARR_USES_FUNCTION_NAME() \ #define MONITARR_USES_FUNCTION_NAME() \
static constexpr const std::string_view function_name { \ static constexpr std::string_view function_name { \
static_cast<const char *>(__FUNCTION__), \ static_cast<const char *>(__FUNCTION__), \
} }

Some files were not shown because too many files have changed in this diff Show More