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/
This commit is contained in:
Charles Kerr 2023-10-25 13:42:14 -04:00
parent 4b10f67ad1
commit 2e2c86060b
2 changed files with 11 additions and 5 deletions

View File

@ -130,10 +130,11 @@ auto getTorrents(tr_session* session, tr_variant* args)
{ {
time_t const cutoff = tr_time() - RecentlyActiveSeconds; 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::copy_if(
std::begin(session->torrents()), std::begin(by_id),
std::end(session->torrents()), std::end(by_id),
std::back_inserter(torrents), std::back_inserter(torrents),
[&cutoff](auto const* tor) { return tor->anyDate >= cutoff; }); [&cutoff](auto const* tor) { return tor->anyDate >= cutoff; });
} }
@ -148,8 +149,8 @@ auto getTorrents(tr_session* session, tr_variant* args)
} }
else // all of them else // all of them
{ {
torrents.reserve(std::size(session->torrents())); auto const& by_id = session->torrents().sorted_by_id();
std::copy(std::begin(session->torrents()), std::end(session->torrents()), std::back_inserter(torrents)); torrents = std::vector<tr_torrent*>{ std::begin(by_id), std::end(by_id) };
} }
return torrents; return torrents;

View File

@ -102,6 +102,11 @@ public:
return std::empty(by_hash_); return std::empty(by_hash_);
} }
[[nodiscard]] constexpr auto const& sorted_by_id() const noexcept
{
return by_id_;
}
private: private:
std::vector<tr_torrent*> by_hash_; std::vector<tr_torrent*> by_hash_;