Version 2.7.7

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

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

Update Nov 12

As of now, there are no updates to the RC. However, I have made some further enhancements to the RsyncProcess Swift Package. New within the package is the ability to read the output from the rsync process in real-time. Within the summarized view, you will receive the output from each task estimated, but this view is completed after the task is finished. The real-time view of rsync output is not yet included in RsyncUI. However, there is a minor, menu-based version of RsyncUI called RsyncUImenu that includes this feature. The model of the RsyncUImenu app is a clone of the model for RsyncUI. The only new development is the UI part. The RsyncUImenu app can be used in parallel with RsyncUI, but not simultaneously.

You may consider testing RsyncUImenu. It has been in development for some time and should be as stable as RsyncUI. Please note that it remains active in the menu bar until explicitly closed.

Internal refactor

Two minor, but crucial objects has been refactored as Swift Package Manager (SPM) objects. 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 utilizing SPM is the relocation of any local calls within the object to the outside of the SPM. This is achieved through the implementation of Dependency Injection (DI). The process object is dependent on calling other objects within RsyncUI, and these objects are subsequently fed into the process object. As an example:

let handlers = ProcessHandlers(
            processtermination: processtermination_estimation,
            filehandler: { _ in
                Logger.process.info("ProcessRsync: You should not SEE this message")
            },
            rsyncpath: GetfullpathforRsync().rsyncpath,
            checklineforerror: TrimOutputFromRsync().checkforrsyncerror,
            updateprocess: SharedReference.shared.updateprocess,
            propogateerror: { error in
                SharedReference.shared.errorobject?.alert(error: error)
            },
            logger: { command, output in
                _ = await ActorLogToFile(command, output)
            },
            checkforerrorinrsyncoutput: SharedReference.shared.checkforerrorinrsyncoutput,
            rsyncversion3: SharedReference.shared.rsyncversion3,
            environment: MyEnvironment()?.environment
        )

The actual definition of the ProcessHandlers is within the SPM.

Continue concealing distractions

I am currently working on concealing even more distractions, and the next one will be located on the main toolbar. By utilizing the shortcut ⌘S (for displaying or concealing) or by accessing the Task main menu, the Charts and Quick task will be presented. It is concealed by default. To reveal it, simply toggle the show or hide option using the shortcut.

Bugs

I have also fixed a bug in the Charts. The bug may cause RsyncUI to crash.

Swift Packages

The two last SPM are RsyncProcess and ProcessCommand. The test cases for the last two SPM are in development.

Main Repository

Local RsyncUI packages (by SPM)

SPM makes it easy to create local packages. And each package containes their own tests by Swift Testing, the new framwork for creating tests. All packages are created by me.

Last modified November 12, 2025: Update Version277.md (2955900)