Version 2.7.7

Version 2.7.7 (build 168) - Release Candidate (RC3)

Note: I initially believed that the next release, version 2.7.7, would be a minor update. However, it appears to be a more significant release. This is most likely the last RC before the new release.

All changes in code since version 2.7.6 can be viewed here. The release is scheduled for late November. I personally use this version daily and frequently compile new versions when there are code updates.

Update Nov 15

Following a Swift concurrency conference video, I implemented “Approachable Concurrency” in three Swift packages. Within RsyncUI, I utilized Swift Logger to display in Xcode Console whether a call is on the main thread or a background thread. Upon reviewing the logging, I discovered an excessive number of log statements. Consequently, in the next release build, logging statements are disabled for the release build, but they are enabled when running RsyncUI in Xcode only.

I have removed numerous “boilerplate code” for log statements and instead enhanced the Logger with new functions. Replacing all logging statements in code applies to numerous files, but it specifically targets the “boilerplate code” for logging statements.

Real-Time Output

Real-time output from rsync is now included. You can find it within the “hidden” menu, accessible using the shortcut ⌘S to reveal concealed toolbar options. The real-time view captures all output from rsync as it happens. The capture requires some additional CPU when activated, and it is automatically enabled and disabled when opening and closing the view. Additionally, the captured output is stored in memory and is cleared when the view is closed or by using the Clear button.

The real-time output captures the rsync output by an actor without blocking the @MainActor and UI updates. However, the @Observable object monitoring updates is executed on the @MainActor and updates the real-time view.

Schedules

A bug related to deleting schedules has been fixed, and upon request, the weekly schedule has been reinstated. Schedules can only be added for the current and the next month. This restriction is implemented to manage memory usage effectively, as every schedule includes the callback action, which is stored in memory. Schedules are automatically saved to a file and reloaded into memory upon startup.

Charts

A bug in the charts has been fixed. The bug could cause RsyncUI to crash.

Continue Concealing Distractions

I am currently working on concealing even more distractions, and the next one will be located on the main toolbar. By using the shortcut ⌘S (for showing or hiding) or by accessing the Task main menu, the Charts and Quick task will be displayed. They are concealed by default. To reveal them, simply toggle the show or hide option using the shortcut.

Internal Refactor

Two minor but crucial objects have been refactored as Swift Package Manager (SPM) packages. Refactoring to SPM isolates the code, making it easier to test. The two objects are responsible for executing tasks, such as the actual rsync command with arguments outside of RsyncUI. Both objects listen for output from the tasks and the termination signal. If they fail, RsyncUI also fails.

A significant modification introduced by using SPM is the relocation of any local calls within the object to the outside of the SPM. This is achieved through Dependency Injection (DI). The process object depends on calling other objects within RsyncUI, and these objects are subsequently fed into the process object.

Swift Packages for RsyncUI

The two latest SPM packages are RsyncProcess and ProcessCommand.

Main Repository

Local RsyncUI Packages (by SPM)

SPM makes it easy to create local packages. Each package contains its own tests using Swift Testing, the new framework for creating tests.

Last modified November 15, 2025: Update Version277.md (2a3dc15)