Merge branch 'develop' into main
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
commit
4ea24f0101
|
@ -5,10 +5,16 @@ root = true
|
|||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
max_line_length = 80
|
||||
|
||||
[*.?pp]
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
|
||||
[{CMakeLists.txt,*.cmake}]
|
||||
indent_size = 2
|
||||
tab_width = 2
|
||||
|
|
113
CMakeLists.txt
113
CMakeLists.txt
|
@ -1,85 +1,66 @@
|
|||
# Support version 3.6 and above, but use policy settings up to 3.14.
|
||||
# 3.6 is needed because of IMPORTED_TARGET in pkg_check_modules().
|
||||
cmake_minimum_required(VERSION 3.6...3.14)
|
||||
# Support version 3.9 and above, but use policy settings up to 3.14.
|
||||
# 3.9 is needed for project description.
|
||||
cmake_minimum_required(VERSION 3.9...3.14)
|
||||
# Ranges are supported from 3.12, set policy to current for < 3.12.
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.12)
|
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||
endif()
|
||||
|
||||
project(remwharead
|
||||
VERSION 0.8.5
|
||||
LANGUAGES CXX)
|
||||
# DESCRIPTION was introduced in version 3.9.
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9))
|
||||
set(PROJECT_DESCRIPTION
|
||||
"Saves URIs of things you want to remember in a database.")
|
||||
# Global build options.
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build.")
|
||||
option(BUILD_SHARED_LIBS "Build shared libraries." YES)
|
||||
option(HUNTER_ENABLED "Use the Hunter package manager" NO)
|
||||
|
||||
if(${HUNTER_ENABLED})
|
||||
set(BUILD_SHARED_LIBS "NO")
|
||||
set(HUNTER_PocoCpp_CMAKE_ARGS
|
||||
ENABLE_CRYPTO=ON
|
||||
ENABLE_DATA=ON
|
||||
ENABLE_JSON=ON
|
||||
ENABLE_NET=ON
|
||||
ENABLE_NETSSL=ON
|
||||
ENABLE_SQL_SQLITE=ON
|
||||
ENABLE_UTIL=ON
|
||||
ENABLE_XML=ON)
|
||||
|
||||
# FetchContent_MakeAvailable needs 3.14.
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.14))
|
||||
set(HUNTER_PACKAGES PocoCpp)
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(SetupHunter GIT_REPOSITORY https://github.com/cpp-pm/gate)
|
||||
FetchContent_MakeAvailable(SetupHunter)
|
||||
else()
|
||||
include("cmake/HunterGate.cmake")
|
||||
HunterGate(
|
||||
URL "https://github.com/cpp-pm/hunter/archive/v0.23.225.tar.gz"
|
||||
SHA1 "4b018ec7b673817475c1fb9f0bd4dfb7c5e7f343"
|
||||
LOCAL) # Load cmake/Hunter/config.cmake.
|
||||
endif()
|
||||
endif()
|
||||
|
||||
project(remwharead
|
||||
VERSION 0.8.5
|
||||
DESCRIPTION "Saves URIs of things you want to remember in a database.")
|
||||
|
||||
if(${HUNTER_ENABLED} AND ${CMAKE_VERSION} VERSION_LESS 3.14)
|
||||
hunter_add_package(PocoCpp)
|
||||
endif()
|
||||
|
||||
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# All custom build switches.
|
||||
# Project build options.
|
||||
option(WITH_MAN "Compile and install manpage." YES)
|
||||
option(WITH_TESTS "Compile tests." NO)
|
||||
option(WITH_MOZILLA "Build and install wrapper for Mozilla browsers." YES)
|
||||
option(BUILD_SHARED_LIBS "Build shared libraries." YES)
|
||||
set(MOZILLA_NMH_DIR "${CMAKE_INSTALL_LIBDIR}/mozilla/native-messaging-hosts"
|
||||
CACHE STRING "Directory for the Mozilla extension wrapper.")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
set(DEBUG_CXXFLAGS "")
|
||||
# GCC >= 5.0 or Clang >= 5.0 is assumed.
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wall"
|
||||
"-Wextra"
|
||||
"-Wpedantic"
|
||||
"-Wuninitialized"
|
||||
"-Wshadow"
|
||||
"-Wnon-virtual-dtor"
|
||||
"-Wconversion"
|
||||
"-Wsign-conversion"
|
||||
"-Wold-style-cast"
|
||||
"-Wzero-as-null-pointer-constant"
|
||||
# "-Wmissing-declarations"
|
||||
"-Wcast-align"
|
||||
"-Wunused"
|
||||
"-Woverloaded-virtual"
|
||||
"-Wdouble-promotion"
|
||||
"-Wformat=2"
|
||||
"-ftrapv"
|
||||
"-fsanitize=undefined"
|
||||
"-g"
|
||||
"-Og"
|
||||
"-fno-omit-frame-pointer")
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wlogical-op"
|
||||
"-Wuseless-cast")
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wmisleading-indentation"
|
||||
"-Wduplicated-cond"
|
||||
"-Wnull-dereference")
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wduplicated-branches")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(DEBUG_LDFLAGS
|
||||
"-fsanitize=undefined")
|
||||
add_compile_options("$<$<CONFIG:Debug>:${DEBUG_CXXFLAGS}>")
|
||||
# add_link_options was introduced in version 3.13.
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.13)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${DEBUG_LDFLAGS}")
|
||||
else()
|
||||
add_link_options("$<$<CONFIG:Debug>:${DEBUG_LDFLAGS}>")
|
||||
endif()
|
||||
endif()
|
||||
include(debug_flags)
|
||||
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(src/lib)
|
||||
|
@ -88,11 +69,11 @@ add_subdirectory(src/cli)
|
|||
add_subdirectory(pkg-config)
|
||||
add_subdirectory(cmake)
|
||||
|
||||
if (WITH_MAN)
|
||||
if(WITH_MAN)
|
||||
add_subdirectory(man)
|
||||
endif()
|
||||
|
||||
if (WITH_MOZILLA)
|
||||
if(WITH_MOZILLA)
|
||||
add_subdirectory(browser-plugins/webextension/native-wrapper)
|
||||
endif()
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
:uri-rpm: http://www.rpm.org/
|
||||
:uri-ff-addon: https://addons.mozilla.org/firefox/addon/remwharead
|
||||
:uri-papirus: https://github.com/PapirusDevelopmentTeam/papirus-icon-theme
|
||||
:uri-hunter: https://github.com/cpp-pm/hunter
|
||||
|
||||
*remwharead* saves URIs of things you want to remember in a database along with
|
||||
an URI to the archived version, the current date and time, title, description,
|
||||
|
@ -76,8 +77,8 @@ only.
|
|||
==== Dependencies
|
||||
|
||||
* Tested OS: Linux
|
||||
* C++ compiler (tested: {uri-gcc}[gcc] 7/8/9, {uri-clang}[clang] 6/7)
|
||||
* {uri-cmake}[cmake] (at least: 3.6)
|
||||
* C++ compiler ({uri-gcc}[gcc] 6+, {uri-clang}[clang] 6+)
|
||||
* {uri-cmake}[cmake] (at least: 3.9)
|
||||
* {uri-poco}[POCO] (tested: 1.9 / 1.7)
|
||||
* Optional:
|
||||
** Manpage: {uri-asciidoc}[asciidoc] (tested: 8.6)
|
||||
|
@ -124,6 +125,7 @@ cmake --build .
|
|||
* `-DMOZILLA_NMH_DIR` lets you set the directory for the Mozilla
|
||||
extension wrapper. The complete path is
|
||||
`${CMAKE_INSTALL_PREFIX}/${MOZILLA_NMH_DIR}`.
|
||||
* `-DHUNTER_ENABLED=YES` to use the package manager link:{uri-hunter}[Hunter].
|
||||
* One of:
|
||||
** `-DWITH_DEB=YES` if you want to be able to generate a deb-package.
|
||||
** `-DWITH_RPM=YES` if you want to be able to generate an rpm-package.
|
||||
|
|
|
@ -27,7 +27,11 @@ using std::cout;
|
|||
using std::uint32_t;
|
||||
using std::system;
|
||||
|
||||
const string read_input()
|
||||
string read_input();
|
||||
void send_message(const string &message);
|
||||
int launch(const string &args);
|
||||
|
||||
string read_input()
|
||||
{
|
||||
// Read message length.
|
||||
uint32_t length;
|
||||
|
@ -55,7 +59,8 @@ const string read_input()
|
|||
|
||||
void send_message(const string &message)
|
||||
{
|
||||
const uint32_t length = static_cast<uint32_t>(message.length() + 2);
|
||||
const auto length = static_cast<uint32_t>(message.length() + 2);
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - Necessary.
|
||||
cout.write(reinterpret_cast<const char*>(&length), sizeof(uint32_t));
|
||||
cout << '"' << message << '"';
|
||||
}
|
||||
|
@ -63,10 +68,11 @@ void send_message(const string &message)
|
|||
int launch(const string &args)
|
||||
{
|
||||
const string cmd = "remwharead " + args + " 2>/dev/null";
|
||||
// NOLINTNEXTLINE(cert-env33-c) - We get the arguments in a string.
|
||||
int ret = system(cmd.c_str());
|
||||
if (WIFEXITED(ret))
|
||||
if (WIFEXITED(ret)) // NOLINT(hicpp-signed-bitwise) - Necessary.
|
||||
{
|
||||
ret = WEXITSTATUS(ret);
|
||||
ret = WEXITSTATUS(ret); // NOLINT(hicpp-signed-bitwise) - Necessary.
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
hunter_config(PocoCpp
|
||||
VERSION ${HUNTER_PocoCpp_VERSION}
|
||||
CMAKE_ARGS ${HUNTER_PocoCpp_CMAKE_ARGS})
|
|
@ -0,0 +1,539 @@
|
|||
# Copyright (c) 2013-2019, Ruslan Baratov
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
#
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# This is a gate file to Hunter package manager.
|
||||
# Include this file using `include` command and add package you need, example:
|
||||
#
|
||||
# cmake_minimum_required(VERSION 3.2)
|
||||
#
|
||||
# include("cmake/HunterGate.cmake")
|
||||
# HunterGate(
|
||||
# URL "https://github.com/path/to/hunter/archive.tar.gz"
|
||||
# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
|
||||
# )
|
||||
#
|
||||
# project(MyProject)
|
||||
#
|
||||
# hunter_add_package(Foo)
|
||||
# hunter_add_package(Boo COMPONENTS Bar Baz)
|
||||
#
|
||||
# Projects:
|
||||
# * https://github.com/hunter-packages/gate/
|
||||
# * https://github.com/ruslo/hunter
|
||||
|
||||
option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
|
||||
|
||||
if(HUNTER_ENABLED)
|
||||
if(CMAKE_VERSION VERSION_LESS "3.2")
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"At least CMake version 3.2 required for Hunter dependency management."
|
||||
" Update CMake or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(CMakeParseArguments) # cmake_parse_arguments
|
||||
|
||||
option(HUNTER_STATUS_PRINT "Print working status" ON)
|
||||
option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
|
||||
option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON)
|
||||
|
||||
set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors")
|
||||
|
||||
function(hunter_gate_status_print)
|
||||
if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
|
||||
foreach(print_message ${ARGV})
|
||||
message(STATUS "[hunter] ${print_message}")
|
||||
endforeach()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_status_debug)
|
||||
if(HUNTER_STATUS_DEBUG)
|
||||
foreach(print_message ${ARGV})
|
||||
string(TIMESTAMP timestamp)
|
||||
message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
|
||||
endforeach()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_error_page error_page)
|
||||
message("------------------------------ ERROR ------------------------------")
|
||||
message(" ${HUNTER_ERROR_PAGE}/${error_page}.html")
|
||||
message("-------------------------------------------------------------------")
|
||||
message("")
|
||||
message(FATAL_ERROR "")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_internal_error)
|
||||
message("")
|
||||
foreach(print_message ${ARGV})
|
||||
message("[hunter ** INTERNAL **] ${print_message}")
|
||||
endforeach()
|
||||
message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||
message("")
|
||||
hunter_gate_error_page("error.internal")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_fatal_error)
|
||||
cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}")
|
||||
if("${hunter_ERROR_PAGE}" STREQUAL "")
|
||||
hunter_gate_internal_error("Expected ERROR_PAGE")
|
||||
endif()
|
||||
message("")
|
||||
foreach(x ${hunter_UNPARSED_ARGUMENTS})
|
||||
message("[hunter ** FATAL ERROR **] ${x}")
|
||||
endforeach()
|
||||
message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||
message("")
|
||||
hunter_gate_error_page("${hunter_ERROR_PAGE}")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_user_error)
|
||||
hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_self root version sha1 result)
|
||||
string(COMPARE EQUAL "${root}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("root is empty")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${version}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("version is empty")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${sha1}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("sha1 is empty")
|
||||
endif()
|
||||
|
||||
string(SUBSTRING "${sha1}" 0 7 archive_id)
|
||||
|
||||
if(EXISTS "${root}/cmake/Hunter")
|
||||
set(hunter_self "${root}")
|
||||
else()
|
||||
set(
|
||||
hunter_self
|
||||
"${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
|
||||
)
|
||||
endif()
|
||||
|
||||
set("${result}" "${hunter_self}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Set HUNTER_GATE_ROOT cmake variable to suitable value.
|
||||
function(hunter_gate_detect_root)
|
||||
# Check CMake variable
|
||||
string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
|
||||
if(not_empty)
|
||||
set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check environment variable
|
||||
string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
|
||||
if(not_empty)
|
||||
set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check HOME environment variable
|
||||
string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
|
||||
if(result)
|
||||
set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
|
||||
if(WIN32)
|
||||
string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
|
||||
if(result)
|
||||
set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug(
|
||||
"HUNTER_ROOT set using SYSTEMDRIVE environment variable"
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
|
||||
if(result)
|
||||
set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug(
|
||||
"HUNTER_ROOT set using USERPROFILE environment variable"
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
hunter_gate_fatal_error(
|
||||
"Can't detect HUNTER_ROOT"
|
||||
ERROR_PAGE "error.detect.hunter.root"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_download dir)
|
||||
string(
|
||||
COMPARE
|
||||
NOTEQUAL
|
||||
"$ENV{HUNTER_DISABLE_AUTOINSTALL}"
|
||||
""
|
||||
disable_autoinstall
|
||||
)
|
||||
if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
|
||||
hunter_gate_fatal_error(
|
||||
"Hunter not found in '${dir}'"
|
||||
"Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
|
||||
"Settings:"
|
||||
" HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
|
||||
" HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
|
||||
ERROR_PAGE "error.run.install"
|
||||
)
|
||||
endif()
|
||||
string(COMPARE EQUAL "${dir}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("Empty 'dir' argument")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("HUNTER_GATE_URL empty")
|
||||
endif()
|
||||
|
||||
set(done_location "${dir}/DONE")
|
||||
set(sha1_location "${dir}/SHA1")
|
||||
|
||||
set(build_dir "${dir}/Build")
|
||||
set(cmakelists "${dir}/CMakeLists.txt")
|
||||
|
||||
hunter_gate_status_debug("Locking directory: ${dir}")
|
||||
file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
|
||||
hunter_gate_status_debug("Lock done")
|
||||
|
||||
if(EXISTS "${done_location}")
|
||||
# while waiting for lock other instance can do all the job
|
||||
hunter_gate_status_debug("File '${done_location}' found, skip install")
|
||||
return()
|
||||
endif()
|
||||
|
||||
file(REMOVE_RECURSE "${build_dir}")
|
||||
file(REMOVE_RECURSE "${cmakelists}")
|
||||
|
||||
file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
|
||||
|
||||
# Disabling languages speeds up a little bit, reduces noise in the output
|
||||
# and avoids path too long windows error
|
||||
file(
|
||||
WRITE
|
||||
"${cmakelists}"
|
||||
"cmake_minimum_required(VERSION 3.2)\n"
|
||||
"project(HunterDownload LANGUAGES NONE)\n"
|
||||
"include(ExternalProject)\n"
|
||||
"ExternalProject_Add(\n"
|
||||
" Hunter\n"
|
||||
" URL\n"
|
||||
" \"${HUNTER_GATE_URL}\"\n"
|
||||
" URL_HASH\n"
|
||||
" SHA1=${HUNTER_GATE_SHA1}\n"
|
||||
" DOWNLOAD_DIR\n"
|
||||
" \"${dir}\"\n"
|
||||
" TLS_VERIFY\n"
|
||||
" ${HUNTER_TLS_VERIFY}\n"
|
||||
" SOURCE_DIR\n"
|
||||
" \"${dir}/Unpacked\"\n"
|
||||
" CONFIGURE_COMMAND\n"
|
||||
" \"\"\n"
|
||||
" BUILD_COMMAND\n"
|
||||
" \"\"\n"
|
||||
" INSTALL_COMMAND\n"
|
||||
" \"\"\n"
|
||||
")\n"
|
||||
)
|
||||
|
||||
if(HUNTER_STATUS_DEBUG)
|
||||
set(logging_params "")
|
||||
else()
|
||||
set(logging_params OUTPUT_QUIET)
|
||||
endif()
|
||||
|
||||
hunter_gate_status_debug("Run generate")
|
||||
|
||||
# Need to add toolchain file too.
|
||||
# Otherwise on Visual Studio + MDD this will fail with error:
|
||||
# "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
|
||||
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
|
||||
get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
|
||||
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}")
|
||||
else()
|
||||
# 'toolchain_arg' can't be empty
|
||||
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make)
|
||||
if(no_make)
|
||||
set(make_arg "")
|
||||
else()
|
||||
# Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM
|
||||
set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
"${CMAKE_COMMAND}"
|
||||
"-H${dir}"
|
||||
"-B${build_dir}"
|
||||
"-G${CMAKE_GENERATOR}"
|
||||
"${toolchain_arg}"
|
||||
${make_arg}
|
||||
WORKING_DIRECTORY "${dir}"
|
||||
RESULT_VARIABLE download_result
|
||||
${logging_params}
|
||||
)
|
||||
|
||||
if(NOT download_result EQUAL 0)
|
||||
hunter_gate_internal_error(
|
||||
"Configure project failed."
|
||||
"To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}"
|
||||
"In directory ${dir}"
|
||||
)
|
||||
endif()
|
||||
|
||||
hunter_gate_status_print(
|
||||
"Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
|
||||
" ${HUNTER_GATE_URL}"
|
||||
" -> ${dir}"
|
||||
)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
|
||||
WORKING_DIRECTORY "${dir}"
|
||||
RESULT_VARIABLE download_result
|
||||
${logging_params}
|
||||
)
|
||||
|
||||
if(NOT download_result EQUAL 0)
|
||||
hunter_gate_internal_error("Build project failed")
|
||||
endif()
|
||||
|
||||
file(REMOVE_RECURSE "${build_dir}")
|
||||
file(REMOVE_RECURSE "${cmakelists}")
|
||||
|
||||
file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
|
||||
file(WRITE "${done_location}" "DONE")
|
||||
|
||||
hunter_gate_status_debug("Finished")
|
||||
endfunction()
|
||||
|
||||
# Must be a macro so master file 'cmake/Hunter' can
|
||||
# apply all variables easily just by 'include' command
|
||||
# (otherwise PARENT_SCOPE magic needed)
|
||||
macro(HunterGate)
|
||||
if(HUNTER_GATE_DONE)
|
||||
# variable HUNTER_GATE_DONE set explicitly for external project
|
||||
# (see `hunter_download`)
|
||||
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
|
||||
endif()
|
||||
|
||||
# First HunterGate command will init Hunter, others will be ignored
|
||||
get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
|
||||
|
||||
if(NOT HUNTER_ENABLED)
|
||||
# Empty function to avoid error "unknown function"
|
||||
function(hunter_add_package)
|
||||
endfunction()
|
||||
|
||||
set(
|
||||
_hunter_gate_disabled_mode_dir
|
||||
"${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode"
|
||||
)
|
||||
if(EXISTS "${_hunter_gate_disabled_mode_dir}")
|
||||
hunter_gate_status_debug(
|
||||
"Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}"
|
||||
)
|
||||
list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}")
|
||||
endif()
|
||||
elseif(_hunter_gate_done)
|
||||
hunter_gate_status_debug("Secondary HunterGate (use old settings)")
|
||||
hunter_gate_self(
|
||||
"${HUNTER_CACHED_ROOT}"
|
||||
"${HUNTER_VERSION}"
|
||||
"${HUNTER_SHA1}"
|
||||
_hunter_self
|
||||
)
|
||||
include("${_hunter_self}/cmake/Hunter")
|
||||
else()
|
||||
set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
|
||||
string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
|
||||
if(_have_project_name)
|
||||
hunter_gate_fatal_error(
|
||||
"Please set HunterGate *before* 'project' command. "
|
||||
"Detected project: ${PROJECT_NAME}"
|
||||
ERROR_PAGE "error.huntergate.before.project"
|
||||
)
|
||||
endif()
|
||||
|
||||
cmake_parse_arguments(
|
||||
HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
|
||||
)
|
||||
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
|
||||
string(
|
||||
COMPARE
|
||||
NOTEQUAL
|
||||
"${HUNTER_GATE_UNPARSED_ARGUMENTS}"
|
||||
""
|
||||
_have_unparsed
|
||||
)
|
||||
string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
|
||||
string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
|
||||
|
||||
if(_have_unparsed)
|
||||
hunter_gate_user_error(
|
||||
"HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
|
||||
)
|
||||
endif()
|
||||
if(_empty_sha1)
|
||||
hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
|
||||
endif()
|
||||
if(_empty_url)
|
||||
hunter_gate_user_error("URL suboption of HunterGate is mandatory")
|
||||
endif()
|
||||
if(_have_global)
|
||||
if(HUNTER_GATE_LOCAL)
|
||||
hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
|
||||
endif()
|
||||
if(_have_filepath)
|
||||
hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
|
||||
endif()
|
||||
endif()
|
||||
if(HUNTER_GATE_LOCAL)
|
||||
if(_have_global)
|
||||
hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
|
||||
endif()
|
||||
if(_have_filepath)
|
||||
hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
|
||||
endif()
|
||||
endif()
|
||||
if(_have_filepath)
|
||||
if(_have_global)
|
||||
hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
|
||||
endif()
|
||||
if(HUNTER_GATE_LOCAL)
|
||||
hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
hunter_gate_detect_root() # set HUNTER_GATE_ROOT
|
||||
|
||||
# Beautify path, fix probable problems with windows path slashes
|
||||
get_filename_component(
|
||||
HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
|
||||
)
|
||||
hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
|
||||
if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
|
||||
string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
|
||||
if(NOT _contain_spaces EQUAL -1)
|
||||
hunter_gate_fatal_error(
|
||||
"HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
|
||||
"Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
|
||||
"(Use at your own risk!)"
|
||||
ERROR_PAGE "error.spaces.in.hunter.root"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
string(
|
||||
REGEX
|
||||
MATCH
|
||||
"[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
|
||||
HUNTER_GATE_VERSION
|
||||
"${HUNTER_GATE_URL}"
|
||||
)
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
|
||||
if(_is_empty)
|
||||
set(HUNTER_GATE_VERSION "unknown")
|
||||
endif()
|
||||
|
||||
hunter_gate_self(
|
||||
"${HUNTER_GATE_ROOT}"
|
||||
"${HUNTER_GATE_VERSION}"
|
||||
"${HUNTER_GATE_SHA1}"
|
||||
_hunter_self
|
||||
)
|
||||
|
||||
set(_master_location "${_hunter_self}/cmake/Hunter")
|
||||
if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
|
||||
# Hunter downloaded manually (e.g. by 'git clone')
|
||||
set(_unused "xxxxxxxxxx")
|
||||
set(HUNTER_GATE_SHA1 "${_unused}")
|
||||
set(HUNTER_GATE_VERSION "${_unused}")
|
||||
else()
|
||||
get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
|
||||
set(_done_location "${_archive_id_location}/DONE")
|
||||
set(_sha1_location "${_archive_id_location}/SHA1")
|
||||
|
||||
# Check Hunter already downloaded by HunterGate
|
||||
if(NOT EXISTS "${_done_location}")
|
||||
hunter_gate_download("${_archive_id_location}")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${_done_location}")
|
||||
hunter_gate_internal_error("hunter_gate_download failed")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${_sha1_location}")
|
||||
hunter_gate_internal_error("${_sha1_location} not found")
|
||||
endif()
|
||||
file(READ "${_sha1_location}" _sha1_value)
|
||||
string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
|
||||
if(NOT _is_equal)
|
||||
hunter_gate_internal_error(
|
||||
"Short SHA1 collision:"
|
||||
" ${_sha1_value} (from ${_sha1_location})"
|
||||
" ${HUNTER_GATE_SHA1} (HunterGate)"
|
||||
)
|
||||
endif()
|
||||
if(NOT EXISTS "${_master_location}")
|
||||
hunter_gate_user_error(
|
||||
"Master file not found:"
|
||||
" ${_master_location}"
|
||||
"try to update Hunter/HunterGate"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
include("${_master_location}")
|
||||
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
|
||||
endif()
|
||||
endmacro()
|
|
@ -0,0 +1,58 @@
|
|||
# Set compiler flags for Debug builds.
|
||||
# Only has an effect on GCC/Clang >= 5.0.
|
||||
|
||||
set(DEBUG_CXXFLAGS "")
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang"
|
||||
AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wall"
|
||||
"-Wextra"
|
||||
"-Wpedantic"
|
||||
"-Wuninitialized"
|
||||
"-Wshadow"
|
||||
"-Wnon-virtual-dtor"
|
||||
"-Wconversion"
|
||||
"-Wsign-conversion"
|
||||
"-Wold-style-cast"
|
||||
"-Wzero-as-null-pointer-constant"
|
||||
"-Wmissing-declarations"
|
||||
"-Wcast-align"
|
||||
"-Wunused"
|
||||
"-Woverloaded-virtual"
|
||||
"-Wdouble-promotion"
|
||||
"-Wformat=2"
|
||||
"-ftrapv"
|
||||
"-fsanitize=undefined"
|
||||
"-g"
|
||||
"-Og"
|
||||
"-fno-omit-frame-pointer")
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wlogical-op"
|
||||
"-Wuseless-cast")
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wmisleading-indentation"
|
||||
"-Wduplicated-cond"
|
||||
"-Wnull-dereference")
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7")
|
||||
list(APPEND DEBUG_CXXFLAGS
|
||||
"-Wduplicated-branches")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
add_compile_options("$<$<CONFIG:Debug>:${DEBUG_CXXFLAGS}>")
|
||||
|
||||
set(DEBUG_LDFLAGS
|
||||
"-fsanitize=undefined")
|
||||
# add_link_options was introduced in version 3.13.
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.13)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${DEBUG_LDFLAGS}")
|
||||
else()
|
||||
add_link_options("$<$<CONFIG:Debug>:${DEBUG_LDFLAGS}>")
|
||||
endif()
|
||||
else()
|
||||
message(STATUS
|
||||
"No additional compiler flags were set, "
|
||||
"because your compiler was not anticipated.")
|
||||
endif()
|
|
@ -3,8 +3,7 @@ set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
|
|||
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
|
||||
set(CPACK_PACKAGE_VERSION ${${PROJECT_NAME}_VERSION})
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
||||
"Saves URIs of things you want to remember in a database. ")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION})
|
||||
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc")
|
||||
|
|
|
@ -23,9 +23,7 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
using std::string;
|
||||
|
||||
|
@ -48,27 +46,32 @@ private:
|
|||
using replacemap = const std::map<const string, const string>;
|
||||
|
||||
//! Replace strings in text.
|
||||
[[nodiscard]]
|
||||
string replace(string text, const replacemap &replacements) const;
|
||||
|
||||
//! Replaces characters in tags that asciidoctor doesn't like.
|
||||
[[nodiscard]]
|
||||
string replace_in_tag(const string &text) const;
|
||||
|
||||
//! Replaces characters in title that asciidoctor doesn't like.
|
||||
[[nodiscard]]
|
||||
string replace_in_title(const string &text) const;
|
||||
|
||||
//! Replaces characters in URI that asciidoctor doesn't like.
|
||||
[[nodiscard]]
|
||||
string replace_in_uri(const string &text) const;
|
||||
|
||||
//! Print things sorted by tag.
|
||||
void print_tags(const tagmap &tags) const;
|
||||
|
||||
//! Get ISO-8601 day from Database::entry.
|
||||
[[nodiscard]]
|
||||
string get_day(const Database::entry &entry) const;
|
||||
|
||||
//! Get ISO-8601 time from Database::entry.
|
||||
[[nodiscard]]
|
||||
string get_time(const Database::entry &entry) const;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_ADOC_HPP
|
||||
|
|
|
@ -19,9 +19,7 @@
|
|||
|
||||
#include "export.hpp"
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
/*!
|
||||
* @brief Export as Netscape bookmark file.
|
||||
|
@ -37,7 +35,6 @@ namespace Export
|
|||
|
||||
void print() const override;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_BOOKMARKS_HPP
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
#include "export.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
using std::string;
|
||||
|
||||
|
@ -42,9 +40,9 @@ namespace Export
|
|||
|
||||
private:
|
||||
//! replaces " with "".
|
||||
[[nodiscard]]
|
||||
string quote(string field) const;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_CSV_HPP
|
||||
|
|
|
@ -21,9 +21,7 @@
|
|||
#include <iostream>
|
||||
#include <list>
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
using std::list;
|
||||
using std::ostream;
|
||||
|
@ -47,6 +45,11 @@ public:
|
|||
explicit ExportBase(const list<Database::entry> &entries,
|
||||
ostream &out = cout);
|
||||
virtual ~ExportBase() = default;
|
||||
ExportBase(const ExportBase &) = delete;
|
||||
ExportBase &operator=(const ExportBase &) = delete;
|
||||
ExportBase(ExportBase &&) = delete;
|
||||
ExportBase &operator=(ExportBase &&) = delete;
|
||||
|
||||
|
||||
/*!
|
||||
* @brief Print output to std::ostream.
|
||||
|
@ -64,9 +67,9 @@ protected:
|
|||
*
|
||||
* @return Sorted list of Database::entry.
|
||||
*/
|
||||
[[nodiscard]]
|
||||
list<Database::entry> sort_entries(list<Database::entry> entries) const;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_EXPORT_HPP
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
#include "export.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
using std::string;
|
||||
|
||||
|
@ -40,7 +38,6 @@ public:
|
|||
|
||||
void print() const override;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_JSON_HPP
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
#include <string>
|
||||
#include "export.hpp"
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
using std::string;
|
||||
|
||||
|
@ -40,7 +38,6 @@ public:
|
|||
|
||||
void print() const override;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_RSS_HPP
|
||||
|
|
|
@ -19,9 +19,7 @@
|
|||
|
||||
#include "export.hpp"
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
/*!
|
||||
* @brief Export as simple list.
|
||||
|
@ -36,7 +34,6 @@ public:
|
|||
using ExportBase::ExportBase;
|
||||
void print() const override;
|
||||
};
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
||||
#endif // REMWHAREAD_EXPORT_SIMPLE_HPP
|
||||
|
|
|
@ -57,6 +57,7 @@ public:
|
|||
*
|
||||
* @since 0.7.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
list<Database::entry> search_tags(const string &expression, bool is_re)
|
||||
const;
|
||||
|
||||
|
@ -72,6 +73,7 @@ public:
|
|||
*
|
||||
* @since 0.7.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
list<Database::entry> search_all(const string &expression, bool is_re)
|
||||
const;
|
||||
|
||||
|
@ -89,6 +91,7 @@ public:
|
|||
* @since 0.7.2
|
||||
*/
|
||||
// TODO(tastytea): Think of something more elegant.
|
||||
[[nodiscard]]
|
||||
list<Database::entry> search_all_threaded(const string &expression,
|
||||
bool is_re) const;
|
||||
|
||||
|
@ -106,6 +109,7 @@ private:
|
|||
*
|
||||
* @since 0.7.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
vector<vector<string>> parse_expression(const string &expression) const;
|
||||
|
||||
/*!
|
||||
|
@ -113,6 +117,7 @@ private:
|
|||
*
|
||||
* @since 0.7.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
inline string to_lowercase(const string &str) const;
|
||||
};
|
||||
} // namespace remwharead
|
||||
|
|
|
@ -75,6 +75,7 @@ public:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
string fulltext_oneline() const;
|
||||
};
|
||||
|
||||
|
@ -104,6 +105,7 @@ public:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
list<entry> retrieve(const time_point &start = time_point(),
|
||||
const time_point &end = system_clock::now()) const;
|
||||
|
||||
|
@ -112,6 +114,7 @@ private:
|
|||
std::unique_ptr<Session> _session;
|
||||
bool _connected;
|
||||
|
||||
[[nodiscard]]
|
||||
fs::path get_data_home() const;
|
||||
};
|
||||
} // namespace remwharead
|
||||
|
|
|
@ -36,6 +36,7 @@ using time_point = system_clock::time_point;
|
|||
* @param strtime Time string in ISO 8601 or SQLite format.
|
||||
* @param sqlite Is the string in SQLite format?
|
||||
*/
|
||||
[[nodiscard]]
|
||||
time_point string_to_timepoint(const string &strtime, bool sqlite = false);
|
||||
|
||||
/*!
|
||||
|
@ -46,6 +47,7 @@ time_point string_to_timepoint(const string &strtime, bool sqlite = false);
|
|||
* @param time_point The std::chrono::system_clock::time_point.
|
||||
* @param sqlite Is the string in SQLite format?
|
||||
*/
|
||||
[[nodiscard]]
|
||||
string timepoint_to_string(const time_point &tp, bool sqlite = false);
|
||||
} // namespace remwharead
|
||||
|
||||
|
|
|
@ -94,6 +94,7 @@ public:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
html_extract get();
|
||||
|
||||
/*!
|
||||
|
@ -101,6 +102,7 @@ public:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
archive_answer archive() const;
|
||||
|
||||
protected:
|
||||
|
@ -111,6 +113,7 @@ protected:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
[[nodiscard]]
|
||||
string make_request(const string &uri, bool archive = false) const;
|
||||
|
||||
/*!
|
||||
|
@ -118,21 +121,24 @@ protected:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
string extract_title(const string &html);
|
||||
[[nodiscard]]
|
||||
string extract_title(const string &html) const;
|
||||
|
||||
/*!
|
||||
* @brief Extract the description from an HTML page.
|
||||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
string extract_description(const string &html);
|
||||
[[nodiscard]]
|
||||
string extract_description(const string &html) const;
|
||||
|
||||
/*!
|
||||
* @brief Removes HTML tags and superflous spaces from an HTML page.
|
||||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
string strip_html(const string &html);
|
||||
[[nodiscard]]
|
||||
string strip_html(const string &html) const;
|
||||
|
||||
/*!
|
||||
* @brief Remove HTML tags.
|
||||
|
@ -142,21 +148,24 @@ protected:
|
|||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
string remove_html_tags(const string &html, const string &tag = "");
|
||||
[[nodiscard]]
|
||||
string remove_html_tags(const string &html, const string &tag = "") const;
|
||||
|
||||
/*!
|
||||
* @brief Convert HTML entities to UTF-8.
|
||||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
string unescape_html(string html);
|
||||
[[nodiscard]]
|
||||
string unescape_html(string html) const;
|
||||
|
||||
/*!
|
||||
* @brief Replace newlines with spaces.
|
||||
*
|
||||
* @since 0.6.0
|
||||
*/
|
||||
string remove_newlines(string text);
|
||||
[[nodiscard]]
|
||||
string remove_newlines(string text) const;
|
||||
|
||||
/*!
|
||||
* @brief Set proxy server.
|
||||
|
@ -170,7 +179,8 @@ protected:
|
|||
*
|
||||
* @since 0.8.5
|
||||
*/
|
||||
string cut_text(const string &text, const uint16_t n_chars) const;
|
||||
[[nodiscard]]
|
||||
string cut_text(const string &text, uint16_t n_chars) const;
|
||||
};
|
||||
} // namespace remwharead
|
||||
|
||||
|
|
|
@ -50,8 +50,7 @@ int App::main(const std::vector<std::string> &args)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (_argument_error)
|
||||
{
|
||||
return 1;
|
||||
|
@ -65,7 +64,6 @@ int App::main(const std::vector<std::string> &args)
|
|||
cerr << "Error: You have to specify either an URI or --export.\n";
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
Database db;
|
||||
if (!db)
|
||||
|
@ -89,12 +87,6 @@ int App::main(const std::vector<std::string> &args)
|
|||
}
|
||||
|
||||
html_extract page = uri.get();
|
||||
if (!page)
|
||||
{
|
||||
cerr << "Error: Could not fetch page.\n";
|
||||
cerr << page.error << endl;
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (_archive)
|
||||
{
|
||||
|
@ -105,6 +97,13 @@ int App::main(const std::vector<std::string> &args)
|
|||
}
|
||||
}
|
||||
|
||||
if (!page)
|
||||
{
|
||||
cerr << "Error: Could not fetch page.\n";
|
||||
cerr << page.error << endl;
|
||||
return 3;
|
||||
}
|
||||
|
||||
db.store({_uri, archive_data.uri, system_clock::now(), _tags,
|
||||
page.title, page.description, page.fulltext});
|
||||
}
|
||||
|
|
|
@ -17,9 +17,7 @@
|
|||
#include "export/export.hpp"
|
||||
#include <algorithm>
|
||||
|
||||
namespace remwharead
|
||||
{
|
||||
namespace Export
|
||||
namespace remwharead::Export
|
||||
{
|
||||
ExportBase::ExportBase(const list<Database::entry> &entries, ostream &out)
|
||||
: _entries(sort_entries(entries))
|
||||
|
@ -37,5 +35,4 @@ ExportBase::sort_entries(list<Database::entry> entries) const
|
|||
|
||||
return entries;
|
||||
}
|
||||
} // namespace Export
|
||||
} // namespace remwharead
|
||||
} // namespace remwharead::Export
|
||||
|
|
|
@ -93,7 +93,7 @@ void URI::set_proxy()
|
|||
proxy.host = matches[3];
|
||||
if (!matches[4].empty())
|
||||
{
|
||||
// NOLINTNEXTLINE(google-runtime-lint) - Need to use same as stoul.
|
||||
// NOLINTNEXTLINE(google-runtime-int) - Need to use same as stoul.
|
||||
const unsigned long port = std::stoul(matches[4]);
|
||||
if (port > 65535)
|
||||
{
|
||||
|
@ -224,7 +224,7 @@ string URI::make_request(const string &uri, bool archive) const
|
|||
}
|
||||
}
|
||||
|
||||
string URI::extract_title(const string &html)
|
||||
string URI::extract_title(const string &html) const
|
||||
{
|
||||
const RegEx re_htmlfile(".*\\.(.?html?|xml|rss)$", RegEx::RE_CASELESS);
|
||||
if (_uri.substr(0, 4) == "http" || re_htmlfile.match(_uri))
|
||||
|
@ -241,7 +241,7 @@ string URI::extract_title(const string &html)
|
|||
return "";
|
||||
}
|
||||
|
||||
string URI::extract_description(const string &html)
|
||||
string URI::extract_description(const string &html) const
|
||||
{
|
||||
const RegEx re_htmlfile(".*\\.(.?html?|xml|rss)$", RegEx::RE_CASELESS);
|
||||
if (_uri.substr(0, 4) == "http" || re_htmlfile.match(_uri))
|
||||
|
@ -259,7 +259,7 @@ string URI::extract_description(const string &html)
|
|||
return "";
|
||||
}
|
||||
|
||||
string URI::strip_html(const string &html)
|
||||
string URI::strip_html(const string &html) const
|
||||
{
|
||||
string out;
|
||||
|
||||
|
@ -280,7 +280,7 @@ string URI::strip_html(const string &html)
|
|||
return unescape_html(out);
|
||||
}
|
||||
|
||||
string URI::remove_html_tags(const string &html, const string &tag)
|
||||
string URI::remove_html_tags(const string &html, const string &tag) const
|
||||
{
|
||||
// NOTE: I did this with regex_replace before, but libstdc++ segfaulted.
|
||||
string out;
|
||||
|
@ -318,7 +318,7 @@ string URI::remove_html_tags(const string &html, const string &tag)
|
|||
return out;
|
||||
}
|
||||
|
||||
string URI::unescape_html(string html)
|
||||
string URI::unescape_html(string html) const
|
||||
{
|
||||
// Used to convert int to utf-8 char.
|
||||
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> u8c;
|
||||
|
@ -642,7 +642,7 @@ archive_answer URI::archive() const
|
|||
return { false, "Unknown error.", "" };
|
||||
}
|
||||
|
||||
string URI::remove_newlines(string text)
|
||||
string URI::remove_newlines(string text) const
|
||||
{
|
||||
size_t posn = 0;
|
||||
while ((posn = text.find('\n', posn)) != std::string::npos)
|
||||
|
|
Loading…
Reference in New Issue