From 0d036de3e5edbca721f160b806721fe9d20a996d Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 18 Dec 2025 14:02:16 -0600 Subject: [PATCH] fix: support sort mode, show mode in `api_compat` (#7952) * refactor: add api-compat for sort-mode * refactor: add api-compat for show-mode * test: update tests * chore: make clang-tidy happy --- libtransmission/api-compat.cc | 35 +++++++++++++++++++---- libtransmission/quark.cc | 36 ++++++++++++++++++++++++ libtransmission/quark.h | 36 ++++++++++++++++++++++++ tests/libtransmission/api-compat-test.cc | 4 +-- 4 files changed, 103 insertions(+), 8 deletions(-) diff --git a/libtransmission/api-compat.cc b/libtransmission/api-compat.cc index f207e2b6c..5eeaa4c04 100644 --- a/libtransmission/api-compat.cc +++ b/libtransmission/api-compat.cc @@ -245,7 +245,7 @@ auto constexpr RpcKeys = std::array{ { { TR_KEY_torrent_verify, TR_KEY_torrent_verify_kebab }, } }; -auto constexpr SessionKeys = std::array{ { +auto constexpr SessionKeys = std::array{ { { TR_KEY_activity_date, TR_KEY_activity_date_kebab_APICOMPAT }, { TR_KEY_added_date, TR_KEY_added_date_kebab_APICOMPAT }, { TR_KEY_alt_speed_down, TR_KEY_alt_speed_down_kebab }, @@ -349,15 +349,33 @@ auto constexpr SessionKeys = std::array{ { { TR_KEY_seed_queue_size, TR_KEY_seed_queue_size_kebab }, { TR_KEY_seeding_time_seconds, TR_KEY_seeding_time_seconds_kebab_APICOMPAT }, { TR_KEY_session_count, TR_KEY_session_count_kebab_APICOMPAT }, + { TR_KEY_show_active, TR_KEY_show_active_kebab_APICOMPAT }, + { TR_KEY_show_all, TR_KEY_show_all_kebab_APICOMPAT }, { TR_KEY_show_backup_trackers, TR_KEY_show_backup_trackers_kebab }, + { TR_KEY_show_downloading, TR_KEY_show_downloading_kebab_APICOMPAT }, + { TR_KEY_show_error, TR_KEY_show_error_kebab_APICOMPAT }, { TR_KEY_show_extra_peer_details, TR_KEY_show_extra_peer_details_kebab }, { TR_KEY_show_filterbar, TR_KEY_show_filterbar_kebab }, + { TR_KEY_show_finished, TR_KEY_show_finished_kebab_APICOMPAT }, { TR_KEY_show_notification_area_icon, TR_KEY_show_notification_area_icon_kebab }, { TR_KEY_show_options_window, TR_KEY_show_options_window_kebab }, + { TR_KEY_show_paused, TR_KEY_show_paused_kebab_APICOMPAT }, + { TR_KEY_show_seeding, TR_KEY_show_seeding_kebab_APICOMPAT }, { TR_KEY_show_statusbar, TR_KEY_show_statusbar_kebab }, { TR_KEY_show_toolbar, TR_KEY_show_toolbar_kebab }, { TR_KEY_show_tracker_scrapes, TR_KEY_show_tracker_scrapes_kebab }, + { TR_KEY_show_verifying, TR_KEY_show_verifying_kebab_APICOMPAT }, { TR_KEY_sleep_per_seconds_during_verify, TR_KEY_sleep_per_seconds_during_verify_kebab }, + { TR_KEY_sort_by_activity, TR_KEY_sort_by_activity_kebab_APICOMPAT }, + { TR_KEY_sort_by_age, TR_KEY_sort_by_age_kebab_APICOMPAT }, + { TR_KEY_sort_by_eta, TR_KEY_sort_by_eta_kebab_APICOMPAT }, + { TR_KEY_sort_by_id, TR_KEY_sort_by_id_kebab_APICOMPAT }, + { TR_KEY_sort_by_name, TR_KEY_sort_by_name_kebab_APICOMPAT }, + { TR_KEY_sort_by_progress, TR_KEY_sort_by_progress_kebab_APICOMPAT }, + { TR_KEY_sort_by_queue, TR_KEY_sort_by_queue_kebab_APICOMPAT }, + { TR_KEY_sort_by_ratio, TR_KEY_sort_by_ratio_kebab_APICOMPAT }, + { TR_KEY_sort_by_size, TR_KEY_sort_by_size_kebab_APICOMPAT }, + { TR_KEY_sort_by_state, TR_KEY_sort_by_state_kebab_APICOMPAT }, { TR_KEY_sort_mode, TR_KEY_sort_mode_kebab }, { TR_KEY_sort_reversed, TR_KEY_sort_reversed_kebab }, { TR_KEY_speed_Bps, TR_KEY_speed_Bps_kebab_APICOMPAT }, @@ -572,14 +590,19 @@ struct CloneState { auto const pop = state_.convert_strings; auto new_key = convert_key(key, state_.style, state_.is_rpc); - auto const special = - (state_.is_rpc && - (new_key == TR_KEY_method || new_key == TR_KEY_fields || new_key == TR_KEY_ids || - new_key == TR_KEY_torrents)); + + auto const special_rpc = state_.is_rpc && + (new_key == TR_KEY_method || new_key == TR_KEY_fields || new_key == TR_KEY_ids || + new_key == TR_KEY_torrents); // TODO(ckerr): replace `new_key == TR_KEY_TORRENTS` on previous line with logic to turn on convert // if it's an array inside an array val whose key was `torrents`. // This is for the edge case of table mode: `torrents : [ [ 'key1', 'key2' ], [ ... ] ]` - state_.convert_strings |= special; + state_.convert_strings |= special_rpc; + + auto const special_settings = !state_.is_rpc && + (new_key == TR_KEY_sort_mode || key == TR_KEY_sort_mode || new_key == TR_KEY_filter_mode || + key == TR_KEY_filter_mode); + state_.convert_strings |= special_settings; // Crazy case: total_size in free-space, totalSize in torrent-get if (state_.is_free_space_response && new_key == TR_KEY_total_size_camel) diff --git a/libtransmission/quark.cc b/libtransmission/quark.cc index 2bbd8934f..e34c8e943 100644 --- a/libtransmission/quark.cc +++ b/libtransmission/quark.cc @@ -568,22 +568,38 @@ auto constexpr MyStatic = std::array{ "session_id"sv, // rpc "session_set"sv, // rpc "session_stats"sv, // rpc + "show-active", + "show-all", "show-backup-trackers"sv, // gtk app, qt app + "show-downloading", + "show-error", "show-extra-peer-details"sv, // gtk app "show-filterbar"sv, // gtk app, qt app + "show-finished", "show-notification-area-icon"sv, // gtk app, qt app "show-options-window"sv, // gtk app, qt app + "show-paused", + "show-seeding", "show-statusbar"sv, // gtk app, qt app "show-toolbar"sv, // gtk app, qt app "show-tracker-scrapes"sv, // gtk app, qt app + "show-verifying", + "show_active", + "show_all", "show_backup_trackers"sv, // gtk app, qt app + "show_downloading", + "show_error", "show_extra_peer_details"sv, // gtk app "show_filterbar"sv, // gtk app, qt app + "show_finished", "show_notification_area_icon"sv, // gtk app, qt app "show_options_window"sv, // gtk app, qt app + "show_paused", + "show_seeding", "show_statusbar"sv, // gtk app, qt app "show_toolbar"sv, // gtk app, qt app "show_tracker_scrapes"sv, // gtk app, qt app + "show_verifying", "sitename"sv, // rpc "size-bytes"sv, // rpc "size-units"sv, // rpc @@ -594,8 +610,28 @@ auto constexpr MyStatic = std::array{ "sleep-per-seconds-during-verify"sv, // tr_session::Settings "sleep_per_seconds_during_verify"sv, // tr_session::Settings "socket_address"sv, // .resume + "sort-by-activity", // gtk app, qt app + "sort-by-age", // gtk app, qt app + "sort-by-eta", // gtk app, qt app + "sort-by-id", // gtk app, qt app + "sort-by-name", // gtk app, qt app + "sort-by-progress", // gtk app, qt app + "sort-by-queue", // gtk app, qt app + "sort-by-ratio", // gtk app, qt app + "sort-by-size", // gtk app, qt app + "sort-by-state", // gtk app, qt app "sort-mode"sv, // gtk app, qt app "sort-reversed"sv, // gtk app, qt app + "sort_by_activity", // gtk app, qt app + "sort_by_age", // gtk app, qt app + "sort_by_eta", // gtk app, qt app + "sort_by_id", // gtk app, qt app + "sort_by_name", // gtk app, qt app + "sort_by_progress", // gtk app, qt app + "sort_by_queue", // gtk app, qt app + "sort_by_ratio", // gtk app, qt app + "sort_by_size", // gtk app, qt app + "sort_by_state", // gtk app, qt app "sort_mode"sv, // gtk app, qt app "sort_reversed"sv, // gtk app, qt app "source"sv, // .torrent diff --git a/libtransmission/quark.h b/libtransmission/quark.h index ec40cd766..1264b6875 100644 --- a/libtransmission/quark.h +++ b/libtransmission/quark.h @@ -581,22 +581,38 @@ enum // NOLINT(performance-enum-size) TR_KEY_session_id, TR_KEY_session_set, TR_KEY_session_stats, + TR_KEY_show_active_kebab_APICOMPAT, + TR_KEY_show_all_kebab_APICOMPAT, TR_KEY_show_backup_trackers_kebab, + TR_KEY_show_downloading_kebab_APICOMPAT, + TR_KEY_show_error_kebab_APICOMPAT, TR_KEY_show_extra_peer_details_kebab, TR_KEY_show_filterbar_kebab, + TR_KEY_show_finished_kebab_APICOMPAT, TR_KEY_show_notification_area_icon_kebab, TR_KEY_show_options_window_kebab, + TR_KEY_show_paused_kebab_APICOMPAT, + TR_KEY_show_seeding_kebab_APICOMPAT, TR_KEY_show_statusbar_kebab, TR_KEY_show_toolbar_kebab, TR_KEY_show_tracker_scrapes_kebab, + TR_KEY_show_verifying_kebab_APICOMPAT, + TR_KEY_show_active, + TR_KEY_show_all, TR_KEY_show_backup_trackers, + TR_KEY_show_downloading, + TR_KEY_show_error, TR_KEY_show_extra_peer_details, TR_KEY_show_filterbar, + TR_KEY_show_finished, TR_KEY_show_notification_area_icon, TR_KEY_show_options_window, + TR_KEY_show_paused, + TR_KEY_show_seeding, TR_KEY_show_statusbar, TR_KEY_show_toolbar, TR_KEY_show_tracker_scrapes, + TR_KEY_show_verifying, TR_KEY_sitename, TR_KEY_size_bytes_kebab, TR_KEY_size_units_kebab, @@ -607,8 +623,28 @@ enum // NOLINT(performance-enum-size) TR_KEY_sleep_per_seconds_during_verify_kebab, TR_KEY_sleep_per_seconds_during_verify, TR_KEY_socket_address, + TR_KEY_sort_by_activity_kebab_APICOMPAT, + TR_KEY_sort_by_age_kebab_APICOMPAT, + TR_KEY_sort_by_eta_kebab_APICOMPAT, + TR_KEY_sort_by_id_kebab_APICOMPAT, + TR_KEY_sort_by_name_kebab_APICOMPAT, + TR_KEY_sort_by_progress_kebab_APICOMPAT, + TR_KEY_sort_by_queue_kebab_APICOMPAT, + TR_KEY_sort_by_ratio_kebab_APICOMPAT, + TR_KEY_sort_by_size_kebab_APICOMPAT, + TR_KEY_sort_by_state_kebab_APICOMPAT, TR_KEY_sort_mode_kebab, TR_KEY_sort_reversed_kebab, + TR_KEY_sort_by_activity, + TR_KEY_sort_by_age, + TR_KEY_sort_by_eta, + TR_KEY_sort_by_id, + TR_KEY_sort_by_name, + TR_KEY_sort_by_progress, + TR_KEY_sort_by_queue, + TR_KEY_sort_by_ratio, + TR_KEY_sort_by_size, + TR_KEY_sort_by_state, TR_KEY_sort_mode, TR_KEY_sort_reversed, TR_KEY_source, diff --git a/tests/libtransmission/api-compat-test.cc b/tests/libtransmission/api-compat-test.cc index 75f31b86e..e6ce0c73a 100644 --- a/tests/libtransmission/api-compat-test.cc +++ b/tests/libtransmission/api-compat-test.cc @@ -459,7 +459,7 @@ constexpr std::string_view CurrentSettingsJson = R"json({ "download_queue_enabled": true, "download_queue_size": 5, "encryption": 1, - "filter_mode": "show-all", + "filter_mode": "show_all", "filter_trackers": "", "idle_seeding_limit": 30, "idle_seeding_limit_enabled": false, @@ -516,7 +516,7 @@ constexpr std::string_view CurrentSettingsJson = R"json({ "show_toolbar": true, "show_tracker_scrapes": false, "sleep_per_seconds_during_verify": 100, - "sort_mode": "sort-by-name", + "sort_mode": "sort_by_name", "sort_reversed": false, "speed_limit_down": 100, "speed_limit_down_enabled": false,