diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 7aeb76cf..419ed765 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -3,10 +3,12 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 90; objects = { /* Begin PBXBuildFile section */ + 05AB7F172E76C96E007C5CFE /* XcodeMajorVersionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AB7F162E76C96E007C5CFE /* XcodeMajorVersionRow.swift */; }; + 05AB7F192E76CD8C007C5CFE /* XcodeMinorVersionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AB7F182E76CD8C007C5CFE /* XcodeMinorVersionRow.swift */; }; 15F5B8902CCF09B900705E2F /* CryptoKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15F5B88F2CCF09B900705E2F /* CryptoKit.framework */; }; 33027E342CA8C18800CB387C /* LibFido2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 334A932B2CA885A400A5E079 /* LibFido2Swift */; }; 3328073F2CA5E2C80036F691 /* SignInSecurityKeyPinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3328073E2CA5E2C80036F691 /* SignInSecurityKeyPinView.swift */; }; @@ -165,39 +167,36 @@ /* Begin PBXCopyFilesBuildPhase section */ CA9FF8AC2595967A00E47BAF /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; + dstSubfolder = None; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; CA9FF8BB259596B500E47BAF /* Copy Helper */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; dstPath = Contents/Library/LaunchServices; - dstSubfolderSpec = 1; + dstSubfolder = Wrapper; files = ( E8FA00542B5B109800769CE0 /* com.xcodesorg.xcodesapp.Helper in Copy Helper */, ); name = "Copy Helper"; - runOnlyForDeploymentPostprocessing = 0; }; CAA8589225A2B76F00ACF8C0 /* Copy aria2c */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; dstPath = ""; - dstSubfolderSpec = 6; + dstSubfolder = Executables; files = ( E8CBDB8927ADE32300B22292 /* unxip in Copy aria2c */, CAA8589325A2B77E00ACF8C0 /* aria2c in Copy aria2c */, ); name = "Copy aria2c"; - runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 05AB7F162E76C96E007C5CFE /* XcodeMajorVersionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeMajorVersionRow.swift; sourceTree = ""; }; + 05AB7F182E76CD8C007C5CFE /* XcodeMinorVersionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeMinorVersionRow.swift; sourceTree = ""; }; 15F5B88F2CCF09B900705E2F /* CryptoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CryptoKit.framework; path = System/Library/Frameworks/CryptoKit.framework; sourceTree = SDKROOT; }; 3328073E2CA5E2C80036F691 /* SignInSecurityKeyPinView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSecurityKeyPinView.swift; sourceTree = ""; }; 332807402CA5EA820036F691 /* SignInSecurityKeyTouchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSecurityKeyTouchView.swift; sourceTree = ""; }; @@ -348,14 +347,11 @@ /* Begin PBXFrameworksBuildPhase section */ CA9FF8AB2595967A00E47BAF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; files = ( ); - runOnlyForDeploymentPostprocessing = 0; }; CAD2E79B2449574E00113D76 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; files = ( 15F5B8902CCF09B900705E2F /* CryptoKit.framework in Frameworks */, 33027E342CA8C18800CB387C /* LibFido2Swift in Frameworks */, @@ -373,15 +369,12 @@ E84E4F572B335094003F3959 /* OrderedCollections in Frameworks */, E8F44A1E296B4CD7002D6592 /* Path in Frameworks */, ); - runOnlyForDeploymentPostprocessing = 0; }; CAD2E7B02449575100113D76 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; files = ( CAC28188259EE27200B8AB0B /* CombineExpectations in Frameworks */, ); - runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ @@ -489,6 +482,8 @@ CA44901E2463AD34003D8213 /* Tag.swift */, CAE42486259A68A300B8B246 /* XcodeListCategory.swift */, CAD2E7A32449574E00113D76 /* XcodeListView.swift */, + 05AB7F162E76C96E007C5CFE /* XcodeMajorVersionRow.swift */, + 05AB7F182E76CD8C007C5CFE /* XcodeMinorVersionRow.swift */, CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */, E8D0296E284B029800647641 /* BottomStatusBar.swift */, ); @@ -694,8 +689,6 @@ ); buildRules = ( ); - dependencies = ( - ); name = com.xcodesorg.xcodesapp.Helper; productName = com.robotsandpencils.XcodesApp.Helper; productReference = CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */; @@ -706,6 +699,7 @@ buildConfigurationList = CAD2E7BC2449575100113D76 /* Build configuration list for PBXNativeTarget "Xcodes" */; buildPhases = ( CAD2E79A2449574E00113D76 /* Sources */, + 05EACA532E76D21100CF1F9D /* Fix libfido2 structure */, CAD2E79B2449574E00113D76 /* Frameworks */, CA9FF8292594F33200E47BAF /* Generate Acknowledgements */, CAD2E79C2449574E00113D76 /* Resources */, @@ -765,8 +759,9 @@ CAD2E7962449574E00113D76 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1220; - LastUpgradeCheck = 1140; + LastUpgradeCheck = 2600; ORGANIZATIONNAME = "Robots and Pencils"; TargetAttributes = { CA9FF8AD2595967A00E47BAF = { @@ -782,7 +777,6 @@ }; }; buildConfigurationList = CAD2E7992449574E00113D76 /* Build configuration list for PBXProject "Xcodes" */; - compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -823,6 +817,7 @@ E83FDC422CBB649100679C6B /* XCRemoteSwiftPackageReference "Sparkle" */, 33027E282CA8BB5800CB387C /* XCRemoteSwiftPackageReference "LibFido2Swift" */, ); + preferredProjectObjectVersion = 90; productRefGroup = CAD2E79F2449574E00113D76 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -837,7 +832,6 @@ /* Begin PBXResourcesBuildPhase section */ CAD2E79C2449574E00113D76 /* Resources */ = { isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; files = ( CAD2E7A92449575000113D76 /* Preview Assets.xcassets in Resources */, 9DD4FFCB2B13EC1800C974F1 /* Localizable.xcstrings in Resources */, @@ -846,47 +840,56 @@ CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */, CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */, ); - runOnlyForDeploymentPostprocessing = 0; }; CAD2E7B12449575100113D76 /* Resources */ = { isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; files = ( CA452BC1259FDDFE0072DFA4 /* Stub-version.plist in Resources */, CA452BEB25A236500072DFA4 /* Stub-0.0.0.Info.plist in Resources */, ); - runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - CA9FF8292594F33200E47BAF /* Generate Acknowledgements */ = { + 05EACA532E76D21100CF1F9D /* Fix libfido2 structure */ = { isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( + alwaysOutOfDate = 1; + name = "Fix libfido2 structure"; + shellPath = /bin/sh; + shellScript = ( + "./Scripts/fix_libfido2_framework.sh", + "", + "", ); + }; + CA9FF8292594F33200E47BAF /* Generate Acknowledgements */ = { + isa = PBXShellScriptBuildPhase; inputPaths = ( "$(SRCROOT)/Xcodes.xcodeproj", "$(SRCROOT)/**/*.LICENSE", ); name = "Generate Acknowledgements"; - outputFileListPaths = ( - ); outputPaths = ( "$(SRCROOT)/Xcodes/Resources/Licenses.rtf", ); - runOnlyForDeploymentPostprocessing = 0; 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"; + shellScript = ( + "cd \"${SRCROOT}/Xcodes/AcknowledgementsGenerator\"", + "xcrun -sdk macosx swift run AcknowledgementsGenerator \\", + " -p \"${SRCROOT}/Xcodes.xcodeproj\" \\", + " -o \"${SRCROOT}/Xcodes/Resources/Licenses.rtf\"", + "", + "", + "", + "", + "", + ); }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ CA9FF8AA2595967A00E47BAF /* Sources */ = { isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; files = ( CA9FF8D025959A9700E47BAF /* HelperXPCShared.swift in Sources */, CA42DD7325AEB04300BC0B0C /* Logger.swift in Sources */, @@ -895,17 +898,16 @@ CA9FF8B12595967A00E47BAF /* main.swift in Sources */, CA9FF8E025959BAA00E47BAF /* ConnectionVerifier.swift in Sources */, ); - runOnlyForDeploymentPostprocessing = 0; }; CAD2E79A2449574E00113D76 /* Sources */ = { isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; files = ( CA9FF8CF25959A9700E47BAF /* HelperXPCShared.swift in Sources */, CA735109257BF96D00EA9CF8 /* AttributedText.swift in Sources */, CAFBDC4E2599B33D003DCC5A /* MainToolbar.swift in Sources */, CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */, CAA8589B25A2B83000ACF8C0 /* Aria2CError.swift in Sources */, + 05AB7F192E76CD8C007C5CFE /* XcodeMinorVersionRow.swift in Sources */, 536CFDD2263C94DE00026CE0 /* SignedInView.swift in Sources */, CABFAA492593162500380FEE /* Bundle+InfoPlistValues.swift in Sources */, CA9FF8662595130600E47BAF /* View+IsHidden.swift in Sources */, @@ -944,6 +946,7 @@ CA452BB0259FD9770072DFA4 /* ProgressIndicator.swift in Sources */, B0403CF02AD92D7B00137C09 /* ReleaseNotesView.swift in Sources */, CAFE4AB425B7D3AF0064FE51 /* AdvancedPreferencePane.swift in Sources */, + 05AB7F172E76C96E007C5CFE /* XcodeMajorVersionRow.swift in Sources */, CA9FF84E2595079F00E47BAF /* ScrollingTextView.swift in Sources */, E832EAF82B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift in Sources */, CABFA9C12592EEEA00380FEE /* Version+.swift in Sources */, @@ -1001,18 +1004,15 @@ CA39711924495F0E00AFFB77 /* AppStoreButtonStyle.swift in Sources */, CA9FF88125955C7000E47BAF /* AvailableXcode.swift in Sources */, ); - runOnlyForDeploymentPostprocessing = 0; }; CAD2E7AF2449575100113D76 /* Sources */ = { isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; files = ( CAC281E7259FA45A00B8AB0B /* Environment+Mock.swift in Sources */, CAC281E2259FA44600B8AB0B /* Bundle+XcodesTests.swift in Sources */, CA2518EC25A7FF2B00F08414 /* AppStateUpdateTests.swift in Sources */, CAB3AB0E25BCA6C200BF1B04 /* AppStateTests.swift in Sources */, ); - runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ @@ -1030,10 +1030,11 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - CA8FB635256E154800469DA5 /* Test */ = { + CA8FB635256E154800469DA5 /* Test configuration for PBXProject "Xcodes" */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1057,6 +1058,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1065,9 +1067,12 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1088,13 +1093,14 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Test; }; - CA8FB636256E154800469DA5 /* Test */ = { + CA8FB636256E154800469DA5 /* Test configuration for PBXNativeTarget "Xcodes" */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon; @@ -1104,9 +1110,10 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; CURRENT_PROJECT_VERSION = 34; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_HARDENED_RUNTIME = NO; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = Xcodes/Resources/Info.plist; @@ -1124,14 +1131,14 @@ }; name = Test; }; - CA8FB637256E154800469DA5 /* Test */ = { + CA8FB637256E154800469DA5 /* Test configuration for PBXNativeTarget "XcodesTests" */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = XcodesTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -1148,13 +1155,14 @@ }; name = Test; }; - CA9FF8B22595967A00E47BAF /* Debug */ = { + CA9FF8B22595967A00E47BAF /* Debug configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = { 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; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist"; @@ -1173,7 +1181,7 @@ }; name = Debug; }; - CA9FF8B32595967A00E47BAF /* Test */ = { + CA9FF8B32595967A00E47BAF /* Test configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; @@ -1181,7 +1189,8 @@ CODE_SIGN_ENTITLEMENTS = com.xcodesorg.xcodesapp.Helper/com.xcodesorg.xcodesapp.HelperTest.entitlements; CODE_SIGN_STYLE = Manual; CREATE_INFOPLIST_SECTION_IN_BINARY = YES; - DEVELOPMENT_TEAM = ""; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_HARDENED_RUNTIME = NO; INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist"; MARKETING_VERSION = 2.0.0; @@ -1200,7 +1209,7 @@ }; name = Test; }; - CA9FF8B42595967A00E47BAF /* Release */ = { + CA9FF8B42595967A00E47BAF /* Release configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; @@ -1208,6 +1217,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; CREATE_INFOPLIST_SECTION_IN_BINARY = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist"; @@ -1226,10 +1236,11 @@ }; name = Release; }; - CAD2E7BA2449575100113D76 /* Debug */ = { + CAD2E7BA2449575100113D76 /* Debug configuration for PBXProject "Xcodes" */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1253,6 +1264,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1261,9 +1273,12 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1284,16 +1299,18 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; - CAD2E7BB2449575100113D76 /* Release */ = { + CAD2E7BB2449575100113D76 /* Release configuration for PBXProject "Xcodes" */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1317,6 +1334,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1325,9 +1343,12 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1341,13 +1362,14 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; - CAD2E7BD2449575100113D76 /* Debug */ = { + CAD2E7BD2449575100113D76 /* Debug configuration for PBXNativeTarget "Xcodes" */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon; @@ -1357,6 +1379,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; CURRENT_PROJECT_VERSION = 34; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = ZU6GR6B2FY; @@ -1376,7 +1399,7 @@ }; name = Debug; }; - CAD2E7BE2449575100113D76 /* Release */ = { + CAD2E7BE2449575100113D76 /* Release configuration for PBXNativeTarget "Xcodes" */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon; @@ -1386,6 +1409,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; CURRENT_PROJECT_VERSION = 34; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = ZU6GR6B2FY; @@ -1405,13 +1429,13 @@ }; name = Release; }; - CAD2E7C02449575100113D76 /* Debug */ = { + CAD2E7C02449575100113D76 /* Debug configuration for PBXNativeTarget "XcodesTests" */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ZU6GR6B2FY; INFOPLIST_FILE = XcodesTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -1427,14 +1451,14 @@ }; name = Debug; }; - CAD2E7C12449575100113D76 /* Release */ = { + CAD2E7C12449575100113D76 /* Release configuration for PBXNativeTarget "XcodesTests" */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ZU6GR6B2FY; INFOPLIST_FILE = XcodesTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -1456,41 +1480,37 @@ CA9FF8B52595967A00E47BAF /* Build configuration list for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = { isa = XCConfigurationList; buildConfigurations = ( - CA9FF8B22595967A00E47BAF /* Debug */, - CA9FF8B32595967A00E47BAF /* Test */, - CA9FF8B42595967A00E47BAF /* Release */, + CA9FF8B22595967A00E47BAF /* Debug configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */, + CA9FF8B32595967A00E47BAF /* Test configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */, + CA9FF8B42595967A00E47BAF /* Release configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */, ); - defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; CAD2E7992449574E00113D76 /* Build configuration list for PBXProject "Xcodes" */ = { isa = XCConfigurationList; buildConfigurations = ( - CAD2E7BA2449575100113D76 /* Debug */, - CA8FB635256E154800469DA5 /* Test */, - CAD2E7BB2449575100113D76 /* Release */, + CAD2E7BA2449575100113D76 /* Debug configuration for PBXProject "Xcodes" */, + CA8FB635256E154800469DA5 /* Test configuration for PBXProject "Xcodes" */, + CAD2E7BB2449575100113D76 /* Release configuration for PBXProject "Xcodes" */, ); - defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; CAD2E7BC2449575100113D76 /* Build configuration list for PBXNativeTarget "Xcodes" */ = { isa = XCConfigurationList; buildConfigurations = ( - CAD2E7BD2449575100113D76 /* Debug */, - CA8FB636256E154800469DA5 /* Test */, - CAD2E7BE2449575100113D76 /* Release */, + CAD2E7BD2449575100113D76 /* Debug configuration for PBXNativeTarget "Xcodes" */, + CA8FB636256E154800469DA5 /* Test configuration for PBXNativeTarget "Xcodes" */, + CAD2E7BE2449575100113D76 /* Release configuration for PBXNativeTarget "Xcodes" */, ); - defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; CAD2E7BF2449575100113D76 /* Build configuration list for PBXNativeTarget "XcodesTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - CAD2E7C02449575100113D76 /* Debug */, - CA8FB637256E154800469DA5 /* Test */, - CAD2E7C12449575100113D76 /* Release */, + CAD2E7C02449575100113D76 /* Debug configuration for PBXNativeTarget "XcodesTests" */, + CA8FB637256E154800469DA5 /* Test configuration for PBXNativeTarget "XcodesTests" */, + CAD2E7C12449575100113D76 /* Release configuration for PBXNativeTarget "XcodesTests" */, ); - defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ diff --git a/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/Xcodes.xcodeproj/xcshareddata/xcschemes/Xcodes.xcscheme b/Xcodes.xcodeproj/xcshareddata/xcschemes/Xcodes.xcscheme index f0379f7b..c26f7175 100644 --- a/Xcodes.xcodeproj/xcshareddata/xcschemes/Xcodes.xcscheme +++ b/Xcodes.xcodeproj/xcshareddata/xcschemes/Xcodes.xcscheme @@ -1,6 +1,6 @@ [XcodeMajorVersionGroup] { + let majorGroups = Dictionary(grouping: self) { $0.version.major } + return majorGroups.map { majorVersion, xcodes in + let minorGroups = Dictionary(grouping: xcodes) { $0.version.minor } + let minorVersionGroups = minorGroups.map { minorVersion, minorXcodes in + XcodeMinorVersionGroup( + majorVersion: majorVersion, + minorVersion: minorVersion, + versions: minorXcodes.sorted { $0.version > $1.version } + ) + }.sorted { $0.minorVersion > $1.minorVersion } + + return XcodeMajorVersionGroup( + majorVersion: majorVersion, + minorVersionGroups: minorVersionGroups + ) + }.sorted { $0.majorVersion > $1.majorVersion } + } } diff --git a/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift b/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift index b15f5c6d..de4f3b83 100644 --- a/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift +++ b/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift @@ -24,6 +24,7 @@ struct GeneralPreferencePane: View { GroupBox(label: Text("Misc")) { Toggle("TerminateAfterLastWindowClosed", isOn: $appState.terminateAfterLastWindowClosed) + Toggle("EnableCollapsibleList", isOn: $appState.collapsableListEnabled) } .groupBoxStyle(PreferencesGroupBoxStyle()) } diff --git a/Xcodes/Frontend/XcodeList/XcodeListView.swift b/Xcodes/Frontend/XcodeList/XcodeListView.swift index 3c10e0bc..c22a9617 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -10,6 +10,8 @@ struct XcodeListView: View { private let architecture: XcodeListArchitecture private let isInstalledOnly: Bool @AppStorage(PreferenceKey.allowedMajorVersions.rawValue) private var allowedMajorVersions = Int.max + @State private var expandedMajorVersions = Set() + @State private var expandedMinorVersions = Set() init(selectedXcodeID: Binding, searchText: String, category: XcodeListCategory, isInstalledOnly: Bool, architecture: XcodeListArchitecture) { self._selectedXcodeID = selectedXcodeID @@ -29,12 +31,12 @@ struct XcodeListView: View { case .beta: xcodes = appState.allXcodes.filter { $0.version.isPrerelease } } - + if architecture == .appleSilicon { xcodes = xcodes.filter { $0.architectures == [.arm64] } } - - + + let latestMajor = xcodes.sorted(\.version) .filter { $0.version.isNotPrerelease } .last? @@ -54,17 +56,32 @@ struct XcodeListView: View { if !searchText.isEmpty { xcodes = xcodes.filter { $0.description.contains(searchText) } } - + if isInstalledOnly { xcodes = xcodes.filter { $0.installState.installed } } - + return xcodes } + + var majorVersionGroups: [XcodeMajorVersionGroup] { + visibleXcodes.groupedByMajorVersion() + } var body: some View { - List(visibleXcodes, selection: $selectedXcodeID) { xcode in - XcodeListViewRow(xcode: xcode, selected: selectedXcodeID == xcode.id, appState: appState) + List(selection: $selectedXcodeID) { + if appState.collapsableListEnabled { + CollapsableListView( + visibleXcodes: visibleXcodes, + selectedXcodeID: $selectedXcodeID, + appState: appState + ) + } else { + ForEach(visibleXcodes) { xcode in + XcodeListViewRow(xcode: xcode, selected: selectedXcodeID == xcode.id, appState: appState) + .tag(xcode.id) + } + } } .listStyle(.sidebar) .safeAreaInset(edge: .bottom, spacing: 0) { @@ -76,6 +93,72 @@ struct XcodeListView: View { } } +struct CollapsableListView: View { + let visibleXcodes: [Xcode] + @Binding var selectedXcodeID: Xcode.ID? + let appState: AppState + + @State private var expandedMajorVersions = Set() + @State private var expandedMinorVersions = Set() + + var majorVersionGroups: [XcodeMajorVersionGroup] { + visibleXcodes.groupedByMajorVersion() + } + + var body: some View { + ForEach(majorVersionGroups) { majorVersionGroup in + let isMajorExpanded = expandedMajorVersions.contains(majorVersionGroup.majorVersion) + + XcodeMajorVersionRow( + majorVersionGroup: majorVersionGroup, + isExpanded: isMajorExpanded, + onToggleExpanded: { + if isMajorExpanded { + expandedMajorVersions.remove(majorVersionGroup.majorVersion) + // Collapse all minor versions when major version is collapsed + for minorGroup in majorVersionGroup.minorVersionGroups { + expandedMinorVersions.remove(minorGroup.id) + } + } else { + expandedMajorVersions.insert(majorVersionGroup.majorVersion) + } + }, + appState: appState + ) + .tag(majorVersionGroup.selectedVersion?.id) + + if isMajorExpanded { + ForEach(majorVersionGroup.minorVersionGroups) { minorVersionGroup in + let isMinorExpanded = expandedMinorVersions.contains(minorVersionGroup.id) + + XcodeMinorVersionRow( + minorVersionGroup: minorVersionGroup, + isExpanded: isMinorExpanded, + onToggleExpanded: { + if isMinorExpanded { + expandedMinorVersions.remove(minorVersionGroup.id) + } else { + expandedMinorVersions.insert(minorVersionGroup.id) + } + }, + appState: appState + ) + .tag(minorVersionGroup.selectedVersion?.id) + + if isMinorExpanded { + ForEach(minorVersionGroup.versions) { xcode in + XcodeListViewRow(xcode: xcode, selected: selectedXcodeID == xcode.id, appState: appState) + .padding(.leading, 40) + .tag(xcode.id) + } + } + } + } + } + } +} + + struct PlatformsPocket: View { @SwiftUI.Environment(\.openWindow) private var openWindow @@ -92,7 +175,11 @@ struct PlatformsPocket: View { .background(.quaternary.opacity(0.75)) .clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous)) } - + .font(.body.weight(.medium)) + .padding(.horizontal) + .padding(.vertical, 12) + .background(.quaternary.opacity(0.9)) + .clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous)) } .buttonStyle(.plain) } @@ -132,3 +219,4 @@ struct XcodeListView_Previews: PreviewProvider { .previewLayout(.sizeThatFits) } } + diff --git a/Xcodes/Frontend/XcodeList/XcodeMajorVersionRow.swift b/Xcodes/Frontend/XcodeList/XcodeMajorVersionRow.swift new file mode 100644 index 00000000..60084176 --- /dev/null +++ b/Xcodes/Frontend/XcodeList/XcodeMajorVersionRow.swift @@ -0,0 +1,157 @@ +import SwiftUI +import Version +import Path + +struct XcodeMajorVersionRow: View { + let majorVersionGroup: XcodeMajorVersionGroup + let isExpanded: Bool + let onToggleExpanded: () -> Void + let appState: AppState + + var body: some View { + HStack { + Button(action: onToggleExpanded) { + HStack(spacing: 8) { + Image(systemName: isExpanded ? "chevron.down" : "chevron.right") + .font(.caption.weight(.semibold)) + .foregroundColor(.secondary) + + majorVersionIcon + + VStack(alignment: .leading, spacing: 2) { + Text(String(format: localizeString("Xcode %@"), majorVersionGroup.displayName)) + .font(.body.weight(.medium)) + + if let latestRelease = majorVersionGroup.latestRelease { + Text(String(format: localizeString("Latest: %@"), latestRelease.description)) + .font(.caption) + .foregroundColor(.secondary) + } + } + + Spacer() + } + } + .buttonStyle(.plain) + + selectControl() + .padding(.trailing, 16) + installControl() + } + .padding(.vertical, 8) + .background(Color.clear) + .contentShape(Rectangle()) + } + + @ViewBuilder + var majorVersionIcon: some View { + if let latestRelease = majorVersionGroup.latestRelease { + if let icon = latestRelease.icon { + Image(nsImage: icon) + .resizable() + .frame(width: 32, height: 32) + } else { + Image("xcode") + .resizable() + .frame(width: 32, height: 32) + .opacity(0.7) + } + } else { + Image("xcode-beta") + .resizable() + .frame(width: 32, height: 32) + .opacity(0.7) + } + } + + @ViewBuilder + func selectControl() -> some View { + if let selectedVersion = majorVersionGroup.selectedVersion { + if selectedVersion.selected { + Image(systemName: "checkmark.circle.fill") + .foregroundColor(.green) + .help("ActiveVersionDescription") + } else { + EmptyView() + } + } else if majorVersionGroup.hasInstalled { + EmptyView() + } else { + EmptyView() + } + } + + @ViewBuilder + func installControl() -> some View { + if majorVersionGroup.hasInstalling { + if let installingVersion = majorVersionGroup.versions.first(where: { $0.installState.installing }) { + if case let .installing(installationStep) = installingVersion.installState { + InstallationStepRowView( + installationStep: installationStep, + highlighted: false, + cancel: { appState.presentedAlert = .cancelInstall(xcode: installingVersion) } + ) + } + } + } else if let latestRelease = majorVersionGroup.latestRelease { + switch latestRelease.installState { + case .installed: + Button("Open") { appState.open(xcode: latestRelease) } + .textCase(.uppercase) + .buttonStyle(AppStoreButtonStyle(primary: true, highlighted: false)) + .help("OpenDescription") + case .notInstalled: + Button("Install Latest Release") { + appState.checkMinVersionAndInstall(id: latestRelease.id) + } + .textCase(.uppercase) + .buttonStyle(AppStoreButtonStyle(primary: false, highlighted: false)) + .help("InstallLatestReleaseDescription") + case .installing: + EmptyView() + } + } + } +} + +struct XcodeMajorVersionRow_Previews: PreviewProvider { + static var previews: some View { + let sampleXcodes = [ + Xcode(version: Version("16.4.0")!, installState: .installed(Path("/Applications/Xcode-16.4.0.app")!), selected: true, icon: nil), + Xcode(version: Version("16.3.0")!, installState: .notInstalled, selected: false, icon: nil), + Xcode(version: Version("16.2.0")!, installState: .notInstalled, selected: false, icon: nil), + ] + + let minorVersionGroups = [ + XcodeMinorVersionGroup( + majorVersion: 16, + minorVersion: 4, + versions: [sampleXcodes[0]] + ), + XcodeMinorVersionGroup( + majorVersion: 16, + minorVersion: 3, + versions: [sampleXcodes[1]] + ), + XcodeMinorVersionGroup( + majorVersion: 16, + minorVersion: 2, + versions: [sampleXcodes[2]] + ) + ] + + let majorVersionGroup = XcodeMajorVersionGroup( + majorVersion: 16, + minorVersionGroups: minorVersionGroups, + isExpanded: false + ) + + XcodeMajorVersionRow( + majorVersionGroup: majorVersionGroup, + isExpanded: false, + onToggleExpanded: {}, + appState: AppState() + ) + .previewLayout(.sizeThatFits) + } +} diff --git a/Xcodes/Frontend/XcodeList/XcodeMinorVersionRow.swift b/Xcodes/Frontend/XcodeList/XcodeMinorVersionRow.swift new file mode 100644 index 00000000..c75ca21f --- /dev/null +++ b/Xcodes/Frontend/XcodeList/XcodeMinorVersionRow.swift @@ -0,0 +1,140 @@ +import SwiftUI +import Version +import Path + +struct XcodeMinorVersionRow: View { + let minorVersionGroup: XcodeMinorVersionGroup + let isExpanded: Bool + let onToggleExpanded: () -> Void + let appState: AppState + + var body: some View { + HStack { + Button(action: onToggleExpanded) { + HStack(spacing: 8) { + Image(systemName: isExpanded ? "chevron.down" : "chevron.right") + .font(.caption.weight(.semibold)) + .foregroundColor(.secondary) + + minorVersionIcon + + VStack(alignment: .leading, spacing: 2) { + Text(String(format: localizeString("Xcode %@"), minorVersionGroup.displayName)) + .font(.callout.weight(.medium)) + + if let latestRelease = minorVersionGroup.latestRelease { + Text(String(format: localizeString("Latest: %@"), latestRelease.description)) + .font(.caption2) + .foregroundColor(.secondary) + } + } + + Spacer() + } + } + .buttonStyle(.plain) + + selectControl() + .padding(.trailing, 16) + installControl() + } + .padding(.vertical, 6) + .padding(.leading, 20) + .background(Color.clear) + .contentShape(Rectangle()) + } + + @ViewBuilder + var minorVersionIcon: some View { + if let latestRelease = minorVersionGroup.latestRelease { + if let icon = latestRelease.icon { + Image(nsImage: icon) + .resizable() + .frame(width: 28, height: 28) + } else { + Image("xcode") + .resizable() + .frame(width: 28, height: 28) + .opacity(0.6) + } + } else { + Image("xcode-beta") + .resizable() + .frame(width: 28, height: 28) + .opacity(0.6) + } + } + + @ViewBuilder + func selectControl() -> some View { + if let selectedVersion = minorVersionGroup.selectedVersion { + if selectedVersion.selected { + Image(systemName: "checkmark.circle.fill") + .foregroundColor(.green) + .help("ActiveVersionDescription") + } else { + EmptyView() + } + } else if minorVersionGroup.hasInstalled { + EmptyView() + } else { + EmptyView() + } + } + + @ViewBuilder + func installControl() -> some View { + if minorVersionGroup.hasInstalling { + if let installingVersion = minorVersionGroup.versions.first(where: { $0.installState.installing }) { + if case let .installing(installationStep) = installingVersion.installState { + InstallationStepRowView( + installationStep: installationStep, + highlighted: false, + cancel: { appState.presentedAlert = .cancelInstall(xcode: installingVersion) } + ) + } + } + } else if let latestRelease = minorVersionGroup.latestRelease { + switch latestRelease.installState { + case .installed: + Button("Open") { appState.open(xcode: latestRelease) } + .textCase(.uppercase) + .buttonStyle(AppStoreButtonStyle(primary: true, highlighted: false)) + .help("OpenDescription") + case .notInstalled: + Button("Install Latest") { + appState.checkMinVersionAndInstall(id: latestRelease.id) + } + .textCase(.uppercase) + .buttonStyle(AppStoreButtonStyle(primary: false, highlighted: false)) + .help("InstallLatestVersionDescription") + case .installing: + EmptyView() + } + } + } +} + +struct XcodeMinorVersionRow_Previews: PreviewProvider { + static var previews: some View { + let sampleXcodes = [ + Xcode(version: Version("16.4.0")!, installState: .installed(Path("/Applications/Xcode-16.4.0.app")!), selected: true, icon: nil), + Xcode(version: Version("16.4.1")!, installState: .notInstalled, selected: false, icon: nil), + ] + + let minorVersionGroup = XcodeMinorVersionGroup( + majorVersion: 16, + minorVersion: 4, + versions: sampleXcodes, + isExpanded: false + ) + + XcodeMinorVersionRow( + minorVersionGroup: minorVersionGroup, + isExpanded: false, + onToggleExpanded: {}, + appState: AppState() + ) + .previewLayout(.sizeThatFits) + } +} diff --git a/Xcodes/Resources/Licenses.rtf b/Xcodes/Resources/Licenses.rtf index cef9fff5..5383be27 100644 --- a/Xcodes/Resources/Licenses.rtf +++ b/Xcodes/Resources/Licenses.rtf @@ -1064,33 +1064,6 @@ SOFTWARE.\ \ \ -\fs34 data\ -\ - -\fs26 MIT License\ -\ -Copyright (c) 2018 \ -\ -Permission is hereby granted, free of charge, to any person obtaining a copy\ -of this software and associated documentation files (the "Software"), to deal\ -in the Software without restriction, including without limitation the rights\ -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ -copies of the Software, and to permit persons to whom the Software is\ -furnished to do so, subject to the following conditions:\ -\ -The above copyright notice and this permission notice shall be included in all\ -copies or substantial portions of the Software.\ -\ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\ -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\ -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\ -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\ -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\ -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\ -SOFTWARE.\ -\ -\ - \fs34 Sparkle\ \ diff --git a/Xcodes/Resources/Localizable.xcstrings b/Xcodes/Resources/Localizable.xcstrings index 2d503460..b458c23f 100644 --- a/Xcodes/Resources/Localizable.xcstrings +++ b/Xcodes/Resources/Localizable.xcstrings @@ -8794,6 +8794,24 @@ } } }, + "EnableCollapsibleList" : { + "comment" : "A toggle that enables or disables the collapsible list feature.", + "isCommentAutoGenerated" : true, + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haupt- und Unterversionen in der Listenansicht zusammenklappen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collapse Major and Minor Versions in the list view" + } + } + } + }, "EnableNotifications" : { "localizations" : { "ar" : { @@ -11382,6 +11400,14 @@ } } }, + "Install Latest" : { + "comment" : "A button that installs the latest Xcode version.", + "isCommentAutoGenerated" : true + }, + "Install Latest Release" : { + "comment" : "A button that installs the latest release of Xcode.", + "isCommentAutoGenerated" : true + }, "Install Universal" : { "localizations" : { "ar" : { @@ -14259,6 +14285,14 @@ } } }, + "InstallLatestReleaseDescription" : { + "comment" : "A button label that instructs the user to install the latest release of Xcode.", + "isCommentAutoGenerated" : true + }, + "InstallLatestVersionDescription" : { + "comment" : "A button label that instructs the user to install the latest version of Xcode.", + "isCommentAutoGenerated" : true + }, "InstallPathDescription" : { "localizations" : { "ar" : { @@ -14520,6 +14554,10 @@ } } }, + "Latest: %@" : { + "comment" : "A sublabel within the Xcode major version row that shows the description of the latest release in that version group.", + "isCommentAutoGenerated" : true + }, "License" : { "localizations" : { "ar" : { @@ -24851,6 +24889,10 @@ } } }, + "Xcode %@" : { + "comment" : "A title and optional subtitle for a row in the checkout view, displaying the Xcode version and its latest release.", + "isCommentAutoGenerated" : true + }, "Xcodes" : { "localizations" : { "ar" : { @@ -24976,5 +25018,5 @@ } } }, - "version" : "1.0" + "version" : "1.1" } \ No newline at end of file