1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-03-13 15:39:01 +00:00
transmission/libtransmission/watchdir.cc

127 lines
3.2 KiB
C++
Raw Normal View History

// This file Copyright © Mnemosyne LLC.
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
// or any future license endorsed by Mnemosyne LLC.
// License text can be found in the licenses/ folder.
2022-09-21 18:34:18 -05:00
#include <chrono>
2023-07-08 23:24:03 +08:00
#include <string>
#include <string_view>
2022-08-10 08:34:51 -05:00
2023-07-08 23:24:03 +08:00
#include <fmt/core.h>
2023-07-08 23:24:03 +08:00
#define LIBTRANSMISSION_WATCHDIR_MODULE
#include "libtransmission/error-types.h"
#include "libtransmission/error.h"
#include "libtransmission/file.h"
#include "libtransmission/log.h"
#include "libtransmission/tr-strbuf.h"
#include "libtransmission/utils.h" // for _()
#include "libtransmission/watchdir-base.h"
using namespace std::literals;
2022-08-10 08:34:51 -05:00
namespace libtransmission
{
namespace
{
2022-08-10 08:34:51 -05:00
[[nodiscard]] constexpr std::string_view actionToString(Watchdir::Action action)
{
switch (action)
{
2022-08-10 08:34:51 -05:00
case Watchdir::Action::Retry:
return "retry";
2022-08-10 08:34:51 -05:00
case Watchdir::Action::Done:
return "done";
}
2022-08-10 08:34:51 -05:00
return "???";
}
2022-08-10 08:34:51 -05:00
[[nodiscard]] bool isRegularFile(std::string_view dir, std::string_view name)
{
2022-08-10 08:34:51 -05:00
auto const path = tr_pathbuf{ dir, '/', name };
auto error = tr_error{};
2022-08-10 08:34:51 -05:00
auto const info = tr_sys_path_get_info(path, 0, &error);
if (error && !tr_error_is_enoent(error.code()))
{
tr_logAddWarn(fmt::format(
Fix building transmission with C++23 (#6832) * fix: operator== should return bool in tr_strbuf Fixes build error with C++20/C++23 error: return type 'auto' of selected 'operator==' function for rewritten '!=' comparison is not 'bool' Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: explicitly specify Blocklist::size() return type as size_t Fixes building with C++20/C++23 error: no matching function for call to 'size' function 'size' with deduced return type cannot be used before it is defined Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: wrap runtime format strings with fmt::runtime in library, daemon and cli fmt::format_string ctor is consteval with C++20 See https://github.com/fmtlib/fmt/issues/2438 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: wrap runtime format strings with fmt::runtime for GTK client Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: allow to override C and CXX standard via cmdline or env Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: add job to check if transmission compiles with C++23 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * Address code review by mikedld Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix new found fmt build errors Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * Address code review by tearfur Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: make tr_net_init_mgr singleton buildable with C++23 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> --------- Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> Co-authored-by: Charles Kerr <charles@charleskerr.com>
2025-03-10 21:08:57 +03:00
fmt::runtime(_("Skipping '{path}': {error} ({error_code})")),
fmt::arg("path", path),
fmt::arg("error", error.message()),
fmt::arg("error_code", error.code())));
}
2022-08-10 08:34:51 -05:00
return info && info->isFile();
}
2022-08-10 08:34:51 -05:00
} // namespace
2022-08-10 08:34:51 -05:00
namespace impl
{
2022-08-10 08:34:51 -05:00
void BaseWatchdir::processFile(std::string_view basename)
{
if (!isRegularFile(dirname_, basename) || handled_.count(basename) != 0)
{
2022-08-10 08:34:51 -05:00
return;
}
2022-08-10 08:34:51 -05:00
auto const action = callback_(dirname_, basename);
tr_logAddDebug(fmt::format("Callback decided to {:s} file '{:s}'", actionToString(action), basename));
if (action == Action::Retry)
{
auto const [iter, added] = pending_.try_emplace(std::string{ basename });
2022-08-10 08:34:51 -05:00
auto const now = std::chrono::steady_clock::now();
auto& info = iter->second;
++info.strikes;
info.last_kick_at = now;
2022-08-10 08:34:51 -05:00
if (info.first_kick_at == Timestamp{})
{
2022-08-10 08:34:51 -05:00
info.first_kick_at = now;
}
2022-08-10 08:34:51 -05:00
if (now - info.first_kick_at > timeoutDuration())
{
Fix building transmission with C++23 (#6832) * fix: operator== should return bool in tr_strbuf Fixes build error with C++20/C++23 error: return type 'auto' of selected 'operator==' function for rewritten '!=' comparison is not 'bool' Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: explicitly specify Blocklist::size() return type as size_t Fixes building with C++20/C++23 error: no matching function for call to 'size' function 'size' with deduced return type cannot be used before it is defined Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: wrap runtime format strings with fmt::runtime in library, daemon and cli fmt::format_string ctor is consteval with C++20 See https://github.com/fmtlib/fmt/issues/2438 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: wrap runtime format strings with fmt::runtime for GTK client Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: allow to override C and CXX standard via cmdline or env Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: add job to check if transmission compiles with C++23 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * Address code review by mikedld Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix new found fmt build errors Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * Address code review by tearfur Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: make tr_net_init_mgr singleton buildable with C++23 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> --------- Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> Co-authored-by: Charles Kerr <charles@charleskerr.com>
2025-03-10 21:08:57 +03:00
tr_logAddWarn(fmt::format(fmt::runtime(_("Couldn't add torrent file '{path}'")), fmt::arg("path", basename)));
2022-08-10 08:34:51 -05:00
pending_.erase(iter);
}
2022-08-10 08:34:51 -05:00
else
{
2022-08-10 08:34:51 -05:00
setNextKickTime(info);
restartTimerIfPending();
}
}
2022-08-10 08:34:51 -05:00
else if (action == Action::Done)
{
handled_.emplace(basename);
}
2022-08-10 08:34:51 -05:00
}
2022-08-10 08:34:51 -05:00
void BaseWatchdir::scan()
{
auto error = tr_error{};
for (auto const& file : tr_sys_dir_get_files(dirname_, tr_basename_is_not_dotfile, &error))
{
processFile(file);
}
if (error)
2022-08-10 08:34:51 -05:00
{
tr_logAddWarn(fmt::format(
Fix building transmission with C++23 (#6832) * fix: operator== should return bool in tr_strbuf Fixes build error with C++20/C++23 error: return type 'auto' of selected 'operator==' function for rewritten '!=' comparison is not 'bool' Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: explicitly specify Blocklist::size() return type as size_t Fixes building with C++20/C++23 error: no matching function for call to 'size' function 'size' with deduced return type cannot be used before it is defined Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: wrap runtime format strings with fmt::runtime in library, daemon and cli fmt::format_string ctor is consteval with C++20 See https://github.com/fmtlib/fmt/issues/2438 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: wrap runtime format strings with fmt::runtime for GTK client Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: allow to override C and CXX standard via cmdline or env Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: add job to check if transmission compiles with C++23 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * Address code review by mikedld Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix new found fmt build errors Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * Address code review by tearfur Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> * fix: make tr_net_init_mgr singleton buildable with C++23 Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> --------- Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com> Co-authored-by: Charles Kerr <charles@charleskerr.com>
2025-03-10 21:08:57 +03:00
fmt::runtime(_("Couldn't read '{path}': {error} ({error_code})")),
2022-08-10 08:34:51 -05:00
fmt::arg("path", dirname()),
fmt::arg("error", error.message()),
fmt::arg("error_code", error.code())));
2022-08-10 08:34:51 -05:00
}
}
2022-08-10 08:34:51 -05:00
} // namespace impl
} // namespace libtransmission