Skip to content

chore: merged upstream 4.1.1 - #16

Merged
jacobcxdev merged 28 commits into
mainfrom
jacobcxdev/sync-upstream-4.1.1
Sep 18, 2026
Merged

jacobcxdev merged 28 commits into
mainfrom
jacobcxdev/sync-upstream-4.1.1

Conversation

@jacobcxdev

@jacobcxdev jacobcxdev commented Sep 18, 2026

Copy link
Copy Markdown
Owner

The installed app and registered Homebrew cask both point to upstream Xcodes 4.1.1, leaving sign-in failures without the fork's retry and error handling. This merges upstream v4.1.1b41 while retaining the fork's identity, session restoration, Keychain behaviour, and signed update feed, and prepares v4.1.1b49.

  • Included upstream login-library changes, credential autofill, platform architecture fixes, notification fixes, and privileged file operations with helper 2.1.0.
  • Extended transient authentication retries to the new service-key resolver's wrapped HTTP failures; retained immediate failures for parsing errors.
  • Preserved dangling-symlink replacement and real-file protection, rejected relative helper paths, and corrected permanent-uninstall confirmation text.
  • Preserved cancellation handling and prevented stale uninstall tasks from leaving progress indicators behind.
  • Updated Sparkle observation for main-actor isolation and documented Homebrew removal before installing the fork.
  • Separated platform metadata from titles and actions, placed installed-platform navigation below the list instead of over it, and improved narrow sidebar labels after inspecting the macOS 27 interface.

Validation: release, appcast, identity, localisation, shell, and workflow contracts passed locally. App and test targets compile locally; the full hosted test suite runs in CI to avoid interrupting the local desktop. Regression tests cover wrapped authentication failures, helper filesystem operations, and cancellation.

Josh Michaels and others added 23 commits August 5, 2026 12:57
appleDescription already includes the major version, so prepending
major.description + "." rendered titles like "27.27.0 Beta 4".
Use appleDescription directly via a testable static helper.

Co-Authored-By: Claude <noreply@anthropic.com>
The "New Xcode version available" notification was triggered by an
array-count increase rather than by the appearance of a genuinely new
version identity (AvailableXcode.xcodeID). This caused two user-visible
bugs:

- False negative: when a new version is added and an old one removed in
  the same refresh (count unchanged, or even shrunk), no notification
  fired, so a genuinely new version landed silently.
- False positive: when the array grew without a new identity (a duplicate
  row, or a data-source switch returning an already-known xcodeID), a
  spurious "new version" banner appeared.

Extract the decision into a pure static helper
AppState.newlyAvailableXcodes(oldXcodes:newXcodes:) that computes the
xcodeID set difference, and notify iff it is non-empty. The empty-old
guard is preserved so the initial cache load (empty -> populated) does
not notify; the scheduleNotification arguments are unchanged.

Adds XcodesTests/NewVersionNotificationTests.swift with a red-before-green
regression suite (the false-negative and false-positive cases fail against
a buggy count-based mirror and pass against the identity-based body).

Co-Authored-By: Claude <noreply@anthropic.com>
fix: notify on new Xcode version identity, not array-count growth
…tion-title

fix: duplicated major version in install notification title
…ture-picker

fix: platform architecture picker visibility
chore: update xcodesKit and LoginKit to latest. minor fixes
Ports moveApp/createSymbolicLink/rename/remove from developer_id onto
current HelperXPCProtocol (now Sendable) and adds FileOperations.swift
implementing them.
…ileged helper

Adds usePrivilegedHelperForFileOperations preference and wires
HelperClient's new moveApp/createSymbolicLink/rename/remove methods
into AppState's select, createSymbolicLink, renameToXcode, and
uninstall flows, gated behind the toggle. Falls back to direct
FileManager operations (via FileOperations/XcodeSelectionFilesystemService)
when the toggle is off.
Points the XcodesKit package dependency at abiligiri/XcodesKit async-move-item-for-helper branch, which makes XcodeUnarchiveService.MoveItem async so the post-unarchive move into /Applications can go through Current.helper.moveAppAsync when usePrivilegedHelperForFileOperations is enabled.

This is a temporary fork pin; the corresponding XcodesKit change should be upstreamed to XcodesOrg/XcodesKit and this pinned back to a released version once merged.
Uninstall now permanently deletes files instead of moving to Trash, and the delete can take a noticeable number of seconds with zero visual feedback in the row/detail pane. Sets installState to .uninstalling at the start of AppState.uninstall(xcode:) and resets it on failure; on success the existing post-uninstall updateInstalledXcodesAsync() recompute already clears it back to .notInstalled.

Requires the XcodesKit fork's new .uninstalling(Path) case (abiligiri/XcodesKit@fbee0cd).
…ileOperations strings

The xcstrings.yml CI check requires every key to have translations for all 18 supported languages (ca, de, el, es, fi, fr, hi, it, ja, ko, nl, pl, pt-BR, ru, tr, uk, zh-Hans, zh-Hant), and these two new keys were English-only.
…lper-file-ops

Feature/privileged helper file ops
Support password manager autofill during Apple ID sign-in
- Integrated upstream login, helper, platform and notification updates.
- Preserved fork identity, session restoration and credential handling.
- Fixed wrapped transient errors, filesystem guards and cancellation.
- Prepared build 49 and documented Homebrew replacement prevention.
@jacobcxdev jacobcxdev self-assigned this Sep 18, 2026
- Retried transient authentication status errors within the existing limit.
- Preserved unauthorised failures and saved credentials.
- Added status-specific regression coverage.
- Separated platform metadata from titles and actions.
- Moved platform navigation below the sidebar list.
- Allowed titles to wrap and shortened paths in the middle.
- Applied flexible label height to version groups.
- Reduced spacing reserved beside selection controls.
- Specified the optional status type for older Swift compilers.
- Preserved transient authentication retry behaviour.
- Created isolated app directories for filesystem discovery.
- Replaced scheduler polling with explicit helper expectations.
- Preserved cancellation and replacement-state assertions.
@jacobcxdev
jacobcxdev merged commit 8005400 into main Sep 18, 2026
2 checks passed
@jacobcxdev
jacobcxdev deleted the jacobcxdev/sync-upstream-4.1.1 branch September 18, 2026 11:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants