Merge branch 'XcodesOrg:main' into main

This commit is contained in:
huihuisang 2025-09-17 23:30:06 +08:00 committed by GitHub
commit 361740123c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 192 additions and 99 deletions

View file

@ -0,0 +1,26 @@
#!/bin/sh
# Fix libfido2.framework structure for macOS validation
# If this script is not run, the build will fail because xcodebuild is expecting the library in a specific structure
FRAMEWORK_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Frameworks/libfido2.framework"
if [ -d "$FRAMEWORK_PATH" ] && [ -f "$FRAMEWORK_PATH/Info.plist" ] && [ ! -d "$FRAMEWORK_PATH/Versions" ]; then
echo "Fixing libfido2.framework bundle structure..."
# Create proper bundle structure
mkdir -p "$FRAMEWORK_PATH/Versions/A/Resources"
# Move files to proper locations
mv "$FRAMEWORK_PATH/Info.plist" "$FRAMEWORK_PATH/Versions/A/Resources/"
mv "$FRAMEWORK_PATH/libfido2" "$FRAMEWORK_PATH/Versions/A/"
if [ -f "$FRAMEWORK_PATH/LICENSE" ]; then
mv "$FRAMEWORK_PATH/LICENSE" "$FRAMEWORK_PATH/Versions/A/"
fi
# Create symbolic links
ln -sf A "$FRAMEWORK_PATH/Versions/Current"
ln -sf Versions/Current/libfido2 "$FRAMEWORK_PATH/libfido2"
ln -sf Versions/Current/Resources "$FRAMEWORK_PATH/Resources"
echo "libfido2.framework structure fixed"
fi

View file

@ -139,6 +139,7 @@
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 */; };
E8EEAD1D2E79174F00BE67E8 /* XcodesIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = E8EEAD1C2E79174F00BE67E8 /* XcodesIcon.icon */; };
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 */; };
@ -341,6 +342,7 @@
E8D655BF288DD04700A139C2 /* SelectedActionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedActionType.swift; sourceTree = "<group>"; };
E8DA461025FAF7FB002E85EF /* NotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsView.swift; sourceTree = "<group>"; };
E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallationStepDetailView.swift; sourceTree = "<group>"; };
E8EEAD1C2E79174F00BE67E8 /* XcodesIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = XcodesIcon.icon; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -560,6 +562,7 @@
CABFAA1D2592F7F200380FEE /* Resources */ = {
isa = PBXGroup;
children = (
E8EEAD1C2E79174F00BE67E8 /* XcodesIcon.icon */,
CAA858DA25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz */,
CAA8588025A2B63A00ACF8C0 /* aria2c */,
CAA8588A25A2B69300ACF8C0 /* aria2c.LICENSE */,
@ -703,6 +706,7 @@
buildConfigurationList = CAD2E7BC2449575100113D76 /* Build configuration list for PBXNativeTarget "Xcodes" */;
buildPhases = (
CAD2E79A2449574E00113D76 /* Sources */,
D971F84C2E79102E005F84C9 /* Fix libfido2 structure */,
CAD2E79B2449574E00113D76 /* Frameworks */,
CA9FF8292594F33200E47BAF /* Generate Acknowledgements */,
CAD2E79C2449574E00113D76 /* Resources */,
@ -837,6 +841,7 @@
files = (
CAD2E7A92449575000113D76 /* Preview Assets.xcassets in Resources */,
9DD4FFCB2B13EC1800C974F1 /* Localizable.xcstrings in Resources */,
E8EEAD1D2E79174F00BE67E8 /* XcodesIcon.icon in Resources */,
CA9FF83F2594FBC000E47BAF /* Licenses.rtf in Resources */,
CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */,
CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */,
@ -876,6 +881,24 @@
shellPath = /bin/sh;
shellScript = "cd \"${SRCROOT}/Xcodes/AcknowledgementsGenerator\"\nxcrun -sdk macosx swift run AcknowledgementsGenerator \\\n -p \"${SRCROOT}/Xcodes.xcodeproj\" \\\n -o \"${SRCROOT}/Xcodes/Resources/Licenses.rtf\"\n";
};
D971F84C2E79102E005F84C9 /* Fix libfido2 structure */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Fix libfido2 structure";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "${SRCROOT}/Scripts/fix_libfido2_framework.sh\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -1092,7 +1115,8 @@
CA8FB636256E154800469DA5 /* Test */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/XcodesTest.entitlements;
CODE_SIGN_IDENTITY = "-";
@ -1344,7 +1368,8 @@
CAD2E7BD2449575100113D76 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
@ -1372,7 +1397,8 @@
CAD2E7BE2449575100113D76 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";

View file

@ -63,7 +63,8 @@ extension AppState {
if selectedXcode.version > Version(major: 16, minor: 0, patch: 0) {
if runtime.architectures?.isAppleSilicon ?? false {
if selectedXcode.version > Version(major: 26, minor: 0, patch: 0) {
// Need Xcode 26 but with some RC/Beta's its simpler to just to greater > 25
if selectedXcode.version > Version(major: 25, minor: 0, patch: 0) {
downloadRuntimeViaXcodeBuild(runtime: runtime)
} else {
// not supported

View file

@ -35,21 +35,18 @@ struct PlatformsView: View {
.frame(maxWidth: .infinity, alignment: .leading)
if !architectures.isEmpty {
Spacer()
Button {
switch selectedRuntimeArchitecture {
case .arm64: selectedRuntimeArchitecture = .x86_64
case .x86_64: selectedRuntimeArchitecture = .arm64
}
} label: {
switch selectedRuntimeArchitecture {
case .arm64:
Label(selectedRuntimeArchitecture.displayString, systemImage: "m4.button.horizontal")
.labelStyle(.trailingIcon)
case .x86_64:
Label(selectedRuntimeArchitecture.displayString, systemImage: "cpu.fill")
.labelStyle(.trailingIcon)
Picker("Architecture", selection: $selectedRuntimeArchitecture) {
ForEach(Architecture.allCases, id: \.self) { arch in
Label(arch.displayString, systemImage: arch.iconName)
.tag(arch)
}
.labelStyle(.trailingIcon)
}
.pickerStyle(.menu)
.menuStyle(.button)
.buttonStyle(.borderless)
.fixedSize()
.labelsHidden()
}
}

View file

@ -22,60 +22,44 @@ struct MainToolbarModifier: ViewModifier {
}
.keyboardShortcut(KeyEquivalent("r"))
.help("RefreshDescription")
Spacer()
Button(action: {
switch architectures {
case .universal: architectures = .appleSilicon
case .appleSilicon: architectures = .universal
}
}) {
switch architectures {
case .universal:
Label("Universal", systemImage: "cpu.fill")
case .appleSilicon:
Label("Apple Silicon", systemImage: "m4.button.horizontal")
.labelStyle(.trailingIcon)
.foregroundColor(.accentColor)
}
}
.help("FilterAvailableDescription")
.disabled(architectures.isManaged)
Button(action: {
switch category {
case .all: category = .release
case .release: category = .beta
case .beta: category = .all
Spacer()
let isFiltering = isInstalledOnly || category != .all || architectures != .universal
Menu("Filter", systemImage: "line.horizontal.3.decrease.circle") {
Section {
Toggle("Installed Only", systemImage: "arrow.down.app", isOn: $isInstalledOnly) .labelStyle(.titleAndIcon)
}
}) {
switch category {
case .all:
Label("All", systemImage: "line.horizontal.3.decrease.circle")
case .release:
.help("FilterInstalledDescription")
Section {
Picker("Category", selection: $category) {
Label("All", systemImage: "line.horizontal.3.decrease.circle")
.tag(XcodeListCategory.all)
Label("ReleaseOnly", systemImage: "line.horizontal.3.decrease.circle.fill")
.labelStyle(.trailingIcon)
.tag(XcodeListCategory.release)
Label("BetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill")
.tag(XcodeListCategory.beta)
}
}
.help("FilterAvailableDescription")
.disabled(category.isManaged)
Section {
Picker("Architecture", selection: $architectures) {
Label("Universal", systemImage: "cpu.fill")
.tag(XcodeListArchitecture.universal)
Label("Apple Silicon", systemImage: "m4.button.horizontal")
.foregroundColor(.accentColor)
case .beta:
Label("BetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill")
.labelStyle(.trailingIcon)
.foregroundColor(.accentColor)
.tag(XcodeListArchitecture.appleSilicon)
}
.help("FilterArchitecturesDescription")
.disabled(architectures.isManaged)
}
.labelStyle(.titleAndIcon)
}
.help("FilterAvailableDescription")
.disabled(category.isManaged)
Button(action: {
isInstalledOnly.toggle()
}) {
if isInstalledOnly {
Label("Filter", systemImage: "arrow.down.app.fill")
.foregroundColor(.accentColor)
} else {
Label("Filter", systemImage: "arrow.down.app")
}
}
.help("FilterInstalledDescription")
.pickerStyle(.inline)
.symbolVariant(isFiltering ? .fill : .none)
}
}
}

View file

@ -1547,7 +1547,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Are you sure you want to stop the installation of Xcode %@?"
"value" : "Tem certeza que deseja interromper a instalação do Xcode %@?"
}
},
"ru" : {
@ -1798,7 +1798,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Delete"
"value" : "Remover"
}
},
"ru" : {
@ -1923,7 +1923,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Are you sure you want to delete %@?"
"value" : "Tem certeza que deseja remover %@?"
}
},
"ru" : {
@ -2172,7 +2172,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apple only supports downloading runtimes iOS 16.0+, watchOS 9.0+, tvOS 16+, visionOS 1.0+ with Xcode 16.1+. Please download, make active and try again."
"value" : "A Apple oferece suporte para download somente nos sistemas operacionais iOS 16.0+, watchOS 9.0+, tvOS 16+ e visionOS 1.0+ com Xcode 16.1+. Baixe, ative e tente novamente."
}
},
"ru" : {
@ -2297,7 +2297,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apple supports downloading Apple Silicon runtimes only when Xcode 26+ is selected. Please Select and try downloading again or download the universal build."
"value" : "A Apple oferece suporte ao download de runtimes do Apple Silicon somente quando o Xcode 26+ estiver selecionado. Selecione e tente baixar novamente ou baixe a compilação universal."
}
},
"ru" : {
@ -3800,7 +3800,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Could not find file \"%@\"."
"value" : "Não foi possível encontrar o arquivo \"%@\"."
}
},
"ru" : {
@ -4910,7 +4910,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Authenticating"
"value" : "Autenticando"
}
},
"ru" : {
@ -6860,7 +6860,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copy URL"
"value" : "Copiar URL"
}
},
"ru" : {
@ -6984,7 +6984,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Criar Symlink como Xcode.app"
"value" : "Criar link simbólico como Xcode.app"
}
},
"ru" : {
@ -7108,7 +7108,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Create Symlink as Xcode-Beta.app"
"value" : "Criar link simbólico como Xcode-Beta.app"
}
},
"ru" : {
@ -8719,7 +8719,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Error"
"value" : "Erro"
}
},
"ru" : {
@ -8838,7 +8838,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Experiments"
"value" : "Experimentos"
}
},
"ru" : {
@ -10810,7 +10810,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Install Apple Silicon"
"value" : "Instalar Apple Silicon"
}
},
"ru" : {
@ -10928,7 +10928,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Install Universal"
"value" : "Instalar Universal"
}
},
"ru" : {
@ -13428,7 +13428,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Install Directory"
"value" : "Diretório de instalação"
}
},
"ru" : {
@ -13676,7 +13676,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xcodes searches and installs to a single directory. By default (and recommended) is to keep this /Applications. Any changes to where Xcode is stored may result in other apps/services to stop working. "
"value" : "Xcodes procura e instala em um diretório único. Por padrão (e recomendado) é mantido no /Applications. Qualquer mudança onde o Xcode é instalado pode resultar na falha de outros aplicativos/serviços."
}
},
"ru" : {
@ -13919,7 +13919,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Licensa"
"value" : "Licença"
}
},
"ru" : {
@ -15529,7 +15529,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Requerir uma nova funcionalidade"
"value" : "Solicitar uma nova funcionalidade"
}
},
"ru" : {
@ -15653,7 +15653,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Misc"
"value" : "Diversos"
}
},
"ru" : {
@ -16890,7 +16890,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sua conta não possui nenhum telefone confiável, mas é necessário para autenticação de dois fatores.\n\nVer https://support.apple.com/en-ca/HT204915."
"value" : "Sua conta não possui nenhum telefone confiável, mas é necessário para autenticação de dois fatores.\n\nVeja https://support.apple.com/en-ca/HT204915."
}
},
"ru" : {
@ -17382,7 +17382,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "On select, will keep the name as the version eg. Xcode-13.4.1.app"
"value" : "Quando selecionado, será mantido o nome com a versão ex. Xcode-13.4.1.app"
}
},
"ru" : {
@ -17868,7 +17868,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open In Rosetta"
"value" : "Abrir com Rosetta"
}
},
"ru" : {
@ -18234,7 +18234,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perform post-install steps"
"value" : "Executar passos pós-instalação"
}
},
"ru" : {
@ -18482,7 +18482,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "PIN not set"
"value" : "PIN não definido"
}
},
"ru" : {
@ -18506,7 +18506,7 @@
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "PIN not set"
"value" : "没有设置 PIN"
}
},
"zh-Hant" : {
@ -18606,7 +18606,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Platforms"
"value" : "Plataformas"
}
},
"ru" : {
@ -18730,7 +18730,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Installed Platforms"
"value" : "Plataformas instaladas"
}
},
"ru" : {
@ -18855,7 +18855,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Below are a list of platforms that are installed on this machine. "
"value" : "Abaixo contém uma lista de plataformas que estão instalada nesse computador."
}
},
"ru" : {
@ -20581,7 +20581,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Insert your physical security key and enter the PIN"
"value" : "Insira sua chave de segurança física e digite o PIN"
}
},
"ru" : {
@ -20706,7 +20706,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Touch your security key to verify that its you"
"value" : "Toque na sua chave de segurança para verificar que é você"
}
},
"ru" : {
@ -21315,7 +21315,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar opçao abrir com Rosetta"
"value" : "Mostrar opção abrir com Rosetta"
}
},
"ru" : {
@ -22061,7 +22061,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Support Xcodes"
"value" : "Ajude o Xcodes"
}
},
"ru" : {
@ -22185,7 +22185,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terminate App after last window is closed"
"value" : "Encerrar o aplicativo quando a ultima janela for fechada"
}
},
"ru" : {

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

View file

@ -0,0 +1,50 @@
{
"fill" : {
"automatic-gradient" : "extended-srgb:0.00000,0.47843,1.00000,1.00000"
},
"groups" : [
{
"layers" : [
{
"glass" : false,
"hidden" : false,
"image-name-specializations" : [
{
"value" : "Light.png"
},
{
"appearance" : "dark",
"value" : "Dark.png"
},
{
"appearance" : "tinted",
"value" : "Mono.png"
}
],
"name" : "Dark",
"position" : {
"scale" : 1,
"translation-in-points" : [
0,
0
]
}
}
],
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"specular" : false,
"translucency" : {
"enabled" : false,
"value" : 0.5
}
}
],
"supported-platforms" : {
"squares" : [
"macOS"
]
}
}

View file

@ -8,7 +8,7 @@
import Foundation
/// The name of an Architecture.
public enum Architecture: String, Codable, Equatable, Hashable, Identifiable {
public enum Architecture: String, Codable, Equatable, Hashable, Identifiable, CaseIterable {
public var id: Self { self }
/// The Arm64 architecture (Apple Silicon)
@ -24,6 +24,15 @@ public enum Architecture: String, Codable, Equatable, Hashable, Identifiable {
return "Intel"
}
}
public var iconName: String {
switch self {
case .arm64:
return "m4.button.horizontal"
case .x86_64:
return "cpu.fill"
}
}
}
extension Array where Element == Architecture {