Skip to content

0.9.9

Choose a tag to compare

@gavindi gavindi released this 25 May 19:31

Many changes ahead of the 1.0.0 release. Mostly around usability by giving UI elements tooltips to explain their actions.

Recent changes since last release:

0.9.9 — Toggle Tooltips

  • Verbose tooltips on all toggle switches: all 12 AdwSwitchRow toggles in the Settings tab and Job Edit dialog now have descriptive tooltips — Settings toggles (On Job Start, On Completion, On Completion with Errors/Warnings, Start daemon on login, Start minimized to tray, Shutdown daemon when closing, Verify checksums) and Job Edit toggles (Dry Run, Bi-directional sync, Enable Checksum, Mount at Start-up, Enable Schedule) each explain what the toggle does and any relevant consequences of changing it

0.9.8 — Button Tooltips

  • Verbose tooltips on all buttons: every interactive button in the GUI now has a descriptive tooltip — 23 buttons that previously had none (job run/stop/edit/delete/expand, add job, add remote, edit/delete remote, authorize OAuth, save/cancel in all dialogs, cron field clear, compare pagination, log file open) have been annotated, and 20 existing short tooltips (Back, Up, Refresh, Copy, Move, Sync, Mount, Swap, Delete, Compare, New Folder, and all Compare dialog filter/action buttons) have been rewritten as full sentences describing what the button does and any destructive consequences

0.9.7 — Performance Improvements Sprint 3

  • Release builds use -O3 -flto: CMakeLists.txt now enables -O3 and link-time optimisation for Release builds via target_compile_options / target_link_options guards — previously Release builds relied on CMake's default -O2 with no LTO
  • Shutdown waitpid poll granularity reduced from 50 ms to 5 ms: the SIGTERM → SIGKILL escalation loop in stop_daemon() previously slept 50 ms between each waitpid(WNOHANG) check, adding up to 50 ms of unnecessary latency after the process has already exited; the interval is now 5 ms so a cooperative rclone exit is detected within one tick rather than up to ten
  • Mount-point membership check: std::setstd::unordered_set: the live_mounts set constructed on each 60-second mount health-check tick now uses std::unordered_set<std::string>.count() lookups drop from O(log n) to O(1) average; #include <set> replaced with <unordered_set>

0.9.6 — Performance Improvements Sprint 2

  • HTTP session timeout reduced from 15 s to 5 s: all rclone RC requests now time out after 5 seconds — the previous 15-second limit meant a hung localhost rclone could stall 10 concurrent poll callbacks for 15 s each before the async queue drained; 5 s is sufficient for a local loopback call
  • Mount health timer skips HTTP call when no mounts are active: the 60-second list_mounts liveness check now returns early if no jobs of type Mount are currently active, avoiding a pointless HTTP round-trip every minute during normal sync-only use
  • Cron day_of_week computed once per day: the next-occurrence search previously called day_of_week() on every iteration of the up-to-2.1 M step minute loop — the result is now cached and recomputed only when the date changes, reducing calls by up to 1440× per day
  • Compare dialog pagination: O(3n) → O(n) per filter change: show_page, update_pagination_controls, and apply_filters each scanned m_all_rows independently; the filter+strip pass is now computed once in rebuild_filter_cache() into a m_filtered_rows cache that all three callers read, eliminating two redundant full-list traversals per filter toggle or page navigation
  • Compare dialog status column: CSS class swap guarded: the status-column bind callback previously removed all five CSS classes unconditionally on every scroll event; it now stores the current class via g_object_set_data and only removes the old class and adds the new one when they differ
  • Browser pane name column: dynamic casts replaced and CSS swap guarded: the name-column bind callback previously traversed the widget tree with two dynamic_cast calls and removed 12 CSS classes unconditionally on every scroll event; widget pointers are now stored in the setup callback via g_object_set_data and retrieved in O(1) in the bind callback, and the icon CSS class is only swapped when it changes

0.9.5 — Performance Improvements Sprint 1

  • Parallel job-state vectors consolidated into a struct: eight separate std::vectors (m_poll_timers, m_sched_timers, m_retry_timers, m_job_ids, m_job_submitting, m_poll_in_flight, m_retry_counts, m_last_stats) replaced by a single std::vector<JobState> — job deletion now performs one O(n) erase instead of eight, all per-job state is cache-locally contiguous, and independent resize calls scattered across the daemon are eliminated
  • Redundant get_stats HTTP call on job completion removed: on_job_completed previously fired a second core/stats HTTP round-trip to fetch final transfer counts despite the poll loop already caching them in m_last_stats (now JobState::last_stats) at most 500 ms earlier; completion now uses the cached value directly, eliminating one RC call per job lifecycle
  • job_updated no longer rebuilds the entire job list: the job_updated daemon broadcast previously called rebuild_ui() which disconnected all timers, removed every row widget, and recreated the full list; it now removes and recreates only the single affected row — O(1) widget operations instead of O(n)
  • Activity log not re-read on job start: refresh_log() was called on job_started in addition to job_completed and job_stopped; the log file does not change meaningfully mid-transfer so the disk read on start is removed — log view refreshes only on terminal job events

Full Changelog: 0.9.8...0.9.9