Version 2.8.4

Version 2.8.4 - Dec 26, 2025

Version 2.8.4rc2 has been released as the new version, with no new builds released.

I am uncertain as to why the AsyncStream encounters issues with the aforementioned problem. Nevertheless, I intend to investigate and determine if I can resolve this issue for my own learning and interest. Specifically, I will implement a mechanism to halt the process and drain any remaining data before the termination task is executed.

Major Features & Improvements

  • Total Commits (git) Since 2.8.2: 137+
  • Development Period: December 12-24, 2025

🔄 RsyncProcessStreaming Migration - Complete

  • Unified Process Execution Model: All process execution now uses the RsyncProcessStreaming package for event-driven, streaming process handling
  • Simplified Handler Management: Introduced ProcessHandlers factory with built-in cleanup hooks to prevent memory leaks and retain cycles
  • Real-time Output Streaming: Process output is now streamed in real-time, enabling immediate UI updates and better user feedback
  • Files Updated: Estimate.swift, Execute.swift, RestoreTableView.swift, OneTaskDetailsView.swift, ExecutePushPullView.swift, VerifyTasks.swift

📦 ParseRsyncOutput Swift Package Integration

  • Extracted rsync output parsing into a reusable Swift Package for improved code reusability and testability
  • Unified parsing logic across all rsync output processing operations
  • Package repository: ParseRsyncOutput

✅ Comprehensive Testing Framework

  • New RsyncUITests target added with initial test suite
  • UI tests for arguments and deeplink URLs
  • Output processing tests covering:
    • Tail trimming (20-line limit)
    • Directory line filtering
    • Error detection patterns
    • Malformed/empty output edge cases

Core Changes

Process Execution & Streaming

  • Refactored ObservableRestore to use RsyncProcessStreaming
  • Refactored task verification to use streaming process handlers
  • Added streaming support to QuicktaskView
  • Refactored rsync version check to use streaming process
  • Remove RsyncProcess dependency - replaced with RsyncProcessStreaming
  • Streaming handler cleanup refactoring to prevent retain cycles and memory leaks

UI/UX Enhancements

  • Improved UI feedback for task progress and completion
  • Enhanced progress view with better styling and layout
  • Added configuration table view to ProfileView
  • Renamed table column from ‘Time’ to ‘Time last’ across multiple views
  • Refactored profile deletion UI in ProfileView
  • Improved help text for –delete parameter usage
  • Better handling of hiddenID in Estimate and Execute operations
  • Removed RsyncRealtimeView and related obsolete UI references

Code Quality & Refactoring

  • Refactor optional handling patterns with guard-chain flattening and single binding for counts
  • Refactor enum cases to camelCase: RsyncCommand, PushPullCommand, OtherRsyncCommand, PlanSnapshots, DayOfWeek
  • Variable naming improvements for consistency and clarity across codebase
  • Removed unnecessary whitespace and improved code formatting
  • SwiftLint configuration updates and inline rule directives
  • Refactored UI views for improved readability (AddTaskView, SidebarMainView, TasksView, QuicktaskView)
  • Refactored parameter field handling in configuration models with optional fields

Configuration & Settings

  • New argument validation feature: Added toggle for argument validation in execution flow
  • Added ‘validate arguments’ setting to user configuration
  • Improved argument validation with nil checks and proper error handling
  • Add dry-run validation to argument checks
  • Configuration model improvements with optional parameter handling

Logging & Debugging

  • Refactored and cleaned up logging and test code
  • Removed rsync output logfile support from log views
  • Gated per-line streaming logs behind DEBUG flag
  • Added debug threading check for streaming handlers
  • Silenced debug print statements in streaming handlers
  • Improved logging to use errorMessageOnly with better formatting

Dependencies & Version Updates

  • Updated all Swift package dependencies to main branch

Bug Fixes & Stability

  • Fixed guard statement order and typo in snapshot and restore operations
  • Safely unwrap streamingHandlers before use
  • Remove unnecessary [weak self] in processTermination handlers
  • Made parameter4 optional to better handle delete flag
  • Fix potential nil issues in argument execution

Architecture Improvements

  • Unified streaming architecture with simplified process lifecycle
  • Improved memory management through explicit cleanup patterns
  • Enhanced testability with extracted ParseRsyncOutput package
  • Better separation of concerns through handler factory pattern

Dependencies Updated

  • RsyncProcessStreaming (streaming process execution)
  • ParseRsyncOutput (output parsing and processing)
  • RsyncArguments (rsync command arguments)
  • RsyncProcess (legacy - being phased out in favor of streaming)
Last modified December 26, 2025: Update Version284.md (9a74586)