diff --git a/.github/workflows/appcast.yml b/.github/workflows/appcast.yml
index ce61d3f..4cd9181 100644
--- a/.github/workflows/appcast.yml
+++ b/.github/workflows/appcast.yml
@@ -9,13 +9,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
- # If you're using actions/checkout@v3 you must set persist-credentials to false in most cases for the deployment to work correctly.
+ # If you're using actions/checkout@v4 you must set persist-credentials to false in most cases for the deployment to work correctly.
persist-credentials: false
- name: Cache 📦
- uses: actions/cache@v3.3.1
+ uses: actions/cache@v4.0.0
with:
path: AppCast/vendor/bundle
key: ${{ runner.os }}-gems-v1.0-${{ hashFiles('AppCast/Gemfile') }}
@@ -23,9 +23,9 @@ jobs:
${{ runner.os }}-gems-
- name: Setup Ruby, JRuby and TruffleRuby
- uses: ruby/setup-ruby@v1.149.0
+ uses: ruby/setup-ruby@v1.169.0
with:
- ruby-version: '2.7'
+ ruby-version: '3.0'
- name: Bundler 💎
working-directory: AppCast
@@ -43,8 +43,8 @@ jobs:
run: bundle exec jekyll build
- name: Publish 🚀
- uses: JamesIves/github-pages-deploy-action@releases/v3
+ uses: JamesIves/github-pages-deploy-action@releases/v4
with:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- BRANCH: gh-pages
- FOLDER: AppCast/_site
+ token: ${{ secrets.GITHUB_TOKEN }}
+ branch: gh-pages
+ folder: AppCast/_site
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3a4a580..788f9af 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -8,10 +8,10 @@ on:
jobs:
test:
- runs-on: macos-12
+ runs-on: macos-13
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Run tests
env:
- DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
+ DEVELOPER_DIR: /Applications/Xcode_15.0.1.app
run: xcodebuild test -scheme Xcodes
diff --git a/HelperXPCShared/HelperXPCShared.swift b/HelperXPCShared/HelperXPCShared.swift
index d3825af..80f89b8 100644
--- a/HelperXPCShared/HelperXPCShared.swift
+++ b/HelperXPCShared/HelperXPCShared.swift
@@ -1,7 +1,7 @@
import Foundation
-let machServiceName = "com.robotsandpencils.XcodesApp.Helper"
-let clientBundleID = "com.robotsandpencils.XcodesApp"
+let machServiceName = "com.xcodesorg.xcodesapp.Helper"
+let clientBundleID = "com.xcodesorg.xcodesapp"
let subjectOrganizationalUnit = Bundle.main.infoDictionary!["CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT"] as! String
@objc(HelperXPCProtocol)
diff --git a/README.md b/README.md
index 396f692..4a8f228 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ _If you're looking for a command-line version of Xcodes.app, try [`xcodes`](http


-### :tada: Announcment
+### :tada: Announcement
XcodesApp is now part of the `XcodesOrg` - [read more here](nextstep.md)
@@ -23,6 +23,10 @@ XcodesApp is now part of the `XcodesOrg` - [read more here](nextstep.md)
- View release notes, OS compatibility, included SDKs and compilers from [Xcode Releases](https://xcodereleases.com).
- Dark/Light Mode supported
+## Platforms/Runtimes
+
+- Xcodes supports downloading the Apple runtimes via the app. Simply click on the Platform, and Xcodes will install automatically for you.
+
## Experiments
- Thanks to the wonderful work of [https://github.com/saagarjha/unxip](https://github.com/saagarjha/unxip), turn on the experiment to increase your unxipping time by up to 70%! More can be found on his repo, but bugs, high memory may occur if used.
@@ -46,11 +50,13 @@ The following languages are supported because of the following community users!
|Ukranian 🇺🇦 |[@gelosi](https://github.com/gelosi)|Japanese 🇯🇵|[@tatsuz0u](https://github.com/tatsuz0u)|
|German 🇩🇪|[@drct](https://github.com/drct)|Dutch 🇳🇱|[@jfversluis](https://github/com/jfversluis)|
|Brazilian Portuguese 🇧🇷|[@brunomunizaf](https://github.com/brunomunizaf)|Polish 🇵🇱|[@jakex7](https://github.com/jakex7)|
+|Catalan|[@ferranabello](https://github.com/ferranabello)|
Want to add more languages? Simply create a PR with the updated strings file.
-## Installation
-Xcodes.app runs on macOS Big Sur 11.0 or later.
+## Installation
+v1.X - requires MacOS 11 or newer
+v2.X - requires MacOS 13
### Install with Homebrew
@@ -65,9 +71,17 @@ brew install --cask xcodes
1. Download the latest version [here](https://github.com/XcodesOrg/XcodesApp/releases/latest) using the **Xcodes.zip** asset. These are Developer ID-signed and notarized release builds and don't require Xcode to already be installed in order to use.
2. Move the unzipped `Xcodes.app` to your `/Applications` directory
+## Support
+
+Xcodes.app and CLI is updated, maintained with contributors like yourself. Even open source libraries and tools come with expenses. If you would like to support Xcodes or donate to the development and maintenance of the tool, it would be greatly appreciated. There is absolutely no obligation!
+
+
+
+
+
## Development
-You'll need macOS 12 Big Sur and Xcode 13 in order to build and run Xcodes.app.
+You'll need macOS 13.5 Ventura and Xcode 15 in order to build and run Xcodes.app.
`Unxip` and `aria2` must be compiled as a universal binary
```
@@ -96,8 +110,8 @@ Follow the steps below to build and release a new version of Xcodes.app. For any
# Update the version number in Xcode and commit the change, if necessary
# Question: Did anything in XPCHelper change?
-# - com.robotsandpencils.XcodesApp.Helper folder and HelperXPCShared
-# - if so, bump the version number in com.robotsandpencils.XcodesApp.Helper target.
+# - com.xcodesorg.xcodesapp.Helper folder and HelperXPCShared
+# - if so, bump the version number in com.xcodesorg.xcodesapp.Helper target.
# Note: you do not have to bump the version number if nothing has changed.
# Note2: If you do bump the version, the end user, must re-install the XPCHelper and give permission again.
@@ -154,4 +168,4 @@ popd
[Matt Kiazyk](https://github.com/mattkiazyk) - [Twitter](https://www.twitter.com/mattkiazyk)
-[Twitter](https://twitter.com/xcodesApp) | [GitHub](https://github.com/xcodesOrg)
+[Twitter](https://twitter.com/xcodesApp) | [GitHub](https://github.com/xcodesOrg) | [Mastadon](https://iosdev.space/@XcodesApp) |
diff --git a/Scripts/uninstall_privileged_helper.sh b/Scripts/uninstall_privileged_helper.sh
index c3ce84b..dc726eb 100755
--- a/Scripts/uninstall_privileged_helper.sh
+++ b/Scripts/uninstall_privileged_helper.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-PRIVILEGED_HELPER_LABEL=com.robotsandpencils.XcodesApp.Helper
+PRIVILEGED_HELPER_LABEL=com.xcodesorg.xcodesapp.Helper
sudo rm /Library/PrivilegedHelperTools/$PRIVILEGED_HELPER_LABEL
sudo rm /Library/LaunchDaemons/$PRIVILEGED_HELPER_LABEL.plist
diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj
index 0fc83e8..4523900 100644
--- a/Xcodes.xcodeproj/project.pbxproj
+++ b/Xcodes.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 52;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -13,12 +13,23 @@
536CFDD4263C9A8000026CE0 /* XcodesSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */; };
53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CBAB2B263DCC9100410495 /* XcodesAlert.swift */; };
63EAA4EB259944450046AB8F /* ProgressButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EAA4EA259944450046AB8F /* ProgressButton.swift */; };
+ 9DD4FFCB2B13EC1800C974F1 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 9DD4FFCA2B13EC1800C974F1 /* Localizable.xcstrings */; };
+ B0403CF02AD92D7B00137C09 /* ReleaseNotesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CEF2AD92D7B00137C09 /* ReleaseNotesView.swift */; };
+ B0403CF22AD934B600137C09 /* CompatibilityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CF12AD934B600137C09 /* CompatibilityView.swift */; };
+ B0403CF42AD9381D00137C09 /* SDKsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CF32AD9381D00137C09 /* SDKsView.swift */; };
+ B0403CF62AD9849E00137C09 /* CompilersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CF52AD9849E00137C09 /* CompilersView.swift */; };
+ B0403CF82AD991F800137C09 /* UnselectedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CF72AD991F800137C09 /* UnselectedView.swift */; };
+ B0403CFA2AD9942A00137C09 /* NotInstalledStateButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CF92AD9942A00137C09 /* NotInstalledStateButtons.swift */; };
+ B0403CFC2AD9A6BF00137C09 /* InstalledStateButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CFB2AD9A6BF00137C09 /* InstalledStateButtons.swift */; };
+ B0403CFE2ADA712C00137C09 /* InfoPaneControls.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CFD2ADA712C00137C09 /* InfoPaneControls.swift */; };
+ B0C6AD042AD6E65700E64698 /* ReleaseDateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */; };
+ B0C6AD0B2AD9178E00E64698 /* IdenticalBuildView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */; };
+ B0C6AD0D2AD91D7900E64698 /* IconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD0C2AD91D7900E64698 /* IconView.swift */; };
CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */; };
CA2518EC25A7FF2B00F08414 /* AppStateUpdateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2518EB25A7FF2B00F08414 /* AppStateUpdateTests.swift */; };
CA25192A25A9644800F08414 /* XcodeInstallState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA25192925A9644800F08414 /* XcodeInstallState.swift */; };
CA378F992466567600A58CE0 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA378F982466567600A58CE0 /* AppState.swift */; };
CA39711924495F0E00AFFB77 /* AppStoreButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA39711824495F0E00AFFB77 /* AppStoreButtonStyle.swift */; };
- CA42DD6E25AEA8B200BC0B0C /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA42DD6D25AEA8B200BC0B0C /* Logger.swift */; };
CA42DD7325AEB04300BC0B0C /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA42DD7225AEB04300BC0B0C /* Logger.swift */; };
CA44901F2463AD34003D8213 /* Tag.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA44901E2463AD34003D8213 /* Tag.swift */; };
CA452BB0259FD9770072DFA4 /* ProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA452BAF259FD9770072DFA4 /* ProgressIndicator.swift */; };
@@ -38,7 +49,6 @@
CA9FF88125955C7000E47BAF /* AvailableXcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9FF88025955C7000E47BAF /* AvailableXcode.swift */; };
CA9FF8872595607900E47BAF /* InstalledXcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9FF8862595607900E47BAF /* InstalledXcode.swift */; };
CA9FF8B12595967A00E47BAF /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9FF8B02595967A00E47BAF /* main.swift */; };
- CA9FF8BC259596CB00E47BAF /* com.robotsandpencils.XcodesApp.Helper in Copy Helper */ = {isa = PBXBuildFile; fileRef = CA9FF8AE2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
CA9FF8CF25959A9700E47BAF /* HelperXPCShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9FF8CE25959A9700E47BAF /* HelperXPCShared.swift */; };
CA9FF8D025959A9700E47BAF /* HelperXPCShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9FF8CE25959A9700E47BAF /* HelperXPCShared.swift */; };
CA9FF8DB25959B4000E47BAF /* XPCDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9FF8DA25959B4000E47BAF /* XPCDelegate.swift */; };
@@ -71,7 +81,6 @@
CABFA9CD2592EEEA00380FEE /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFA9AC2592EEE900380FEE /* Foundation.swift */; };
CABFA9CE2592EEEA00380FEE /* Version+Xcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFA9A62592EEE900380FEE /* Version+Xcode.swift */; };
CABFA9CF2592EEEA00380FEE /* Process.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFA9B42592EEEA00380FEE /* Process.swift */; };
- CABFA9DF2592F07A00380FEE /* Path in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9DE2592F07A00380FEE /* Path */; };
CABFA9E42592F08E00380FEE /* Version in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9E32592F08E00380FEE /* Version */; };
CABFA9EE2592F0CC00380FEE /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9ED2592F0CC00380FEE /* SwiftSoup */; };
CABFA9F82592F0F900380FEE /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9F72592F0F900380FEE /* KeychainAccess */; };
@@ -81,7 +90,6 @@
CABFAA492593162500380FEE /* Bundle+InfoPlistValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFAA482593162500380FEE /* Bundle+InfoPlistValues.swift */; };
CAC28188259EE27200B8AB0B /* CombineExpectations in Frameworks */ = {isa = PBXBuildFile; productRef = CAC28187259EE27200B8AB0B /* CombineExpectations */; };
CAC281CD259F97FA00B8AB0B /* ObservingProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC281CC259F97FA00B8AB0B /* ObservingProgressIndicator.swift */; };
- CAC281DA259F985100B8AB0B /* InstallationStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC281D9259F985100B8AB0B /* InstallationStep.swift */; };
CAC281E2259FA44600B8AB0B /* Bundle+XcodesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC281E1259FA44600B8AB0B /* Bundle+XcodesTests.swift */; };
CAC281E7259FA45A00B8AB0B /* Environment+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC281E6259FA45A00B8AB0B /* Environment+Mock.swift */; };
CAC9F92D25BCDA4400B4965F /* HelperInstallState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC9F92C25BCDA4400B4965F /* HelperInstallState.swift */; };
@@ -102,12 +110,22 @@
CAFE4AB425B7D3AF0064FE51 /* AdvancedPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFE4AB325B7D3AF0064FE51 /* AdvancedPreferencePane.swift */; };
CAFE4ABC25B7D54B0064FE51 /* UpdatesPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFE4ABB25B7D54B0064FE51 /* UpdatesPreferencePane.swift */; };
CAFFFED8259CDA5000903F81 /* XcodeListViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */; };
+ E689540325BE8C64000EBCEA /* DockProgress in Frameworks */ = {isa = PBXBuildFile; productRef = E689540225BE8C64000EBCEA /* DockProgress */; };
E81D7EA02805250100A205FC /* Collection+.swift in Sources */ = {isa = PBXBuildFile; fileRef = E81D7E9F2805250100A205FC /* Collection+.swift */; };
- E872EE4E2808D4F100D3DD8B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E872EE502808D4F100D3DD8B /* Localizable.strings */; };
+ E832EAF82B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E832EAF72B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift */; };
+ E84B7D0D2B296A8900DBDA2B /* NavigationSplitViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E84B7D0C2B296A8900DBDA2B /* NavigationSplitViewWrapper.swift */; };
+ E84E4F522B323A5F003F3959 /* CornerRadiusModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E84E4F512B323A5F003F3959 /* CornerRadiusModifier.swift */; };
+ E84E4F542B333864003F3959 /* PlatformsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E84E4F532B333864003F3959 /* PlatformsListView.swift */; };
+ E84E4F572B335094003F3959 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = E84E4F562B335094003F3959 /* OrderedCollections */; };
+ E86671272B309D2F0048559A /* PlatformsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E86671262B309D2F0048559A /* PlatformsView.swift */; };
E87AB3C52939B65E00D72F43 /* Hardware.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87AB3C42939B65E00D72F43 /* Hardware.swift */; };
E87DD6EB25D053FA00D86808 /* Progress+.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87DD6EA25D053FA00D86808 /* Progress+.swift */; };
+ E891A1C42B43ACF900A1B9D1 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = E891A1C32B43ACF900A1B9D1 /* Sparkle */; };
E89342FA25EDCC17007CF557 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E89342F925EDCC17007CF557 /* NotificationManager.swift */; };
E8977EA325C11E1500835F80 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8977EA225C11E1500835F80 /* PreferencesView.swift */; };
+ E8B20CBF2A2EDEC20057D816 /* SDKs+Xcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8B20CBE2A2EDEC20057D816 /* SDKs+Xcode.swift */; };
+ E8C0EB1A291EF43E0081528A /* XcodesKit in Frameworks */ = {isa = PBXBuildFile; productRef = E8C0EB19291EF43E0081528A /* XcodesKit */; };
+ E8C0EB1C291EF9A10081528A /* AppState+Runtimes.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8C0EB1B291EF9A10081528A /* AppState+Runtimes.swift */; };
E8CBDB8927ADE32300B22292 /* unxip in Copy aria2c */ = {isa = PBXBuildFile; fileRef = E8CBDB8627ADD92000B22292 /* unxip */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
E8CBDB8B27AE02FF00B22292 /* ExperiementsPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8CBDB8A27AE02FF00B22292 /* ExperiementsPreferencePane.swift */; };
E8D0296F284B029800647641 /* BottomStatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D0296E284B029800647641 /* BottomStatusBar.swift */; };
@@ -115,7 +133,9 @@
E8DA461125FAF7FB002E85EF /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8DA461025FAF7FB002E85EF /* NotificationsView.swift */; };
E8E98A9025D8631800EC89A0 /* InstallationStepRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFBC3FF259AC17F00E2A3D8 /* InstallationStepRowView.swift */; };
E8E98A9625D863D700EC89A0 /* InstallationStepDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */; };
- E8F81FC4282D8A17006CBD0F /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = E8F81FC3282D8A17006CBD0F /* Sparkle */; };
+ E8F44A1E296B4CD7002D6592 /* Path in Frameworks */ = {isa = PBXBuildFile; productRef = E8F44A1D296B4CD7002D6592 /* Path */; };
+ E8FA00542B5B109800769CE0 /* com.xcodesorg.xcodesapp.Helper in Copy Helper */ = {isa = PBXBuildFile; fileRef = CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
+ E8FD5727291EE4AC001E004C /* AsyncNetworkService in Frameworks */ = {isa = PBXBuildFile; productRef = E8FD5726291EE4AC001E004C /* AsyncNetworkService */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -151,7 +171,7 @@
dstPath = Contents/Library/LaunchServices;
dstSubfolderSpec = 1;
files = (
- CA9FF8BC259596CB00E47BAF /* com.robotsandpencils.XcodesApp.Helper in Copy Helper */,
+ E8FA00542B5B109800769CE0 /* com.xcodesorg.xcodesapp.Helper in Copy Helper */,
);
name = "Copy Helper";
runOnlyForDeploymentPostprocessing = 0;
@@ -171,33 +191,29 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 15FAD1652811D15600B63259 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; };
- 23703D6E29EBF63500DFA346 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
- 25E2FA26284769A00014A318 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
- 327DF109286ABE6B00D694D5 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
36741BFC291E4FDB00A85AAE /* DownloadPreferencePane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadPreferencePane.swift; sourceTree = ""; };
36741BFE291E50F500A85AAE /* FileError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileError.swift; sourceTree = ""; };
- 4A5AAA1D28118FAD00528958 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
536CFDD1263C94DE00026CE0 /* SignedInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignedInView.swift; sourceTree = ""; };
536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesSheet.swift; sourceTree = ""; };
53CBAB2B263DCC9100410495 /* XcodesAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesAlert.swift; sourceTree = ""; };
- 58F743C02810A34900EEC0F3 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
- 5AA8A6102877EDAD009ECDB0 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
63EAA4EA259944450046AB8F /* ProgressButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressButton.swift; sourceTree = ""; };
- 6CA3A090282EBE72005A6E35 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; };
- 7CBF284E28606D2C001AA66B /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; };
- 9D3C3AF7282EBE3300CB0D37 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; };
- A0187D39285792D1002F46F9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
- AAB037D32839BD4700017680 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; };
- AB4EB0DE28541FA000FF3B1D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
- B648F22B2810C1130096781B /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
- C0AE7FA4283002DC00DA63D2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
+ 9DD4FFCA2B13EC1800C974F1 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; };
+ B0403CEF2AD92D7B00137C09 /* ReleaseNotesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesView.swift; sourceTree = ""; };
+ B0403CF12AD934B600137C09 /* CompatibilityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompatibilityView.swift; sourceTree = ""; };
+ B0403CF32AD9381D00137C09 /* SDKsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKsView.swift; sourceTree = ""; };
+ B0403CF52AD9849E00137C09 /* CompilersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompilersView.swift; sourceTree = ""; };
+ B0403CF72AD991F800137C09 /* UnselectedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnselectedView.swift; sourceTree = ""; };
+ B0403CF92AD9942A00137C09 /* NotInstalledStateButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotInstalledStateButtons.swift; sourceTree = ""; };
+ B0403CFB2AD9A6BF00137C09 /* InstalledStateButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledStateButtons.swift; sourceTree = ""; };
+ B0403CFD2ADA712C00137C09 /* InfoPaneControls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoPaneControls.swift; sourceTree = ""; };
+ B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseDateView.swift; sourceTree = ""; };
+ B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdenticalBuildView.swift; sourceTree = ""; };
+ B0C6AD0C2AD91D7900E64698 /* IconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconView.swift; sourceTree = ""; };
CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeCommands.swift; sourceTree = ""; };
CA2518EB25A7FF2B00F08414 /* AppStateUpdateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateUpdateTests.swift; sourceTree = ""; };
CA25192925A9644800F08414 /* XcodeInstallState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeInstallState.swift; sourceTree = ""; };
CA378F982466567600A58CE0 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; };
CA39711824495F0E00AFFB77 /* AppStoreButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreButtonStyle.swift; sourceTree = ""; };
- CA42DD6D25AEA8B200BC0B0C /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; };
CA42DD7225AEB04300BC0B0C /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; };
CA44901E2463AD34003D8213 /* Tag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tag.swift; sourceTree = ""; };
CA452BAF259FD9770072DFA4 /* ProgressIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressIndicator.swift; sourceTree = ""; };
@@ -220,7 +236,7 @@
CA9FF87A2595293E00E47BAF /* DataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataSource.swift; sourceTree = ""; };
CA9FF88025955C7000E47BAF /* AvailableXcode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvailableXcode.swift; sourceTree = ""; };
CA9FF8862595607900E47BAF /* InstalledXcode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledXcode.swift; sourceTree = ""; };
- CA9FF8AE2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = com.robotsandpencils.XcodesApp.Helper; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = com.xcodesorg.xcodesapp.Helper; sourceTree = BUILT_PRODUCTS_DIR; };
CA9FF8B02595967A00E47BAF /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
CA9FF8C22595988B00E47BAF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
CA9FF8C32595989800E47BAF /* launchd.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = launchd.plist; sourceTree = ""; };
@@ -229,8 +245,8 @@
CA9FF8DF25959BAA00E47BAF /* ConnectionVerifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionVerifier.swift; sourceTree = ""; };
CA9FF8E425959BB800E47BAF /* AuditTokenHack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuditTokenHack.h; sourceTree = ""; };
CA9FF8E525959BB800E47BAF /* AuditTokenHack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuditTokenHack.m; sourceTree = ""; };
- CA9FF8EA25959BDD00E47BAF /* com.robotsandpencils.XcodesApp.Helper-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "com.robotsandpencils.XcodesApp.Helper-Bridging-Header.h"; sourceTree = ""; };
- CA9FF9052595A28400E47BAF /* com.robotsandpencils.XcodesApp.HelperTest.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = com.robotsandpencils.XcodesApp.HelperTest.entitlements; sourceTree = ""; };
+ CA9FF8EA25959BDD00E47BAF /* com.xcodesorg.xcodesapp.Helper-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "com.xcodesorg.xcodesapp.Helper-Bridging-Header.h"; sourceTree = ""; };
+ CA9FF9052595A28400E47BAF /* com.xcodesorg.xcodesapp.HelperTest.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = com.xcodesorg.xcodesapp.HelperTest.entitlements; sourceTree = ""; };
CA9FF9252595A7EB00E47BAF /* Scripts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Scripts; sourceTree = ""; };
CA9FF9352595B44700E47BAF /* HelperClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelperClient.swift; sourceTree = ""; };
CAA1CB34255A5AD5003FD669 /* SignInCredentialsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInCredentialsView.swift; sourceTree = ""; };
@@ -265,7 +281,6 @@
CABFAA422593104F00380FEE /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; };
CABFAA482593162500380FEE /* Bundle+InfoPlistValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+InfoPlistValues.swift"; sourceTree = ""; };
CAC281CC259F97FA00B8AB0B /* ObservingProgressIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObservingProgressIndicator.swift; sourceTree = ""; };
- CAC281D9259F985100B8AB0B /* InstallationStep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallationStep.swift; sourceTree = ""; };
CAC281E1259FA44600B8AB0B /* Bundle+XcodesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+XcodesTests.swift"; sourceTree = ""; };
CAC281E6259FA45A00B8AB0B /* Environment+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Environment+Mock.swift"; sourceTree = ""; };
CAC9F92C25BCDA4400B4965F /* HelperInstallState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelperInstallState.swift; sourceTree = ""; };
@@ -296,13 +311,19 @@
CAFE4ABB25B7D54B0064FE51 /* UpdatesPreferencePane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatesPreferencePane.swift; sourceTree = ""; };
CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeListViewRow.swift; sourceTree = ""; };
CAFFFEEE259CEAC400903F81 /* RingProgressViewStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RingProgressViewStyle.swift; sourceTree = ""; };
- E2AFDCCA28F024D000864ADD /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
E81D7E9F2805250100A205FC /* Collection+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+.swift"; sourceTree = ""; };
- E872EE4F2808D4F100D3DD8B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
+ E832EAF72B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuntimeInstallationStepDetailView.swift; sourceTree = ""; };
+ E84B7D0C2B296A8900DBDA2B /* NavigationSplitViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSplitViewWrapper.swift; sourceTree = ""; };
+ E84E4F512B323A5F003F3959 /* CornerRadiusModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CornerRadiusModifier.swift; sourceTree = ""; };
+ E84E4F532B333864003F3959 /* PlatformsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlatformsListView.swift; sourceTree = ""; };
+ E856BB73291EDD3D00DC438B /* XcodesKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = XcodesKit; path = Xcodes/XcodesKit; sourceTree = ""; };
+ E86671262B309D2F0048559A /* PlatformsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlatformsView.swift; sourceTree = ""; };
E87AB3C42939B65E00D72F43 /* Hardware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hardware.swift; sourceTree = ""; };
E87DD6EA25D053FA00D86808 /* Progress+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Progress+.swift"; sourceTree = ""; };
E89342F925EDCC17007CF557 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; };
E8977EA225C11E1500835F80 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; };
+ E8B20CBE2A2EDEC20057D816 /* SDKs+Xcode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SDKs+Xcode.swift"; sourceTree = ""; };
+ E8C0EB1B291EF9A10081528A /* AppState+Runtimes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppState+Runtimes.swift"; sourceTree = ""; };
E8CBDB8627ADD92000B22292 /* unxip */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = unxip; sourceTree = ""; };
E8CBDB8A27AE02FF00B22292 /* ExperiementsPreferencePane.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperiementsPreferencePane.swift; sourceTree = ""; };
E8D0296E284B029800647641 /* BottomStatusBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomStatusBar.swift; sourceTree = ""; };
@@ -323,15 +344,19 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- E8F81FC4282D8A17006CBD0F /* Sparkle in Frameworks */,
CABFA9E42592F08E00380FEE /* Version in Frameworks */,
CABFA9FD2592F13300380FEE /* LegibleError in Frameworks */,
+ E689540325BE8C64000EBCEA /* DockProgress in Frameworks */,
CA9FF86D25951C6E00E47BAF /* XCModel in Frameworks */,
CABFA9F82592F0F900380FEE /* KeychainAccess in Frameworks */,
+ E891A1C42B43ACF900A1B9D1 /* Sparkle in Frameworks */,
CAA858CD25A3D8BC00ACF8C0 /* ErrorHandling in Frameworks */,
+ E8C0EB1A291EF43E0081528A /* XcodesKit in Frameworks */,
+ E8FD5727291EE4AC001E004C /* AsyncNetworkService in Frameworks */,
CAA1CB2D255A5262003FD669 /* AppleAPI in Frameworks */,
- CABFA9DF2592F07A00380FEE /* Path in Frameworks */,
CABFA9EE2592F0CC00380FEE /* SwiftSoup in Frameworks */,
+ E84E4F572B335094003F3959 /* OrderedCollections in Frameworks */,
+ E8F44A1E296B4CD7002D6592 /* Path in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -354,6 +379,7 @@
CA452BAF259FD9770072DFA4 /* ProgressIndicator.swift */,
536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */,
53CBAB2B263DCC9100410495 /* XcodesAlert.swift */,
+ E84B7D0C2B296A8900DBDA2B /* NavigationSplitViewWrapper.swift */,
);
path = Common;
sourceTree = "";
@@ -393,22 +419,22 @@
path = About;
sourceTree = "";
};
- CA9FF8AF2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */ = {
+ CA9FF8AF2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */ = {
isa = PBXGroup;
children = (
CA9FF8E425959BB800E47BAF /* AuditTokenHack.h */,
CA9FF8E525959BB800E47BAF /* AuditTokenHack.m */,
- CA9FF8EA25959BDD00E47BAF /* com.robotsandpencils.XcodesApp.Helper-Bridging-Header.h */,
+ CA9FF8EA25959BDD00E47BAF /* com.xcodesorg.xcodesapp.Helper-Bridging-Header.h */,
CA9FF8DF25959BAA00E47BAF /* ConnectionVerifier.swift */,
CA42DD7225AEB04300BC0B0C /* Logger.swift */,
CA9FF8B02595967A00E47BAF /* main.swift */,
CA9FF8DA25959B4000E47BAF /* XPCDelegate.swift */,
CA9FF8C22595988B00E47BAF /* Info.plist */,
CA9FF8C32595989800E47BAF /* launchd.plist */,
- CA9FF9052595A28400E47BAF /* com.robotsandpencils.XcodesApp.HelperTest.entitlements */,
+ CA9FF9052595A28400E47BAF /* com.xcodesorg.xcodesapp.HelperTest.entitlements */,
CAFBDBA525990C76003DCC5A /* SimpleXPCApp.LICENSE */,
);
- path = com.robotsandpencils.XcodesApp.Helper;
+ path = com.xcodesorg.xcodesapp.Helper;
sourceTree = "";
};
CA9FF8CD25959A7600E47BAF /* HelperXPCShared */ = {
@@ -453,6 +479,7 @@
isa = PBXGroup;
children = (
CA378F982466567600A58CE0 /* AppState.swift */,
+ E8C0EB1B291EF9A10081528A /* AppState+Runtimes.swift */,
CAE424B3259A764700B8B246 /* AppState+Install.swift */,
CABFA9A72592EEE900380FEE /* AppState+Update.swift */,
CAA8589A25A2B83000ACF8C0 /* Aria2CError.swift */,
@@ -471,10 +498,8 @@
CABFA9AC2592EEE900380FEE /* Foundation.swift */,
CA9FF9352595B44700E47BAF /* HelperClient.swift */,
CAC9F92C25BCDA4400B4965F /* HelperInstallState.swift */,
- CAC281D9259F985100B8AB0B /* InstallationStep.swift */,
CA9FF8862595607900E47BAF /* InstalledXcode.swift */,
CAA8587B25A2B37900ACF8C0 /* IsTesting.swift */,
- CA42DD6D25AEA8B200BC0B0C /* Logger.swift */,
E89342F925EDCC17007CF557 /* NotificationManager.swift */,
CAE4248B259A68B800B8B246 /* Optional+IsNotNil.swift */,
CABFA9AE2592EEE900380FEE /* Path+.swift */,
@@ -493,6 +518,7 @@
E81D7E9F2805250100A205FC /* Collection+.swift */,
E8D655BF288DD04700A139C2 /* SelectedActionType.swift */,
E87AB3C42939B65E00D72F43 /* Hardware.swift */,
+ E8B20CBE2A2EDEC20057D816 /* SDKs+Xcode.swift */,
);
path = Backend;
sourceTree = "";
@@ -525,7 +551,7 @@
CAD2E7AE2449575000113D76 /* Xcodes.entitlements */,
CA8FB64D256E17B100469DA5 /* XcodesTest.entitlements */,
E8CBDB8627ADD92000B22292 /* unxip */,
- E872EE502808D4F100D3DD8B /* Localizable.strings */,
+ 9DD4FFCA2B13EC1800C974F1 /* Localizable.xcstrings */,
);
path = Resources;
sourceTree = "";
@@ -533,6 +559,7 @@
CAD2E7952449574E00113D76 = {
isa = PBXGroup;
children = (
+ E856BB73291EDD3D00DC438B /* XcodesKit */,
CA8FB5F8256E0F9400469DA5 /* README.md */,
CABFA9D42592EF6300380FEE /* DECISIONS.md */,
CABFA9A02592EAF500380FEE /* R&PLogo.png */,
@@ -544,7 +571,7 @@
CA538A0C255A4F1A00E64DD7 /* AppleAPI */,
CAD2E7A02449574E00113D76 /* Xcodes */,
CAD2E7B62449575100113D76 /* XcodesTests */,
- CA9FF8AF2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */,
+ CA9FF8AF2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */,
CA9FF8CD25959A7600E47BAF /* HelperXPCShared */,
CAD2E79F2449574E00113D76 /* Products */,
CA538A12255A4F7C00E64DD7 /* Frameworks */,
@@ -557,7 +584,7 @@
children = (
CAD2E79E2449574E00113D76 /* Xcodes.app */,
CAD2E7B32449575100113D76 /* XcodesTests.xctest */,
- CA9FF8AE2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */,
+ CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */,
);
name = Products;
sourceTree = "";
@@ -605,6 +632,7 @@
E8977EA225C11E1500835F80 /* PreferencesView.swift */,
E8DA461025FAF7FB002E85EF /* NotificationsView.swift */,
E8CBDB8A27AE02FF00B22292 /* ExperiementsPreferencePane.swift */,
+ E84E4F532B333864003F3959 /* PlatformsListView.swift */,
);
path = Preferences;
sourceTree = "";
@@ -612,8 +640,22 @@
E8E98A9425D863B100EC89A0 /* InfoPane */ = {
isa = PBXGroup;
children = (
+ B0403CEF2AD92D7B00137C09 /* ReleaseNotesView.swift */,
+ B0403CF32AD9381D00137C09 /* SDKsView.swift */,
+ B0403CF52AD9849E00137C09 /* CompilersView.swift */,
+ B0403CF12AD934B600137C09 /* CompatibilityView.swift */,
CAFBDC67259A308B003DCC5A /* InfoPane.swift */,
+ B0403CFD2ADA712C00137C09 /* InfoPaneControls.swift */,
+ B0403CF72AD991F800137C09 /* UnselectedView.swift */,
+ B0403CF92AD9942A00137C09 /* NotInstalledStateButtons.swift */,
+ B0403CFB2AD9A6BF00137C09 /* InstalledStateButtons.swift */,
E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */,
+ B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */,
+ B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */,
+ B0C6AD0C2AD91D7900E64698 /* IconView.swift */,
+ E832EAF72B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift */,
+ E86671262B309D2F0048559A /* PlatformsView.swift */,
+ E84E4F512B323A5F003F3959 /* CornerRadiusModifier.swift */,
);
path = InfoPane;
sourceTree = "";
@@ -621,9 +663,9 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- CA9FF8AD2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */ = {
+ CA9FF8AD2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */ = {
isa = PBXNativeTarget;
- buildConfigurationList = CA9FF8B52595967A00E47BAF /* Build configuration list for PBXNativeTarget "com.robotsandpencils.XcodesApp.Helper" */;
+ buildConfigurationList = CA9FF8B52595967A00E47BAF /* Build configuration list for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */;
buildPhases = (
CA9FF8AA2595967A00E47BAF /* Sources */,
CA9FF8AB2595967A00E47BAF /* Frameworks */,
@@ -633,9 +675,9 @@
);
dependencies = (
);
- name = com.robotsandpencils.XcodesApp.Helper;
+ name = com.xcodesorg.xcodesapp.Helper;
productName = com.robotsandpencils.XcodesApp.Helper;
- productReference = CA9FF8AE2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */;
+ productReference = CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */;
productType = "com.apple.product-type.tool";
};
CAD2E79D2449574E00113D76 /* Xcodes */ = {
@@ -657,14 +699,18 @@
name = Xcodes;
packageProductDependencies = (
CAA1CB2C255A5262003FD669 /* AppleAPI */,
- CABFA9DE2592F07A00380FEE /* Path */,
CABFA9E32592F08E00380FEE /* Version */,
CABFA9ED2592F0CC00380FEE /* SwiftSoup */,
CABFA9F72592F0F900380FEE /* KeychainAccess */,
CABFA9FC2592F13300380FEE /* LegibleError */,
CA9FF86C25951C6E00E47BAF /* XCModel */,
CAA858CC25A3D8BC00ACF8C0 /* ErrorHandling */,
- E8F81FC3282D8A17006CBD0F /* Sparkle */,
+ E689540225BE8C64000EBCEA /* DockProgress */,
+ E8FD5726291EE4AC001E004C /* AsyncNetworkService */,
+ E8C0EB19291EF43E0081528A /* XcodesKit */,
+ E8F44A1D296B4CD7002D6592 /* Path */,
+ E84E4F562B335094003F3959 /* OrderedCollections */,
+ E891A1C32B43ACF900A1B9D1 /* Sparkle */,
);
productName = XcodesMac;
productReference = CAD2E79E2449574E00113D76 /* Xcodes.app */;
@@ -733,13 +779,13 @@
de,
uk,
fi,
+ ca,
"pt-BR",
nl,
pl,
);
mainGroup = CAD2E7952449574E00113D76;
packageReferences = (
- CABFA9DD2592F07A00380FEE /* XCRemoteSwiftPackageReference "Path" */,
CABFA9E22592F08E00380FEE /* XCRemoteSwiftPackageReference "Version" */,
CABFA9EC2592F0CC00380FEE /* XCRemoteSwiftPackageReference "SwiftSoup" */,
CABFA9F62592F0F900380FEE /* XCRemoteSwiftPackageReference "KeychainAccess" */,
@@ -747,7 +793,11 @@
CA9FF86B25951C6E00E47BAF /* XCRemoteSwiftPackageReference "data" */,
CAA858CB25A3D8BC00ACF8C0 /* XCRemoteSwiftPackageReference "ErrorHandling" */,
CAC28186259EE27200B8AB0B /* XCRemoteSwiftPackageReference "CombineExpectations" */,
- E8F81FC2282D8A17006CBD0F /* XCRemoteSwiftPackageReference "Sparkle" */,
+ E689540125BE8C64000EBCEA /* XCRemoteSwiftPackageReference "DockProgress" */,
+ E8FD5725291EE4AC001E004C /* XCRemoteSwiftPackageReference "AsyncHTTPNetworkService" */,
+ E8F44A1C296B4CD7002D6592 /* XCRemoteSwiftPackageReference "Path" */,
+ E84E4F552B335094003F3959 /* XCRemoteSwiftPackageReference "swift-collections" */,
+ E891A1C22B43ACA400A1B9D1 /* XCRemoteSwiftPackageReference "Sparkle" */,
);
productRefGroup = CAD2E79F2449574E00113D76 /* Products */;
projectDirPath = "";
@@ -755,7 +805,7 @@
targets = (
CAD2E79D2449574E00113D76 /* Xcodes */,
CAD2E7B22449575100113D76 /* XcodesTests */,
- CA9FF8AD2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */,
+ CA9FF8AD2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */,
);
};
/* End PBXProject section */
@@ -765,8 +815,8 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- E872EE4E2808D4F100D3DD8B /* Localizable.strings in Resources */,
CAD2E7A92449575000113D76 /* Preview Assets.xcassets in Resources */,
+ 9DD4FFCB2B13EC1800C974F1 /* Localizable.xcstrings in Resources */,
CA9FF83F2594FBC000E47BAF /* Licenses.rtf in Resources */,
CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */,
CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */,
@@ -835,7 +885,9 @@
CABFAA492593162500380FEE /* Bundle+InfoPlistValues.swift in Sources */,
CA9FF8662595130600E47BAF /* View+IsHidden.swift in Sources */,
CAE4248C259A68B800B8B246 /* Optional+IsNotNil.swift in Sources */,
+ B0C6AD0D2AD91D7900E64698 /* IconView.swift in Sources */,
CA9FF9362595B44700E47BAF /* HelperClient.swift in Sources */,
+ B0C6AD042AD6E65700E64698 /* ReleaseDateView.swift in Sources */,
CAA8587C25A2B37900ACF8C0 /* IsTesting.swift in Sources */,
CABFA9CA2592EEEA00380FEE /* AppState+Update.swift in Sources */,
CA44901F2463AD34003D8213 /* Tag.swift in Sources */,
@@ -845,7 +897,6 @@
CAFE4ABC25B7D54B0064FE51 /* UpdatesPreferencePane.swift in Sources */,
CABFA9BD2592EEEA00380FEE /* Environment.swift in Sources */,
CABFA9C32592EEEA00380FEE /* Downloads.swift in Sources */,
- CAC281DA259F985100B8AB0B /* InstallationStep.swift in Sources */,
E8CBDB8B27AE02FF00B22292 /* ExperiementsPreferencePane.swift in Sources */,
E8E98A9625D863D700EC89A0 /* InstallationStepDetailView.swift in Sources */,
CA378F992466567600A58CE0 /* AppState.swift in Sources */,
@@ -853,18 +904,25 @@
CAA1CB45255A5B60003FD669 /* SignIn2FAView.swift in Sources */,
CABFA9C52592EEEA00380FEE /* FileManager+.swift in Sources */,
CABFA9CD2592EEEA00380FEE /* Foundation.swift in Sources */,
+ B0403CFC2AD9A6BF00137C09 /* InstalledStateButtons.swift in Sources */,
36741BFF291E50F500A85AAE /* FileError.swift in Sources */,
CA9FF8872595607900E47BAF /* InstalledXcode.swift in Sources */,
+ E84E4F522B323A5F003F3959 /* CornerRadiusModifier.swift in Sources */,
+ B0403CF22AD934B600137C09 /* CompatibilityView.swift in Sources */,
+ B0403CFE2ADA712C00137C09 /* InfoPaneControls.swift in Sources */,
53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */,
- CA42DD6E25AEA8B200BC0B0C /* Logger.swift in Sources */,
CA61A6E0259835580008926E /* Xcode.swift in Sources */,
CAE4247F259A666100B8B246 /* MainWindow.swift in Sources */,
CA452BB0259FD9770072DFA4 /* ProgressIndicator.swift in Sources */,
+ B0403CF02AD92D7B00137C09 /* ReleaseNotesView.swift in Sources */,
CAFE4AB425B7D3AF0064FE51 /* AdvancedPreferencePane.swift in Sources */,
CA9FF84E2595079F00E47BAF /* ScrollingTextView.swift in Sources */,
+ E832EAF82B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift in Sources */,
CABFA9C12592EEEA00380FEE /* Version+.swift in Sources */,
E8D655C0288DD04700A139C2 /* SelectedActionType.swift in Sources */,
36741BFD291E4FDB00A85AAE /* DownloadPreferencePane.swift in Sources */,
+ E84E4F542B333864003F3959 /* PlatformsListView.swift in Sources */,
+ E86671272B309D2F0048559A /* PlatformsView.swift in Sources */,
CA9FF8522595080100E47BAF /* AcknowledgementsView.swift in Sources */,
CABFA9CE2592EEEA00380FEE /* Version+Xcode.swift in Sources */,
CAFBDB912598FE80003DCC5A /* SelectedXcode.swift in Sources */,
@@ -873,29 +931,37 @@
E8DA461125FAF7FB002E85EF /* NotificationsView.swift in Sources */,
CAA1CB35255A5AD5003FD669 /* SignInCredentialsView.swift in Sources */,
E81D7EA02805250100A205FC /* Collection+.swift in Sources */,
+ E8B20CBF2A2EDEC20057D816 /* SDKs+Xcode.swift in Sources */,
CA9FF877259528CC00E47BAF /* Version+XcodeReleases.swift in Sources */,
CABFAA2D2592FBFC00380FEE /* Configure.swift in Sources */,
+ E84B7D0D2B296A8900DBDA2B /* NavigationSplitViewWrapper.swift in Sources */,
CA73510D257BFCEF00EA9CF8 /* NSAttributedString+.swift in Sources */,
CAFBDB952598FE96003DCC5A /* FocusedValues.swift in Sources */,
+ B0403CF42AD9381D00137C09 /* SDKsView.swift in Sources */,
CAC9F92D25BCDA4400B4965F /* HelperInstallState.swift in Sources */,
E87DD6EB25D053FA00D86808 /* Progress+.swift in Sources */,
CAC281CD259F97FA00B8AB0B /* ObservingProgressIndicator.swift in Sources */,
CABFA9C22592EEEA00380FEE /* Publisher+Resumable.swift in Sources */,
+ B0C6AD0B2AD9178E00E64698 /* IdenticalBuildView.swift in Sources */,
CAFBDC68259A308B003DCC5A /* InfoPane.swift in Sources */,
+ B0403CF82AD991F800137C09 /* UnselectedView.swift in Sources */,
E87AB3C52939B65E00D72F43 /* Hardware.swift in Sources */,
CAA1CB4D255A5CFD003FD669 /* SignInPhoneListView.swift in Sources */,
CAFBDC6C259A3098003DCC5A /* View+Conditional.swift in Sources */,
CABFA9CF2592EEEA00380FEE /* Process.swift in Sources */,
CAFFFED8259CDA5000903F81 /* XcodeListViewRow.swift in Sources */,
CABFA9C72592EEEA00380FEE /* Entry+.swift in Sources */,
+ B0403CFA2AD9942A00137C09 /* NotInstalledStateButtons.swift in Sources */,
CAE424B4259A764700B8B246 /* AppState+Install.swift in Sources */,
CAE42487259A68A300B8B246 /* XcodeListCategory.swift in Sources */,
CAA858C425A2BE4E00ACF8C0 /* Downloader.swift in Sources */,
+ B0403CF62AD9849E00137C09 /* CompilersView.swift in Sources */,
E8977EA325C11E1500835F80 /* PreferencesView.swift in Sources */,
CA9FF87B2595293E00E47BAF /* DataSource.swift in Sources */,
CABFA9C92592EEEA00380FEE /* URLRequest+Apple.swift in Sources */,
CABFAA432593104F00380FEE /* AboutView.swift in Sources */,
E8D0296F284B029800647641 /* BottomStatusBar.swift in Sources */,
+ E8C0EB1C291EF9A10081528A /* AppState+Runtimes.swift in Sources */,
E8E98A9025D8631800EC89A0 /* InstallationStepRowView.swift in Sources */,
CABFA9CC2592EEEA00380FEE /* Path+.swift in Sources */,
CAD2E7A22449574E00113D76 /* XcodesApp.swift in Sources */,
@@ -924,7 +990,7 @@
/* Begin PBXTargetDependency section */
CA9FF8BA259596A000E47BAF /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = CA9FF8AD2595967A00E47BAF /* com.robotsandpencils.XcodesApp.Helper */;
+ target = CA9FF8AD2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */;
targetProxy = CA9FF8B9259596A000E47BAF /* PBXContainerItemProxy */;
};
CAD2E7B52449575100113D76 /* PBXTargetDependency */ = {
@@ -934,33 +1000,6 @@
};
/* End PBXTargetDependency section */
-/* Begin PBXVariantGroup section */
- E872EE502808D4F100D3DD8B /* Localizable.strings */ = {
- isa = PBXVariantGroup;
- children = (
- E872EE4F2808D4F100D3DD8B /* en */,
- 15FAD1652811D15600B63259 /* hi */,
- B648F22B2810C1130096781B /* fr */,
- 4A5AAA1D28118FAD00528958 /* ru */,
- 58F743C02810A34900EEC0F3 /* es */,
- C0AE7FA4283002DC00DA63D2 /* zh-Hans */,
- 9D3C3AF7282EBE3300CB0D37 /* tr */,
- AAB037D32839BD4700017680 /* ko */,
- 25E2FA26284769A00014A318 /* it */,
- AB4EB0DE28541FA000FF3B1D /* ja */,
- 6CA3A090282EBE72005A6E35 /* zh-Hant */,
- A0187D39285792D1002F46F9 /* de */,
- 7CBF284E28606D2C001AA66B /* uk */,
- 5AA8A6102877EDAD009ECDB0 /* fi */,
- 327DF109286ABE6B00D694D5 /* pt-BR */,
- E2AFDCCA28F024D000864ADD /* nl */,
- 23703D6E29EBF63500DFA346 /* pl */,
- );
- name = Localizable.strings;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
/* Begin XCBuildConfiguration section */
CA8FB635256E154800469DA5 /* Test */ = {
isa = XCBuildConfiguration;
@@ -995,7 +1034,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = PBH8V487HB;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -1014,7 +1053,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 11.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -1029,22 +1069,25 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/XcodesTest.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 18;
+ CURRENT_PROJECT_VERSION = 23;
DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\"";
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = NO;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Xcodes/Resources/Info.plist;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
- MARKETING_VERSION = 1.10.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ MARKETING_VERSION = 2.0.2;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp;
PRODUCT_NAME = Xcodes;
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
@@ -1066,6 +1109,7 @@
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesAppTests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1078,22 +1122,23 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_STYLE = Automatic;
CREATE_INFOPLIST_SECTION_IN_BINARY = YES;
- DEVELOPMENT_TEAM = PBH8V487HB;
+ DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist";
- MARKETING_VERSION = 1.0.3;
+ MARKETING_VERSION = 2.0.0;
OTHER_LDFLAGS = (
"-sectcreate",
__TEXT,
__launchd_plist,
"$(SRCROOT)/${TARGET_NAME}/launchd.plist",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp.Helper;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp.Helper;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
- SWIFT_OBJC_BRIDGING_HEADER = "com.robotsandpencils.XcodesApp.Helper/com.robotsandpencils.XcodesApp.Helper-Bridging-Header.h";
+ SWIFT_OBJC_BRIDGING_HEADER = "com.xcodesorg.xcodesapp.Helper/com.xcodesorg.xcodesapp.Helper-Bridging-Header.h";
SWIFT_VERSION = 5.0;
};
name = Debug;
@@ -1102,24 +1147,25 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CODE_SIGN_ENTITLEMENTS = com.robotsandpencils.XcodesApp.Helper/com.robotsandpencils.XcodesApp.HelperTest.entitlements;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
+ CODE_SIGN_ENTITLEMENTS = com.xcodesorg.xcodesapp.Helper/com.xcodesorg.xcodesapp.HelperTest.entitlements;
CODE_SIGN_STYLE = Manual;
CREATE_INFOPLIST_SECTION_IN_BINARY = YES;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = NO;
INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist";
- MARKETING_VERSION = 1.0.3;
+ MARKETING_VERSION = 2.0.0;
OTHER_LDFLAGS = (
"-sectcreate",
__TEXT,
__launchd_plist,
"$(SRCROOT)/${TARGET_NAME}/launchd.plist",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp.Helper;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp.Helper;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
- SWIFT_OBJC_BRIDGING_HEADER = "com.robotsandpencils.XcodesApp.Helper/com.robotsandpencils.XcodesApp.Helper-Bridging-Header.h";
+ SWIFT_OBJC_BRIDGING_HEADER = "com.xcodesorg.xcodesapp.Helper/com.xcodesorg.xcodesapp.Helper-Bridging-Header.h";
SWIFT_VERSION = 5.0;
};
name = Test;
@@ -1128,22 +1174,24 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CREATE_INFOPLIST_SECTION_IN_BINARY = YES;
- DEVELOPMENT_TEAM = PBH8V487HB;
+ DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist";
- MARKETING_VERSION = 1.0.3;
+ MARKETING_VERSION = 2.0.0;
OTHER_LDFLAGS = (
"-sectcreate",
__TEXT,
__launchd_plist,
"$(SRCROOT)/${TARGET_NAME}/launchd.plist",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp.Helper;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp.Helper;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
- SWIFT_OBJC_BRIDGING_HEADER = "com.robotsandpencils.XcodesApp.Helper/com.robotsandpencils.XcodesApp.Helper-Bridging-Header.h";
+ SWIFT_OBJC_BRIDGING_HEADER = "com.xcodesorg.xcodesapp.Helper/com.xcodesorg.xcodesapp.Helper-Bridging-Header.h";
SWIFT_VERSION = 5.0;
};
name = Release;
@@ -1181,7 +1229,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = PBH8V487HB;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -1200,7 +1248,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 11.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -1244,7 +1293,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = PBH8V487HB;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
@@ -1257,7 +1306,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 11.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
@@ -1271,21 +1321,25 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements;
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 18;
+ CURRENT_PROJECT_VERSION = 23;
DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\"";
- DEVELOPMENT_TEAM = PBH8V487HB;
+ DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Xcodes/Resources/Info.plist;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
- MARKETING_VERSION = 1.10.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ MARKETING_VERSION = 2.0.2;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp;
PRODUCT_NAME = Xcodes;
SWIFT_VERSION = 5.0;
};
@@ -1295,21 +1349,25 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements;
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 18;
+ CURRENT_PROJECT_VERSION = 23;
DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\"";
- DEVELOPMENT_TEAM = PBH8V487HB;
+ DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Xcodes/Resources/Info.plist;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
- MARKETING_VERSION = 1.10.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ MARKETING_VERSION = 2.0.2;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp;
PRODUCT_NAME = Xcodes;
SWIFT_VERSION = 5.0;
};
@@ -1322,13 +1380,14 @@
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
- DEVELOPMENT_TEAM = PBH8V487HB;
+ DEVELOPMENT_TEAM = ZU6GR6B2FY;
INFOPLIST_FILE = XcodesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesAppTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
@@ -1341,16 +1400,18 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
- DEVELOPMENT_TEAM = PBH8V487HB;
+ DEVELOPMENT_TEAM = ZU6GR6B2FY;
INFOPLIST_FILE = XcodesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesAppTests;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xcodesorg.xcodesapp.XcodesAppTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Xcodes.app/Contents/MacOS/Xcodes";
@@ -1360,7 +1421,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- CA9FF8B52595967A00E47BAF /* Build configuration list for PBXNativeTarget "com.robotsandpencils.XcodesApp.Helper" */ = {
+ CA9FF8B52595967A00E47BAF /* Build configuration list for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CA9FF8B22595967A00E47BAF /* Debug */,
@@ -1407,8 +1468,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/xcodereleases/data";
requirement = {
- kind = revision;
- revision = b47228c688b608e34b3b84079ab6052a24c7a981;
+ branch = main;
+ kind = branch;
};
};
CAA858CB25A3D8BC00ACF8C0 /* XCRemoteSwiftPackageReference "ErrorHandling" */ = {
@@ -1419,14 +1480,6 @@
minimumVersion = 0.1.0;
};
};
- CABFA9DD2592F07A00380FEE /* XCRemoteSwiftPackageReference "Path" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/mxcl/Path.swift";
- requirement = {
- kind = upToNextMinorVersion;
- minimumVersion = 0.16.0;
- };
- };
CABFA9E22592F08E00380FEE /* XCRemoteSwiftPackageReference "Version" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/mxcl/Version";
@@ -1467,12 +1520,44 @@
minimumVersion = 0.6.0;
};
};
- E8F81FC2282D8A17006CBD0F /* XCRemoteSwiftPackageReference "Sparkle" */ = {
+ E689540125BE8C64000EBCEA /* XCRemoteSwiftPackageReference "DockProgress" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/sindresorhus/DockProgress";
+ requirement = {
+ kind = upToNextMinorVersion;
+ minimumVersion = 3.2.0;
+ };
+ };
+ E84E4F552B335094003F3959 /* XCRemoteSwiftPackageReference "swift-collections" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/apple/swift-collections.git";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 1.0.5;
+ };
+ };
+ E891A1C22B43ACA400A1B9D1 /* XCRemoteSwiftPackageReference "Sparkle" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/sparkle-project/Sparkle";
requirement = {
kind = upToNextMajorVersion;
- minimumVersion = 2.0.0;
+ minimumVersion = 2.5.2;
+ };
+ };
+ E8F44A1C296B4CD7002D6592 /* XCRemoteSwiftPackageReference "Path" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/mxcl/Path.swift";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 1.0.0;
+ };
+ };
+ E8FD5725291EE4AC001E004C /* XCRemoteSwiftPackageReference "AsyncHTTPNetworkService" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/RobotsAndPencils/AsyncHTTPNetworkService";
+ requirement = {
+ branch = main;
+ kind = branch;
};
};
/* End XCRemoteSwiftPackageReference section */
@@ -1492,11 +1577,6 @@
package = CAA858CB25A3D8BC00ACF8C0 /* XCRemoteSwiftPackageReference "ErrorHandling" */;
productName = ErrorHandling;
};
- CABFA9DE2592F07A00380FEE /* Path */ = {
- isa = XCSwiftPackageProductDependency;
- package = CABFA9DD2592F07A00380FEE /* XCRemoteSwiftPackageReference "Path" */;
- productName = Path;
- };
CABFA9E32592F08E00380FEE /* Version */ = {
isa = XCSwiftPackageProductDependency;
package = CABFA9E22592F08E00380FEE /* XCRemoteSwiftPackageReference "Version" */;
@@ -1522,11 +1602,35 @@
package = CAC28186259EE27200B8AB0B /* XCRemoteSwiftPackageReference "CombineExpectations" */;
productName = CombineExpectations;
};
- E8F81FC3282D8A17006CBD0F /* Sparkle */ = {
+ E689540225BE8C64000EBCEA /* DockProgress */ = {
isa = XCSwiftPackageProductDependency;
- package = E8F81FC2282D8A17006CBD0F /* XCRemoteSwiftPackageReference "Sparkle" */;
+ package = E689540125BE8C64000EBCEA /* XCRemoteSwiftPackageReference "DockProgress" */;
+ productName = DockProgress;
+ };
+ E84E4F562B335094003F3959 /* OrderedCollections */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = E84E4F552B335094003F3959 /* XCRemoteSwiftPackageReference "swift-collections" */;
+ productName = OrderedCollections;
+ };
+ E891A1C32B43ACF900A1B9D1 /* Sparkle */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = E891A1C22B43ACA400A1B9D1 /* XCRemoteSwiftPackageReference "Sparkle" */;
productName = Sparkle;
};
+ E8C0EB19291EF43E0081528A /* XcodesKit */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = XcodesKit;
+ };
+ E8F44A1D296B4CD7002D6592 /* Path */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = E8F44A1C296B4CD7002D6592 /* XCRemoteSwiftPackageReference "Path" */;
+ productName = Path;
+ };
+ E8FD5726291EE4AC001E004C /* AsyncNetworkService */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = E8FD5725291EE4AC001E004C /* XCRemoteSwiftPackageReference "AsyncHTTPNetworkService" */;
+ productName = AsyncNetworkService;
+ };
/* End XCSwiftPackageProductDependency section */
};
rootObject = CAD2E7962449574E00113D76 /* Project object */;
diff --git a/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 58f4e08..220940e 100644
--- a/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,6 +1,15 @@
{
"object": {
"pins": [
+ {
+ "package": "AsyncNetworkService",
+ "repositoryURL": "https://github.com/RobotsAndPencils/AsyncHTTPNetworkService",
+ "state": {
+ "branch": "main",
+ "revision": "97770856c4e429f880d4b4dd68cfaf286dc00c30",
+ "version": null
+ }
+ },
{
"package": "CombineExpectations",
"repositoryURL": "https://github.com/groue/CombineExpectations",
@@ -14,11 +23,20 @@
"package": "XcodeReleases",
"repositoryURL": "https://github.com/xcodereleases/data",
"state": {
- "branch": null,
- "revision": "b47228c688b608e34b3b84079ab6052a24c7a981",
+ "branch": "main",
+ "revision": "a43ad89e536d7a3da525fcc23fb182c37b756ecc",
"version": null
}
},
+ {
+ "package": "DockProgress",
+ "repositoryURL": "https://github.com/sindresorhus/DockProgress",
+ "state": {
+ "branch": null,
+ "revision": "7100b68571e2dafe3a06ad5905b80fc3b0107b4b",
+ "version": "3.2.0"
+ }
+ },
{
"package": "ErrorHandling",
"repositoryURL": "https://github.com/RobotsAndPencils/ErrorHandling",
@@ -51,8 +69,8 @@
"repositoryURL": "https://github.com/mxcl/Path.swift",
"state": {
"branch": null,
- "revision": "dac007e907a4f4c565cfdc55a9ce148a761a11d5",
- "version": "0.16.3"
+ "revision": "8e355c28e9393c42e58b18c54cace2c42c98a616",
+ "version": "1.4.1"
}
},
{
@@ -60,8 +78,17 @@
"repositoryURL": "https://github.com/sparkle-project/Sparkle/",
"state": {
"branch": null,
- "revision": "286edd1fa22505a9e54d170e9fd07d775ea233f2",
- "version": "2.1.0"
+ "revision": "47d3d90aee3c52b6f61d04ceae426e607df62347",
+ "version": "2.5.2"
+ }
+ },
+ {
+ "package": "swift-collections",
+ "repositoryURL": "https://github.com/apple/swift-collections.git",
+ "state": {
+ "branch": null,
+ "revision": "a902f1823a7ff3c9ab2fba0f992396b948eda307",
+ "version": "1.0.5"
}
},
{
diff --git a/Xcodes.xcodeproj/xcshareddata/xcschemes/com.robotsandpencils.XcodesApp.Helper.xcscheme b/Xcodes.xcodeproj/xcshareddata/xcschemes/com.robotsandpencils.XcodesApp.Helper.xcscheme
new file mode 100644
index 0000000..19ae1c9
--- /dev/null
+++ b/Xcodes.xcodeproj/xcshareddata/xcschemes/com.robotsandpencils.XcodesApp.Helper.xcscheme
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Xcodes/AcknowledgementsGenerator/Sources/AcknowledgementsGenerator/Tools/Xcode.swift b/Xcodes/AcknowledgementsGenerator/Sources/AcknowledgementsGenerator/Tools/Xcode.swift
index 8710931..ab6ed16 100644
--- a/Xcodes/AcknowledgementsGenerator/Sources/AcknowledgementsGenerator/Tools/Xcode.swift
+++ b/Xcodes/AcknowledgementsGenerator/Sources/AcknowledgementsGenerator/Tools/Xcode.swift
@@ -35,7 +35,7 @@ private extension Xcode {
try? task.run()
let handle = pipe.fileHandleForReading
let data = handle.readDataToEndOfFile()
- let path = String(data: data, encoding: String.Encoding.utf8)
+ let path = String(data: data, encoding: String.Encoding.utf8)?.trimmingCharacters(in: .whitespacesAndNewlines)
return (path?.isEmpty ?? true) ? nil : path
}
}
diff --git a/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift b/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift
index 6f33a4a..5b9bd08 100644
--- a/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift
+++ b/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift
@@ -180,6 +180,8 @@ public class Client {
return (data, urlResponse)
case 400, 401:
throw AuthenticationError.incorrectSecurityCode
+ case 412:
+ throw AuthenticationError.appleIDAndPrivacyAcknowledgementRequired
case let code:
throw AuthenticationError.badStatusCode(statusCode: code, data: data, response: urlResponse)
}
diff --git a/Xcodes/Backend/AppState+Install.swift b/Xcodes/Backend/AppState+Install.swift
index ccf637d..325f314 100644
--- a/Xcodes/Backend/AppState+Install.swift
+++ b/Xcodes/Backend/AppState+Install.swift
@@ -5,6 +5,8 @@ import AppleAPI
import Version
import LegibleError
import os.log
+import DockProgress
+import XcodesKit
/// Downloads and installs Xcodes
extension AppState {
@@ -43,6 +45,8 @@ extension AppState {
Logger.appState.info("Using \(downloader) downloader")
+ setupDockProgress()
+
return validateSession()
.flatMap { _ in
self.getXcodeArchive(installationType, downloader: downloader)
@@ -51,6 +55,8 @@ extension AppState {
self.installArchivedXcode(xcode, at: url)
}
.catch { error -> AnyPublisher in
+ self.resetDockProgressTracking()
+
switch error {
case InstallationError.damagedXIP(let damagedXIPURL):
guard attemptNumber < 1 else { return Fail(error: error).eraseToAnyPublisher() }
@@ -99,6 +105,7 @@ extension AppState {
self.downloadOrUseExistingArchive(for: availableXcode, downloader: downloader, progressChanged: { [unowned self] progress in
DispatchQueue.main.async {
self.setInstallationStep(of: availableXcode.version, to: .downloading(progress: progress))
+ self.overallProgress.addChild(progress, withPendingUnitCount: AppState.totalProgressUnits - AppState.unxipProgressWeight)
}
})
.map { return (availableXcode, $0) }
@@ -151,6 +158,7 @@ extension AppState {
cookies
)
progressChanged(progress)
+
return publisher
.map { _ in destination.url }
.eraseToAnyPublisher()
@@ -165,6 +173,7 @@ extension AppState {
to: destination.url,
resumingWith: resumeData ?? persistedResumeData)
progressChanged(progress)
+
return publisher
.map { $0.saveLocation }
.eraseToAnyPublisher()
@@ -176,6 +185,9 @@ extension AppState {
}
public func installArchivedXcode(_ availableXcode: AvailableXcode, at archiveURL: URL) -> AnyPublisher {
+ unxipProgress.completedUnitCount = 0
+ overallProgress.addChild(unxipProgress, withPendingUnitCount: AppState.unxipProgressWeight)
+
do {
let destinationURL = Path.installDirectory.join("Xcode-\(availableXcode.version.descriptionWithoutBuildMetadata).app").url
switch archiveURL.pathExtension {
@@ -415,6 +427,9 @@ extension AppState {
}
self.presentedAlert = .privilegedHelper
}
+
+ unxipProgress.completedUnitCount = AppState.totalProgressUnits
+ resetDockProgressTracking()
return helperInstallConsentSubject
.flatMap {
@@ -455,9 +470,27 @@ extension AppState {
.eraseToAnyPublisher()
}
+ // MARK: - Dock Progress Tracking
+
+ private func setupDockProgress() {
+ DockProgress.progressInstance = nil
+ DockProgress.style = .bar
+
+ let progress = Progress(totalUnitCount: AppState.totalProgressUnits)
+ progress.kind = .file
+ progress.fileOperationKind = .downloading
+ overallProgress = progress
+
+ DockProgress.progressInstance = overallProgress
+ }
+
+ func resetDockProgressTracking() {
+ DockProgress.progress = 1 // Only way to completely remove overlay with DockProgress is setting progress to complete
+ }
+
// MARK: -
- func setInstallationStep(of version: Version, to step: InstallationStep) {
+ func setInstallationStep(of version: Version, to step: XcodeInstallationStep) {
DispatchQueue.main.async {
guard let index = self.allXcodes.firstIndex(where: { $0.version.isEquivalent(to: version) }) else { return }
self.allXcodes[index].installState = .installing(step)
@@ -466,6 +499,16 @@ extension AppState {
Current.notificationManager.scheduleNotification(title: xcode.id.appleDescription, body: step.description, category: .normal)
}
}
+
+ func setInstallationStep(of runtime: DownloadableRuntime, to step: RuntimeInstallationStep, postNotification: Bool = true) {
+ DispatchQueue.main.async {
+ guard let index = self.downloadableRuntimes.firstIndex(where: { $0.identifier == runtime.identifier }) else { return }
+ self.downloadableRuntimes[index].installState = .installing(step)
+ if postNotification {
+ Current.notificationManager.scheduleNotification(title: runtime.name, body: step.description, category: .normal)
+ }
+ }
+ }
}
extension AppState {
diff --git a/Xcodes/Backend/AppState+Runtimes.swift b/Xcodes/Backend/AppState+Runtimes.swift
new file mode 100644
index 0000000..81abc5b
--- /dev/null
+++ b/Xcodes/Backend/AppState+Runtimes.swift
@@ -0,0 +1,244 @@
+import Foundation
+import XcodesKit
+import OSLog
+import Combine
+import Path
+import AppleAPI
+
+extension AppState {
+ func updateDownloadableRuntimes() {
+ Task {
+ do {
+
+ let downloadableRuntimes = try await self.runtimeService.downloadableRuntimes()
+ let runtimes = downloadableRuntimes.downloadables.map { runtime in
+ var updatedRuntime = runtime
+
+ // This loops through and matches up the simulatorVersion to the mappings
+ let simulatorBuildUpdate = downloadableRuntimes.sdkToSimulatorMappings.first { SDKToSimulatorMapping in
+ SDKToSimulatorMapping.simulatorBuildUpdate == runtime.simulatorVersion.buildUpdate
+ }
+ updatedRuntime.sdkBuildUpdate = simulatorBuildUpdate?.sdkBuildUpdate
+ return updatedRuntime
+ }
+
+ DispatchQueue.main.async {
+ self.downloadableRuntimes = runtimes
+ }
+ try? cacheDownloadableRuntimes(runtimes)
+ } catch {
+ Logger.appState.error("Error downloading runtimes: \(error.localizedDescription)")
+ }
+ }
+ }
+
+ func updateInstalledRuntimes() {
+ Task {
+ do {
+ Logger.appState.info("Loading Installed runtimes")
+ let runtimes = try await self.runtimeService.localInstalledRuntimes()
+
+ DispatchQueue.main.async {
+ self.installedRuntimes = runtimes
+ }
+ } catch {
+ Logger.appState.error("Error loading installed runtimes: \(error.localizedDescription)")
+ }
+ }
+ }
+
+ func downloadRuntime(runtime: DownloadableRuntime) {
+ runtimePublishers[runtime.identifier] = Task {
+ do {
+ let downloadedURL = try await downloadRunTimeFull(runtime: runtime)
+ if !Task.isCancelled {
+ Logger.appState.debug("Installing runtime: \(runtime.name)")
+ DispatchQueue.main.async {
+ self.setInstallationStep(of: runtime, to: .installing)
+ }
+ switch runtime.contentType {
+ case .package:
+ // not supported yet (do we need to for old packages?)
+ throw "Installing via package not support - please install manually from \(downloadedURL.description)"
+ case .diskImage:
+ try await self.installFromImage(dmgURL: downloadedURL)
+ DispatchQueue.main.async {
+ self.setInstallationStep(of: runtime, to: .trashingArchive)
+ }
+ try Current.files.removeItem(at: downloadedURL)
+ }
+
+ DispatchQueue.main.async {
+ guard let index = self.downloadableRuntimes.firstIndex(where: { $0.identifier == runtime.identifier }) else { return }
+ self.downloadableRuntimes[index].installState = .installed
+ }
+ updateInstalledRuntimes()
+ }
+
+ }
+ catch {
+ Logger.appState.error("Error downloading runtime: \(error.localizedDescription)")
+ DispatchQueue.main.async {
+ self.error = error
+ self.presentedAlert = .generic(title: localizeString("Alert.Install.Error.Title"), message: error.legibleLocalizedDescription)
+ }
+ }
+ }
+ }
+
+ func downloadRunTimeFull(runtime: DownloadableRuntime) async throws -> URL {
+ // sets a proper cookie for runtimes
+ try await validateADCSession(path: runtime.downloadPath)
+
+ let downloader = Downloader(rawValue: UserDefaults.standard.string(forKey: "downloader") ?? "aria2") ?? .aria2
+
+ let url = URL(string: runtime.source)!
+ let expectedRuntimePath = Path.xcodesApplicationSupport/"\(url.lastPathComponent)"
+ // aria2 downloads directly to the destination (instead of into /tmp first) so we need to make sure that the download isn't incomplete
+ let aria2DownloadMetadataPath = expectedRuntimePath.parent/(expectedRuntimePath.basename() + ".aria2")
+ var aria2DownloadIsIncomplete = false
+ if case .aria2 = downloader, aria2DownloadMetadataPath.exists {
+ aria2DownloadIsIncomplete = true
+ }
+ if Current.files.fileExistsAtPath(expectedRuntimePath.string), aria2DownloadIsIncomplete == false {
+ Logger.appState.info("Found existing runtime that will be used for installation at \(expectedRuntimePath).")
+ return expectedRuntimePath.url
+ }
+
+ Logger.appState.info("Downloading \(runtime.visibleIdentifier) with \(downloader)")
+ switch downloader {
+ case .aria2:
+ let aria2Path = Path(url: Bundle.main.url(forAuxiliaryExecutable: "aria2c")!)!
+ for try await progress in downloadRuntimeWithAria2(runtime, to: expectedRuntimePath, aria2Path: aria2Path) {
+ DispatchQueue.main.async {
+ self.setInstallationStep(of: runtime, to: .downloading(progress: progress), postNotification: false)
+ }
+ }
+ Logger.appState.debug("Done downloading runtime")
+
+ case .urlSession:
+ throw "Downloading runtimes with URLSession is not supported. Please use aria2"
+ }
+ return expectedRuntimePath.url
+ }
+
+ public func downloadRuntimeWithAria2(_ runtime: DownloadableRuntime, to destination: Path, aria2Path: Path) -> AsyncThrowingStream