From 901de536a38ed81c4bf0e1be2b74450ce84bb038 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Wed, 25 Oct 2023 13:42:14 -0400 Subject: [PATCH] fix: in RPC, default to sort torrents by id (#5604) When getting all torrents in a batch over RPC, the results are sorted by info-dict hash. Prior to 4.0.0, they were sorted by ID. This change broke some peoples' workflows. I'm OK with breaking workflows if it's necessary to improve the program, but this was an unintentional side-effect and I don't see any inherent benefit to either sort order. So this PR restores the 3.00 sort order. https://xkcd.com/1172/ --- libtransmission/rpcimpl.cc | 11 ++++++----- libtransmission/torrents.h | 5 +++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libtransmission/rpcimpl.cc b/libtransmission/rpcimpl.cc index b7e74f347..f3164ade6 100644 --- a/libtransmission/rpcimpl.cc +++ b/libtransmission/rpcimpl.cc @@ -128,10 +128,11 @@ auto getTorrents(tr_session* session, tr_variant* args) { time_t const cutoff = tr_time() - RecentlyActiveSeconds; - torrents.reserve(std::size(session->torrents())); + auto const& by_id = session->torrents().sorted_by_id(); + torrents.reserve(std::size(by_id)); std::copy_if( - std::begin(session->torrents()), - std::end(session->torrents()), + std::begin(by_id), + std::end(by_id), std::back_inserter(torrents), [&cutoff](auto const* tor) { return tor->has_changed_since(cutoff); }); } @@ -146,8 +147,8 @@ auto getTorrents(tr_session* session, tr_variant* args) } else // all of them { - torrents.reserve(std::size(session->torrents())); - std::copy(std::begin(session->torrents()), std::end(session->torrents()), std::back_inserter(torrents)); + auto const& by_id = session->torrents().sorted_by_id(); + torrents = std::vector{ std::begin(by_id), std::end(by_id) }; } return torrents; diff --git a/libtransmission/torrents.h b/libtransmission/torrents.h index 8ff149af5..bd5921ed7 100644 --- a/libtransmission/torrents.h +++ b/libtransmission/torrents.h @@ -107,6 +107,11 @@ public: return std::empty(by_hash_); } + [[nodiscard]] constexpr auto const& sorted_by_id() const noexcept + { + return by_id_; + } + private: std::vector by_hash_;