- Minimum platform requirements raised to iOS 11.0 and macOS 10.13. The library's Files-app integration premise and APFS extended-attribute usage have always required these floors in practice; they are now stated explicitly.
-[NSURL to_setFileSystemUUID:]now returnsBOOL(previouslyvoid) so callers can detect xattr write failures. Existing call sites that ignore the return value continue to compile.-[NSURL to_generateFileSystemUUID]is now annotatednullableand returnsnilwhen the underlying xattr write fails, instead of returning a UUID that was never persisted to disk.TOFileSystemPresenter's-performCoordinatedRead:and-performCoordinatedWrite:methods have been removed. Their only callers were inside the library and have been replaced with direct, simpler logic.TOFileSystemItemMapTableno longer conforms toNSFastEnumeration. Iterate the new-allItemssnapshot accessor instead.
-[NSURL to_setFileSystemUUIDIfAbsent:]— atomic set-if-absent UUID write usingXATTR_CREATE. Replaces the previous read-then-write coordination for the initial UUID assignment path.TOFileSystemItemMapTable -allItems— point-in-time snapshot accessor that's safe to iterate while the table is being mutated.TOFileSystemObserver.directoryItemis now actually implemented (the property was previously declared but auto-synthesized to always returnnil).- Threading contract for
-addNotificationBlock:is now documented in the public header. Notification blocks fire on a background queue.
getxattr/setxattrreturn values are now checked. UUID reads no longer interpret uninitialised stack memory as a UUID on filesystems that don't support extended attributes; UUID writes no longer silently fail.-[NSURL to_setFileSystemUUID:]no longer crashes when passednilor an empty string (strlen(NULL)).-[NSURL to_isCopying]now returnsNOwhen the file's modification date is unreadable. Previously it returnedYESand consumers would treat the file as "still copying" indefinitely.-[NSURL to_numberOfSubItems]now falls back tolstatwhen the filesystem reportsDT_UNKNOWN(NFS, FAT and similar). Previously the count was silently wrong on those filesystems.- Notification-token dispatch now iterates a snapshot of the underlying hash table, so a block that invalidates another token mid-dispatch can no longer crash or skip in-flight notifications.
TOFileSystemItemList -synchronizeWithDiskremoves deleted items in reverse index order. Previously, removing two non-contiguous deletions could mis-target items because indices shifted between removals.- The full-scan
WillBegin/DidCompletenotifications now fire on empty directories. Previously the scan returned early without sending either, leaving consumers hung waiting for "scan complete". - Cross-instance scan stalls eliminated. UUID writes from one
TOFileSystemObserverinstance no longer serialise behind another observer's queue. Tests that previously took ~8 seconds now complete in under a second. TOFileSystemPresenter -stopnow drains any buffered file events and resets internal timer state, so a subsequent-startdoes not replay events from before the stop.- Symlinked directories are no longer recursed into during scans. A circular directory symlink would previously loop the scan indefinitely.
- Removed the dead/broken
-[TOFileSystemItem regenerateUUID]private method.
- Replaced dispatch barriers in
TOFileSystemItemwith threading locks to minimize GCD queue creation. - General internal code/commenting cleanup and refinement.
- An incorrect casting breaking the visible number of items inside of a directory.
- A crash that can occur if querying for the number of files in a deleted folder.
- A linking issue when importing the library via SPM on macOS.
- Public, thread-safe API access for accessing the UUID string of an observed item, and/or its parent directory.
- A thread coordinating issue where file UUIDs might not have been set yet upon first access.
- An issue where proper UUIDs were not being generated before adding items as children to list objects.
- An issue where deleting an item in Files.app would make the
.Trashfolder become treated like an official item.
- Exposed full system scans as a property on
TOFileSystemChangesin order to let observing objects defer work until the scan is complete.
- A bug where files moved below the sub-directory level limit weren't treated as deleted.
- A bug where specifying a sub-directory limit would result in an infinite loop.
- A bug where renaming/moving a file wouldn't be properly updated in the main graph.
- A bug where items marked as 'skipped' weren't being handled as such.
- A bug where files created during the initial scan would be permanently left in the 'copying' state.
- A bug where files of the incorrect sub-directory level limit were still being accessed.
- Initial Release! 🎉