From 00e7ee83ccaf8a6669bbce593214913280849c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Pacheco=20Neves?= Date: Tue, 16 Apr 2024 20:01:16 +0100 Subject: [PATCH] =?UTF-8?q?Migrate=20to=20Swift=205=EF=B8=8F=E2=83=A3.9?= =?UTF-8?q?=EF=B8=8F=E2=83=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrate CI to macOS 14 image and Xcode 15.2 which contains Swift 5.9, and migrate Danger CI to run on ubuntu 22.04. https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md#xcode ## Changes - Update Xcode references to 15.2 and Swift references to 5.9. reasons. - Update destination device to iPhone 15 Pro. - Improve SwiftLint setup and fix warnings. - Update `README.md`. - Apply Xcode's recommended project settings. - Improve SwiftLint setup: + Move SwiftLint run script to Alicerce target + Add SwiftLint as SPM plugin on Alicerce Package (via Package.swift) - Improve CI: + Update GH Actions' versions + Specify SwiftLint version for Danger CI + Place DerivedData outside checkout folder + Enable SPM caching and artifact upload in CI + Always upload artifacts + Disable Package and Macro validation for CI + Add Homebrew bundle install and caching + Add multiple workarounds for Carthage validation + Cancel in progress PR builds on push --- .github/workflows/ci.yml | 220 +++++++++++++++--- .github/workflows/danger-ci.yml | 6 +- .swiftlint.yml | 4 +- .../xcschemes/Alicerce (SPM).xcscheme | 2 +- Alicerce.podspec | 2 +- Alicerce.xcodeproj/project.pbxproj | 86 ++----- .../xcshareddata/xcschemes/Alicerce.xcscheme | 2 +- .../xcshareddata/swiftpm/Package.resolved | 86 +++++++ Brewfile | 5 + Brewfile.lock.json | 105 +++++++++ Package.swift | 14 +- README.md | 10 +- .../Destinations/Log+FileLogDestination.swift | 2 +- .../DiskMemoryPersistenceStack.swift | 3 +- .../Route+TrieRouter_RouteTests.swift | 6 + script/carthage.sh | 2 +- 16 files changed, 453 insertions(+), 102 deletions(-) create mode 100644 Alicerce.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Brewfile create mode 100644 Brewfile.lock.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc1bf0af..99977ebd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,14 +11,19 @@ on: - master env: - # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-12-Readme.md#xcode - DEVELOPER_DIR: /Applications/Xcode_14.0.app/Contents/Developer - IOS_DESTINATION: "platform=iOS Simulator,name=iPhone 14 Pro,OS=latest" + # https://github.com/actions/runner-images/blob/main/images/macos/macos-14-Readme.md#xcode + DEVELOPER_DIR: "/Applications/Xcode_15.2.app/Contents/Developer" + IOS_DESTINATION: "platform=iOS Simulator,name=iPhone 15 Pro,OS=latest" + +concurrency: + # cancel in progress jobs only from PRs, as run_id is unique + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true jobs: env-details: name: Environment details - runs-on: macos-12 + runs-on: macos-14 steps: - name: xcode version run: xcodebuild -version -sdk @@ -28,22 +33,60 @@ jobs: xcrun simctl delete unavailable xcrun simctl list + - name: brew version + run: brew --version + build-test: name: Build and Test - runs-on: macos-12 + runs-on: macos-14 env: WORKSPACE: Alicerce.xcworkspace SCHEME: Alicerce - DERIVED_DATA_PATH: build + DERIVED_DATA_PATH: /tmp/DerivedData + SPM_CLONED_DEPENDENCIES_PATH: /tmp/spm-dependencies RESULT_BUNDLE_PATH: build-test.xcresult + COBERTURA_REPORT_PATH: coverage.xml + LOG_PATH: xcodebuild.log steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 2 - - name: install xcbeautify - run: brew install xcbeautify + - name: set Homebrew cache path + run: | + HOMEBREW_CACHE_DIR="$(brew --cache)" + echo "Homebrew cache directory: $HOMEBREW_CACHE_DIR" + echo "HOMEBREW_CACHE_PATH=$HOMEBREW_CACHE_DIR" >> "$GITHUB_ENV" + + - name: cache Homebrew + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.HOMEBREW_CACHE_PATH }} + key: ${{ runner.os }}-brew-${{ hashFiles('**/Brewfile.lock.json') }} + restore-keys: ${{ runner.os }}-brew- + + - name: install Homebrew formulas + run: | + brew update + brew bundle install + + - name: cache SPM + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.SPM_CLONED_DEPENDENCIES_PATH }} + key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} + restore-keys: ${{ runner.os }}-spm- + + - name: cache DerivedData + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.DERIVED_DATA_PATH }} + key: ${{ runner.os }}-DerivedData-${{ hashFiles('**/Package.resolved') }} + restore-keys: ${{ runner.os }}-DerivedData- - name: unit tests run: | @@ -55,26 +98,85 @@ jobs: -derivedDataPath "$DERIVED_DATA_PATH" \ -enableCodeCoverage YES \ -resultBundlePath "$RESULT_BUNDLE_PATH" \ + -onlyUsePackageVersionsFromResolvedFile \ + -skipPackagePluginValidation \ + -skipMacroValidation \ + -clonedSourcePackagesDirPath $SPM_CLONED_DEPENDENCIES_PATH \ + | tee $LOG_PATH \ | xcbeautify + # https://about.codecov.io/blog/pre-converting-xcresult-files-for-codecov-using-xcresultparser/ + - name: convert .xcresult bundle + run: | + set -o pipefail + xcresultparser \ + --output-format cobertura \ + "$RESULT_BUNDLE_PATH" >"$COBERTURA_REPORT_PATH" + - name: codecov upload - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 + with: + plugin: xcode + file: ${{ env.COBERTURA_REPORT_PATH }} + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Archive artifacts + if: always() + uses: actions/upload-artifact@v4 with: - xcode: true - xcode_archive_path: ${{ env.RESULT_BUNDLE_PATH }} + name: artifacts + path: | + ${{ env.RESULT_BUNDLE_PATH }} + ${{ env.COBERTURA_REPORT_PATH }} + ${{ env.LOG_PATH }} swiftpm: name: SwiftPM Build - runs-on: macos-12 + runs-on: macos-14 env: WORKSPACE: Alicerce.xcworkspace SCHEME: "Alicerce (SPM)" + DERIVED_DATA_PATH: /tmp/DerivedData + SPM_CLONED_DEPENDENCIES_PATH: /tmp/spm-dependencies + LOG_PATH: spm-xcodebuild.log steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: install xcbeautify - run: brew install xcbeautify + - name: set Homebrew cache path + run: | + HOMEBREW_CACHE_DIR="$(brew --cache)" + echo "Homebrew cache directory: $HOMEBREW_CACHE_DIR" + echo "HOMEBREW_CACHE_PATH=$HOMEBREW_CACHE_DIR" >> "$GITHUB_ENV" + + - name: cache Homebrew + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.HOMEBREW_CACHE_PATH }} + key: ${{ runner.os }}-brew-${{ hashFiles('**/Brewfile.lock.json') }} + restore-keys: ${{ runner.os }}-brew- + + - name: install Homebrew formulas + run: | + brew update + brew bundle install + + - name: cache SPM + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.SPM_CLONED_DEPENDENCIES_PATH }} + key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} + restore-keys: ${{ runner.os }}-spm- + + - name: cache DerivedData + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.DERIVED_DATA_PATH }} + key: ${{ runner.os }}-DerivedData-${{ hashFiles('**/Package.resolved') }} + restore-keys: ${{ runner.os }}-DerivedData- - name: build run: | @@ -83,14 +185,27 @@ jobs: -workspace "$WORKSPACE" \ -scheme "$SCHEME" \ -destination "$IOS_DESTINATION" \ + -derivedDataPath $DERIVED_DATA_PATH \ + -onlyUsePackageVersionsFromResolvedFile \ + -skipPackagePluginValidation \ + -skipMacroValidation \ + -clonedSourcePackagesDirPath $SPM_CLONED_DEPENDENCIES_PATH \ + | tee $LOG_PATH \ | xcbeautify + - name: Archive logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: spm-xcodebuild.log + path: ${{ env.LOG_PATH }} + cocoapods: name: CocoaPods Verification - runs-on: macos-12 + runs-on: macos-14 steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: ruby versions run: | @@ -99,7 +214,7 @@ jobs: bundler --version - name: cache gems - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor/bundle key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }} @@ -116,22 +231,73 @@ jobs: carthage: name: Carthage Verification - runs-on: macos-12 + runs-on: macos-14 + env: + # Use Xcode 15.3 (latest) for Carthage to avoid iOS device/simulator version mismatches + DEVELOPER_DIR: "/Applications/Xcode_15.3.app/Contents/Developer" + DERIVED_DATA_PATH: /tmp/DerivedData + LOG_PATH: carthage.log steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 + + - name: set Homebrew cache path + run: | + HOMEBREW_CACHE_DIR="$(brew --cache)" + echo "Homebrew cache directory: $HOMEBREW_CACHE_DIR" + echo "HOMEBREW_CACHE_PATH=$HOMEBREW_CACHE_DIR" >> "$GITHUB_ENV" + + - name: cache Homebrew + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.HOMEBREW_CACHE_PATH }} + key: ${{ runner.os }}-brew-${{ hashFiles('**/Brewfile.lock.json') }} + restore-keys: ${{ runner.os }}-brew- + + - name: install Homebrew formulas + run: | + brew update + brew bundle install + + - name: cache DerivedData + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.DERIVED_DATA_PATH }} + key: ${{ runner.os }}-DerivedData-${{ hashFiles('**/Package.resolved') }} + restore-keys: ${{ runner.os }}-DerivedData- - name: carthage build - run: ./script/carthage.sh build --cache-builds --no-skip-current + run: | + defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + + # remove SPM scheme because Carthage builds all shared schemes... + rm ".swiftpm/xcode/xcshareddata/xcschemes/Alicerce (SPM).xcscheme" + + ./script/carthage.sh build \ + --cache-builds \ + --no-skip-current \ + --use-xcframeworks \ + --derived-data $DERIVED_DATA_PATH \ + --log-path $LOG_PATH + + - name: Archive logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: carthage.log + path: ${{ env.LOG_PATH }} release-github: name: GitHub Release - runs-on: macos-12 + runs-on: macos-14 needs: [build-test, swiftpm, cocoapods, carthage] if: startsWith(github.ref, 'refs/tags/') steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: create release uses: softprops/action-gh-release@v1 @@ -145,12 +311,12 @@ jobs: release-cocoapods: name: CocoaPods Release - runs-on: macos-12 + runs-on: macos-14 needs: [build-test, swiftpm, cocoapods, carthage] if: startsWith(github.ref, 'refs/tags/') steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: ruby versions run: | @@ -159,7 +325,7 @@ jobs: bundler --version - name: cache gems - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor/bundle key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }} diff --git a/.github/workflows/danger-ci.yml b/.github/workflows/danger-ci.yml index 41b7e09f..98ad822f 100644 --- a/.github/workflows/danger-ci.yml +++ b/.github/workflows/danger-ci.yml @@ -10,10 +10,10 @@ jobs: Danger: name: Danger Swift - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Danger - uses: 417-72KI/danger-swiftlint@v3 + uses: 417-72KI/danger-swiftlint@v5.9 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.swiftlint.yml b/.swiftlint.yml index 21e3ca57..c823d23f 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -1,11 +1,12 @@ excluded: - - Carthage + - Carthage/ - Pods/ - Tests/ - Alicerce.playground/ reporter: "xcode" disabled_rules: - closure_parameter_position + - blanket_disable_command - todo - unused_optional_binding - nesting @@ -43,7 +44,6 @@ function_body_length: error: 150 number_separator: minimum_length: 5 -empty_count: warning superfluous_disable_command: warning implicit_return: included: diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/Alicerce (SPM).xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/Alicerce (SPM).xcscheme index 4911ab78..e294a2c3 100644 --- a/.swiftpm/xcode/xcshareddata/xcschemes/Alicerce (SPM).xcscheme +++ b/.swiftpm/xcode/xcshareddata/xcschemes/Alicerce (SPM).xcscheme @@ -1,6 +1,6 @@ 'https://github.com/Mindera/Alicerce.git', :tag => "#{s.version}" } s.module_name = 'Alicerce' - s.swift_version = '5.7' + s.swift_version = '5.9' s.ios.deployment_target = '13.0' diff --git a/Alicerce.xcodeproj/project.pbxproj b/Alicerce.xcodeproj/project.pbxproj index da76e0ec..59dead7e 100644 --- a/Alicerce.xcodeproj/project.pbxproj +++ b/Alicerce.xcodeproj/project.pbxproj @@ -6,20 +6,6 @@ objectVersion = 54; objects = { -/* Begin PBXAggregateTarget section */ - F12FB1B920A6E88F00AA3A52 /* SwiftLint */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 9708743F219F086000264EE3 /* Build configuration list for PBXAggregateTarget "SwiftLint" */; - buildPhases = ( - 9708743E219F086000264EE3 /* ShellScript */, - ); - dependencies = ( - ); - name = SwiftLint; - productName = SwiftLint; - }; -/* End PBXAggregateTarget section */ - /* Begin PBXBuildFile section */ 0A01F88020B337BA00BA7C4D /* CertificateUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A85F0EC20B31B210095AFFB /* CertificateUtils.swift */; }; 0A01F88120B3462200BA7C4D /* DigiCertGlobalRootG2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 0A5CBC0620B31D7200A1447A /* DigiCertGlobalRootG2.cer */; }; @@ -356,16 +342,10 @@ remoteGlobalIDString = 0A7B505620B72192005A08E7; remoteInfo = DummyHostApp; }; - F12FB1BD20A6E89E00AA3A52 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = OBJ_1 /* Project object */; - proxyType = 1; - remoteGlobalIDString = F12FB1B920A6E88F00AA3A52; - remoteInfo = SwiftLint; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0A006D412BCEFD2100339B67 /* carthage.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = carthage.sh; path = script/carthage.sh; sourceTree = ""; }; 0A01F88520B34A9000BA7C4D /* AmazonRootCA4.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = AmazonRootCA4.cer; sourceTree = ""; }; 0A01F88D20B370F300BA7C4D /* MinderaAlicerceRootCA.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = MinderaAlicerceRootCA.cer; sourceTree = ""; }; 0A01F89320B383EB00BA7C4D /* DigiCertGlobalRootG2.pub */ = {isa = PBXFileReference; lastKnownFileType = file; path = DigiCertGlobalRootG2.pub; sourceTree = ""; }; @@ -474,7 +454,6 @@ 0A5CBC0620B31D7200A1447A /* DigiCertGlobalRootG2.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = DigiCertGlobalRootG2.cer; sourceTree = ""; }; 0A5CBC0720B31D7200A1447A /* GeoTrust_Universal_CA.cer */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GeoTrust_Universal_CA.cer; sourceTree = ""; }; 0A5ECF87283ECBBB0001437D /* ItemFormat+BuilderTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ItemFormat+BuilderTestCase.swift"; sourceTree = ""; }; - 0A6A4D7524A5F98E0093F174 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; 0A6BD637228876A10063CEAB /* Network+URLSessionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Network+URLSessionError.swift"; sourceTree = ""; }; 0A708F5320E932EB001784DA /* ModuleLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleLogger.swift; sourceTree = ""; }; 0A708F5820E9360A001784DA /* MetadataLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetadataLogger.swift; sourceTree = ""; }; @@ -576,6 +555,7 @@ 0ABEC1F2284FE0DD00043288 /* ItemFormat+ItemComponentsTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ItemFormat+ItemComponentsTestCase.swift"; sourceTree = ""; }; 0ABFFAB91EA7F25B00CFC8BD /* Alicerce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Alicerce.h; path = Alicerce.xcodeproj/Alicerce.h; sourceTree = ""; }; 0ABFFAE11EAA6ED400CFC8BD /* HTTP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTP.swift; sourceTree = ""; }; + 0ACC55C02BD98D7E00C8EAB3 /* Brewfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Brewfile; sourceTree = ""; }; 0ACEB2912080E6D4000D95AD /* Atomic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = ""; }; 0ACEB2952080ED90000D95AD /* AtomicTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtomicTestCase.swift; sourceTree = ""; }; 0ACEB2972080EF88000D95AD /* Lock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lock.swift; sourceTree = ""; }; @@ -787,10 +767,11 @@ 0AA4EBA6264598AE00616FB3 /* .github */, 0A933AB3244A2F3800AEBC07 /* .swiftlint.yml */, 0A3C2D001EA7E1B500EFB7D4 /* .codecov.yml */, - 0A6A4D7524A5F98E0093F174 /* .swiftlint.yml */, OBJ_6 /* Package.swift */, A0163F5526B94F2900C67CC7 /* Dangerfile.swift */, 0A3C2D021EA7E1B500EFB7D4 /* Alicerce.podspec */, + 0A006D412BCEFD2100339B67 /* carthage.sh */, + 0ACC55C02BD98D7E00C8EAB3 /* Brewfile */, 0AA4EBA72645E96900616FB3 /* Gemfile */, 0AFB453C251143ED00698CBB /* Documentation */, ); @@ -1625,6 +1606,7 @@ isa = PBXNativeTarget; buildConfigurationList = 0A3C2D821EA7E3E900EFB7D4 /* Build configuration list for PBXNativeTarget "Alicerce" */; buildPhases = ( + 0ACC55C12BD98DE900C8EAB3 /* Run SwiftLint */, 0A3C2D6E1EA7E3E800EFB7D4 /* Headers */, 0A3C2D6C1EA7E3E800EFB7D4 /* Sources */, 0A3C2D6D1EA7E3E800EFB7D4 /* Frameworks */, @@ -1633,7 +1615,6 @@ buildRules = ( ); dependencies = ( - F12FB1BE20A6E89E00AA3A52 /* PBXTargetDependency */, ); name = Alicerce; productName = Alicerce; @@ -1681,8 +1662,9 @@ OBJ_1 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1240; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1520; ORGANIZATIONNAME = Mindera; TargetAttributes = { 0A266F801ED59DC7009CD0D7 = { @@ -1715,12 +1697,13 @@ Base, ); mainGroup = OBJ_5; + packageReferences = ( + ); productRefGroup = OBJ_13 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0A3C2D701EA7E3E800EFB7D4 /* Alicerce */, - F12FB1B920A6E88F00AA3A52 /* SwiftLint */, 0A266F801ED59DC7009CD0D7 /* AlicerceTests */, 0A7B505620B72192005A08E7 /* DummyHostApp */, 0A908667217767B200E76280 /* HostAppRequiringTests */, @@ -1803,7 +1786,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 9708743E219F086000264EE3 /* ShellScript */ = { + 0ACC55C12BD98DE900C8EAB3 /* Run SwiftLint */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -1813,13 +1796,14 @@ ); inputPaths = ( ); + name = "Run SwiftLint"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: Swiftlint is not installed\"\nfi\n"; + shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n echo \"Running SwiftLint '$(swiftlint --version)' from '$PWD'...\"\n swiftlint\nelse\n echo \"😱 Error: 'swiftlint' is not installed! Please install it via 'brew install swiftlint'!\" >&2\n exit 1\nfi\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -2137,11 +2121,6 @@ target = 0A7B505620B72192005A08E7 /* DummyHostApp */; targetProxy = 0A90866D217767B200E76280 /* PBXContainerItemProxy */; }; - F12FB1BE20A6E89E00AA3A52 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = F12FB1B920A6E88F00AA3A52 /* SwiftLint */; - targetProxy = F12FB1BD20A6E89E00AA3A52 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -2299,13 +2278,16 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -2327,6 +2309,8 @@ "@loader_path/Frameworks", ); MARKETING_VERSION = 0.18.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = com.mindera.Alicerce; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2361,14 +2345,17 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -2385,6 +2372,8 @@ "@loader_path/Frameworks", ); MARKETING_VERSION = 0.18.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = com.mindera.Alicerce; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2555,25 +2544,6 @@ }; name = Release; }; - 9708743C219EEC9700264EE3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - PRODUCT_NAME = SwiftLint; - }; - name = Debug; - }; - 9708743D219EEC9700264EE3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - PRODUCT_NAME = SwiftLint; - }; - name = Release; - }; OBJ_3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2602,6 +2572,7 @@ ENABLE_NS_ASSERTIONS = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_TREAT_WARNINGS_AS_ERRORS = YES; @@ -2650,6 +2621,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = s; GCC_TREAT_WARNINGS_AS_ERRORS = YES; @@ -2662,6 +2634,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; WARNING_CFLAGS = ( @@ -2710,15 +2683,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - 9708743F219F086000264EE3 /* Build configuration list for PBXAggregateTarget "SwiftLint" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9708743C219EEC9700264EE3 /* Debug */, - 9708743D219EEC9700264EE3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; OBJ_2 /* Build configuration list for PBXProject "Alicerce" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Alicerce.xcodeproj/xcshareddata/xcschemes/Alicerce.xcscheme b/Alicerce.xcodeproj/xcshareddata/xcschemes/Alicerce.xcscheme index 64fd59cc..270b5c66 100644 --- a/Alicerce.xcodeproj/xcshareddata/xcschemes/Alicerce.xcscheme +++ b/Alicerce.xcodeproj/xcshareddata/xcschemes/Alicerce.xcscheme @@ -1,6 +1,6 @@ Swift.Void) { super.init() diff --git a/Tests/AlicerceTests/DeepLinking/Route+TrieRouter_RouteTests.swift b/Tests/AlicerceTests/DeepLinking/Route+TrieRouter_RouteTests.swift index 8475c8fb..b2468ac8 100644 --- a/Tests/AlicerceTests/DeepLinking/Route+TrieRouter_RouteTests.swift +++ b/Tests/AlicerceTests/DeepLinking/Route+TrieRouter_RouteTests.swift @@ -12,6 +12,12 @@ class Route_TrieRouter_RouteTests: XCTestCase { // MARK: - failure func testRoute_WithInvalidRouteURL_ShouldFail() { + guard #unavailable(iOS 17, macOS 14) else { + // Since iOS 17, macOS 14 that both `URL` and `URLComponents` conform to RFC 3986, so we can't create a + // `URL` that would fail to create a `URLComponents` (triggering the `.invalidRoute(.invalidURL)` error). + // https://stackoverflow.com/a/55627352/1921751 + return + } let router = TestRouter() diff --git a/script/carthage.sh b/script/carthage.sh index 967e0402..410255f2 100755 --- a/script/carthage.sh +++ b/script/carthage.sh @@ -14,7 +14,7 @@ trap 'rm -f "$xcconfig"' INT TERM HUP EXIT # For Xcode 12+ make sure EXCLUDED_ARCHS is set to arm architectures otherwise # the build will fail on lipo due to duplicate architectures. -XCODE_VERSION_MAJ=1400 # should mirror XCODE_VERSION_MAJOR - update accordingly +XCODE_VERSION_MAJ=1500 # should mirror XCODE_VERSION_MAJOR - update accordingly echo "EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_${XCODE_VERSION_MAJ} = arm64 arm64e armv7 armv7s armv6 armv8" >> $xcconfig echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig