From 12a407c52d775ba508992bb62ef1bc71cea5c216 Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Tue, 13 Jan 2026 17:25:14 -0500 Subject: [PATCH] fix: switch bug --- .manage_sparkle.py | 96 ++- Gaze.xcodeproj/project.pbxproj | 14 +- Gaze.xcodeproj/project.pbxproj.bak | 646 ++++++++++++++++++ .../xcshareddata/swiftpm/Package.resolved | 29 +- Gaze/Gaze.entitlements | 5 + Gaze/Info.plist | 10 + switch_to | 73 +- 7 files changed, 783 insertions(+), 90 deletions(-) create mode 100644 Gaze.xcodeproj/project.pbxproj.bak diff --git a/.manage_sparkle.py b/.manage_sparkle.py index 71cd05d..7ccf243 100755 --- a/.manage_sparkle.py +++ b/.manage_sparkle.py @@ -31,12 +31,12 @@ def remove_sparkle(pbxproj_path): # Remove PBXBuildFile section for Sparkle content = re.sub(r'\t\t27SPARKLE\d+ /\* Sparkle in Frameworks \*/ = \{isa = PBXBuildFile; productRef = 27SPARKLE\d+ /\* Sparkle \*/; \};\n', '', content) - # Remove XCRemoteSwiftPackageReference section (multi-line) - pattern = r'\t\t27SPARKLE\d+ /\* XCRemoteSwiftPackageReference "Sparkle" \*/ = \{\n.*?\n\t\t\};\n' + # Remove XCRemoteSwiftPackageReference section (multi-line) - more flexible pattern + pattern = r'\t\t27SPARKLE\d+ /\* XCRemoteSwiftPackageReference "Sparkle" \*/ = \{[^}]+\};\n' content = re.sub(pattern, '', content, flags=re.DOTALL) - # Remove XCSwiftPackageProductDependency section (multi-line) - pattern = r'\t\t27SPARKLE\d+ /\* XCSwiftPackageProductDependency "Sparkle" \*/ = \{\n.*?\n\t\t\};\n' + # Remove XCSwiftPackageProductDependency section (multi-line) - match "Sparkle" comment not "XCSwiftPackageProductDependency" + pattern = r'\t\t27SPARKLE\d+ /\* Sparkle \*/ = \{[^}]+\};\n' content = re.sub(pattern, '', content, flags=re.DOTALL) with open(pbxproj_path, 'w') as f: @@ -51,32 +51,64 @@ def add_sparkle(pbxproj_path): with open(pbxproj_path, 'r') as f: content = f.read() - # Check if Sparkle already exists - if 'Sparkle' in content: - print("ℹ Sparkle already in project") + # Check if Sparkle package reference already fully exists (should have 9 references like Lottie) + sparkle_count = content.count('Sparkle') + if sparkle_count >= 9 and f'{PKG_REF_ID} /* XCRemoteSwiftPackageReference "Sparkle" */ =' in content: + print("ℹ Sparkle already fully configured in project") return True + # Check if partial Sparkle exists and clean it up first + if 'Sparkle' in content: + print("ℹ Cleaning up partial Sparkle references...") + content = re.sub(r'\t\t27SPARKLE\d+ /\* XCRemoteSwiftPackageReference "Sparkle" \*/,\n', '', content) + content = re.sub(r'\t\t\t\t27SPARKLE\d+ /\* Sparkle \*/,\n', '', content) + content = re.sub(r'\t\t\t\t27SPARKLE\d+ /\* Sparkle in Frameworks \*/,\n', '', content) + content = re.sub(r'\t\t27SPARKLE\d+ /\* Sparkle in Frameworks \*/ = \{isa = PBXBuildFile; productRef = 27SPARKLE\d+ /\* Sparkle \*/; \};\n', '', content) + pattern = r'\t\t27SPARKLE\d+ /\* XCRemoteSwiftPackageReference "Sparkle" \*/ = \{[^}]+\};\n' + content = re.sub(pattern, '', content, flags=re.DOTALL) + pattern = r'\t\t27SPARKLE\d+ /\* Sparkle \*/ = \{[^}]+\};\n' + content = re.sub(pattern, '', content, flags=re.DOTALL) + # Write cleaned content back + with open(pbxproj_path, 'w') as f: + f.write(content) + print("✓ Cleaned up partial Sparkle references") + # Re-read for adding fresh references + with open(pbxproj_path, 'r') as f: + content = f.read() + # 1. Add PBXBuildFile for Sparkle (after Lottie, before End section) pattern = r'(\t\t275915892F132A9200D0E60D /\* Lottie in Frameworks \*/ = \{isa = PBXBuildFile; productRef = 27AE10B12F10B1FC00E00DBC /\* Lottie \*/; \};\n)(/\* End PBXBuildFile section \*/)' - replacement = r'\1\t\t' + BUILD_FILE_ID + r' /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = ' + PKG_PROD_ID + r' /* Sparkle */; };' + '\n' + r'\2' - content = re.sub(pattern, replacement, content) + if re.search(pattern, content): + replacement = r'\1\t\t' + BUILD_FILE_ID + r' /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = ' + PKG_PROD_ID + r' /* Sparkle */; };' + '\n' + r'\2' + content = re.sub(pattern, replacement, content) + else: + print("⚠ Warning: Could not find PBXBuildFile insertion point") # 2. Add Sparkle to Frameworks build phase (after Lottie) pattern = r'(\t\t\t\t275915892F132A9200D0E60D /\* Lottie in Frameworks \*/,\n)' - replacement = r'\1\t\t\t\t' + BUILD_FILE_ID + r' /* Sparkle in Frameworks */,' + '\n' - content = re.sub(pattern, replacement, content) + if re.search(pattern, content): + replacement = r'\1\t\t\t\t' + BUILD_FILE_ID + r' /* Sparkle in Frameworks */,' + '\n' + content = re.sub(pattern, replacement, content) + else: + print("⚠ Warning: Could not find Frameworks build phase insertion point") # 3. Add Sparkle to packageProductDependencies (after Lottie) pattern = r'(packageProductDependencies = \(\n\t\t\t\t27AE10B12F10B1FC00E00DBC /\* Lottie \*/,\n)' - replacement = r'\1\t\t\t\t' + PKG_PROD_ID + r' /* Sparkle */,' + '\n' - content = re.sub(pattern, replacement, content) + if re.search(pattern, content): + replacement = r'\1\t\t\t\t' + PKG_PROD_ID + r' /* Sparkle */,' + '\n' + content = re.sub(pattern, replacement, content) + else: + print("⚠ Warning: Could not find packageProductDependencies insertion point") # 4. Add Sparkle to packageReferences (after Lottie) pattern = r'(packageReferences = \(\n\t\t\t\t27AE10B02F10B1FC00E00DBC /\* XCRemoteSwiftPackageReference "lottie-spm" \*/,\n)' - replacement = r'\1\t\t\t\t' + PKG_REF_ID + r' /* XCRemoteSwiftPackageReference "Sparkle" */,' + '\n' - content = re.sub(pattern, replacement, content) + if re.search(pattern, content): + replacement = r'\1\t\t\t\t' + PKG_REF_ID + r' /* XCRemoteSwiftPackageReference "Sparkle" */,' + '\n' + content = re.sub(pattern, replacement, content) + else: + print("⚠ Warning: Could not find packageReferences insertion point") - # 5. Add XCRemoteSwiftPackageReference section (before End section) + # 5. Add XCRemoteSwiftPackageReference section (after Lottie entry, before End section) sparkle_ref = f'''\t\t{PKG_REF_ID} /* XCRemoteSwiftPackageReference "Sparkle" */ = {{ \t\t\tisa = XCRemoteSwiftPackageReference; \t\t\trepositoryURL = "{SPARKLE_REPO}"; @@ -86,20 +118,36 @@ def add_sparkle(pbxproj_path): \t\t\t}}; \t\t}}; ''' - pattern = r'(/\* End XCRemoteSwiftPackageReference section \*/)' - replacement = sparkle_ref + r'\1' - content = re.sub(pattern, replacement, content) + # Insert after the Lottie package reference + pattern = r'(\t\t27AE10B02F10B1FC00E00DBC /\* XCRemoteSwiftPackageReference "lottie-spm" \*/ = \{\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = "https://github\.com/airbnb/lottie-spm\.git";\n\t\t\trequirement = \{\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = [^;]+;\n\t\t\t\};\n\t\t\};\n)' + if re.search(pattern, content): + replacement = r'\1' + sparkle_ref + content = re.sub(pattern, replacement, content) + else: + print("⚠ Warning: Could not find XCRemoteSwiftPackageReference insertion point, trying fallback") + # Fallback: insert before End section + pattern = r'(/\* End XCRemoteSwiftPackageReference section \*/)' + replacement = sparkle_ref + r'\1' + content = re.sub(pattern, replacement, content) - # 6. Add XCSwiftPackageProductDependency section (before End section) - sparkle_prod = f'''\t\t{PKG_PROD_ID} /* XCSwiftPackageProductDependency "Sparkle" */ = {{ + # 6. Add XCSwiftPackageProductDependency section (after Lottie entry, before End section) + sparkle_prod = f'''\t\t{PKG_PROD_ID} /* Sparkle */ = {{ \t\t\tisa = XCSwiftPackageProductDependency; \t\t\tpackage = {PKG_REF_ID} /* XCRemoteSwiftPackageReference "Sparkle" */; \t\t\tproductName = Sparkle; \t\t}}; ''' - pattern = r'(/\* End XCSwiftPackageProductDependency section \*/)' - replacement = sparkle_prod + r'\1' - content = re.sub(pattern, replacement, content) + # Insert after the Lottie product dependency + pattern = r'(\t\t27AE10B12F10B1FC00E00DBC /\* Lottie \*/ = \{\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 27AE10B02F10B1FC00E00DBC /\* XCRemoteSwiftPackageReference "lottie-spm" \*/;\n\t\t\tproductName = Lottie;\n\t\t\};\n)' + if re.search(pattern, content): + replacement = r'\1' + sparkle_prod + content = re.sub(pattern, replacement, content) + else: + print("⚠ Warning: Could not find XCSwiftPackageProductDependency insertion point, trying fallback") + # Fallback: insert before End section + pattern = r'(/\* End XCSwiftPackageProductDependency section \*/)' + replacement = sparkle_prod + r'\1' + content = re.sub(pattern, replacement, content) with open(pbxproj_path, 'w') as f: f.write(content) diff --git a/Gaze.xcodeproj/project.pbxproj b/Gaze.xcodeproj/project.pbxproj index 83d90be..df1fed8 100644 --- a/Gaze.xcodeproj/project.pbxproj +++ b/Gaze.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 275915892F132A9200D0E60D /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 27AE10B12F10B1FC00E00DBC /* Lottie */; }; + 27SPARKLE00000000003 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 27SPARKLE00000000002 /* Sparkle */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -70,6 +71,7 @@ buildActionMask = 2147483647; files = ( 275915892F132A9200D0E60D /* Lottie in Frameworks */, + 27SPARKLE00000000003 /* Sparkle in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -131,6 +133,7 @@ name = Gaze; packageProductDependencies = ( 27AE10B12F10B1FC00E00DBC /* Lottie */, + 27SPARKLE00000000002 /* Sparkle */, ); productName = Gaze; productReference = 27A21B3C2F0F69DC0018C4F3 /* Gaze.app */; @@ -216,6 +219,7 @@ minimizedProjectReferenceProxies = 1; packageReferences = ( 27AE10B02F10B1FC00E00DBC /* XCRemoteSwiftPackageReference "lottie-spm" */, + 27SPARKLE00000000001 /* XCRemoteSwiftPackageReference "Sparkle" */, ); preferredProjectObjectVersion = 77; productRefGroup = 27A21B3D2F0F69DC0018C4F3 /* Products */; @@ -435,7 +439,6 @@ ); MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 0.4.0; - OTHER_SWIFT_FLAGS = "-D APPSTORE"; PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.Gaze; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -472,7 +475,6 @@ ); MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 0.4.0; - OTHER_SWIFT_FLAGS = "-D APPSTORE"; PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.Gaze; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -615,6 +617,14 @@ minimumVersion = 4.6.0; }; }; + 27SPARKLE00000000001 /* XCRemoteSwiftPackageReference "Sparkle" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sparkle-project/Sparkle"; + requirement = { + kind = exactVersion; + version = 2.8.1; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ diff --git a/Gaze.xcodeproj/project.pbxproj.bak b/Gaze.xcodeproj/project.pbxproj.bak new file mode 100644 index 0000000..58d7918 --- /dev/null +++ b/Gaze.xcodeproj/project.pbxproj.bak @@ -0,0 +1,646 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 275915892F132A9200D0E60D /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 27AE10B12F10B1FC00E00DBC /* Lottie */; }; + 27SPARKLE00000000003 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 27SPARKLE00000000002 /* Sparkle */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 27A21B4A2F0F69DD0018C4F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 27A21B342F0F69DC0018C4F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 27A21B3B2F0F69DC0018C4F3; + remoteInfo = Gaze; + }; + 27A21B542F0F69DD0018C4F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 27A21B342F0F69DC0018C4F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 27A21B3B2F0F69DC0018C4F3; + remoteInfo = Gaze; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 27A21B3C2F0F69DC0018C4F3 /* Gaze.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Gaze.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 27A21B492F0F69DD0018C4F3 /* GazeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GazeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 27A21B532F0F69DD0018C4F3 /* GazeUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GazeUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 270D22E92F1474F1008BCE42 /* Exceptions for "Gaze" folder in "Gaze" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 27A21B3B2F0F69DC0018C4F3 /* Gaze */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 27A21B3E2F0F69DC0018C4F3 /* Gaze */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 270D22E92F1474F1008BCE42 /* Exceptions for "Gaze" folder in "Gaze" target */, + ); + path = Gaze; + sourceTree = ""; + }; + 27A21B4C2F0F69DD0018C4F3 /* GazeTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = GazeTests; + sourceTree = ""; + }; + 27A21B562F0F69DD0018C4F3 /* GazeUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = GazeUITests; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 27A21B392F0F69DC0018C4F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 275915892F132A9200D0E60D /* Lottie in Frameworks */, + 27SPARKLE00000000003 /* Sparkle in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 27A21B462F0F69DD0018C4F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 27A21B502F0F69DD0018C4F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 27A21B332F0F69DC0018C4F3 = { + isa = PBXGroup; + children = ( + 27A21B3E2F0F69DC0018C4F3 /* Gaze */, + 27A21B4C2F0F69DD0018C4F3 /* GazeTests */, + 27A21B562F0F69DD0018C4F3 /* GazeUITests */, + 27A21B3D2F0F69DC0018C4F3 /* Products */, + ); + sourceTree = ""; + }; + 27A21B3D2F0F69DC0018C4F3 /* Products */ = { + isa = PBXGroup; + children = ( + 27A21B3C2F0F69DC0018C4F3 /* Gaze.app */, + 27A21B492F0F69DD0018C4F3 /* GazeTests.xctest */, + 27A21B532F0F69DD0018C4F3 /* GazeUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 27A21B3B2F0F69DC0018C4F3 /* Gaze */ = { + isa = PBXNativeTarget; + buildConfigurationList = 27A21B5D2F0F69DD0018C4F3 /* Build configuration list for PBXNativeTarget "Gaze" */; + buildPhases = ( + 27A21B382F0F69DC0018C4F3 /* Sources */, + 27A21B392F0F69DC0018C4F3 /* Frameworks */, + 27A21B3A2F0F69DC0018C4F3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 27A21B3E2F0F69DC0018C4F3 /* Gaze */, + ); + name = Gaze; + packageProductDependencies = ( + 27AE10B12F10B1FC00E00DBC /* Lottie */, + 27SPARKLE00000000002 /* Sparkle */, + ); + productName = Gaze; + productReference = 27A21B3C2F0F69DC0018C4F3 /* Gaze.app */; + productType = "com.apple.product-type.application"; + }; + 27A21B482F0F69DD0018C4F3 /* GazeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 27A21B602F0F69DD0018C4F3 /* Build configuration list for PBXNativeTarget "GazeTests" */; + buildPhases = ( + 27A21B452F0F69DD0018C4F3 /* Sources */, + 27A21B462F0F69DD0018C4F3 /* Frameworks */, + 27A21B472F0F69DD0018C4F3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 27A21B4B2F0F69DD0018C4F3 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 27A21B4C2F0F69DD0018C4F3 /* GazeTests */, + ); + name = GazeTests; + packageProductDependencies = ( + ); + productName = GazeTests; + productReference = 27A21B492F0F69DD0018C4F3 /* GazeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 27A21B522F0F69DD0018C4F3 /* GazeUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 27A21B632F0F69DD0018C4F3 /* Build configuration list for PBXNativeTarget "GazeUITests" */; + buildPhases = ( + 27A21B4F2F0F69DD0018C4F3 /* Sources */, + 27A21B502F0F69DD0018C4F3 /* Frameworks */, + 27A21B512F0F69DD0018C4F3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 27A21B552F0F69DD0018C4F3 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 27A21B562F0F69DD0018C4F3 /* GazeUITests */, + ); + name = GazeUITests; + packageProductDependencies = ( + ); + productName = GazeUITests; + productReference = 27A21B532F0F69DD0018C4F3 /* GazeUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 27A21B342F0F69DC0018C4F3 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2620; + LastUpgradeCheck = 2620; + TargetAttributes = { + 27A21B3B2F0F69DC0018C4F3 = { + CreatedOnToolsVersion = 26.2; + }; + 27A21B482F0F69DD0018C4F3 = { + CreatedOnToolsVersion = 26.2; + TestTargetID = 27A21B3B2F0F69DC0018C4F3; + }; + 27A21B522F0F69DD0018C4F3 = { + CreatedOnToolsVersion = 26.2; + TestTargetID = 27A21B3B2F0F69DC0018C4F3; + }; + }; + }; + buildConfigurationList = 27A21B372F0F69DC0018C4F3 /* Build configuration list for PBXProject "Gaze" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 27A21B332F0F69DC0018C4F3; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 27AE10B02F10B1FC00E00DBC /* XCRemoteSwiftPackageReference "lottie-spm" */, + 27SPARKLE00000000001 /* XCRemoteSwiftPackageReference "Sparkle" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 27A21B3D2F0F69DC0018C4F3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 27A21B3B2F0F69DC0018C4F3 /* Gaze */, + 27A21B482F0F69DD0018C4F3 /* GazeTests */, + 27A21B522F0F69DD0018C4F3 /* GazeUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 27A21B3A2F0F69DC0018C4F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 27A21B472F0F69DD0018C4F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 27A21B512F0F69DD0018C4F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 27A21B382F0F69DC0018C4F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 27A21B452F0F69DD0018C4F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 27A21B4F2F0F69DD0018C4F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 27A21B4B2F0F69DD0018C4F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 27A21B3B2F0F69DC0018C4F3 /* Gaze */; + targetProxy = 27A21B4A2F0F69DD0018C4F3 /* PBXContainerItemProxy */; + }; + 27A21B552F0F69DD0018C4F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 27A21B3B2F0F69DC0018C4F3 /* Gaze */; + targetProxy = 27A21B542F0F69DD0018C4F3 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 27A21B5B2F0F69DD0018C4F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + 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; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 6GK4F9L62V; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 26.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 27A21B5C2F0F69DD0018C4F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + 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; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 6GK4F9L62V; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 26.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 27A21B5E2F0F69DD0018C4F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = Gaze; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = Gaze/Gaze.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 8; + DEVELOPMENT_TEAM = 6GK4F9L62V; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Gaze/Info.plist; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 0.4.0; + OTHER_SWIFT_FLAGS = "-D APPSTORE"; + PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.Gaze; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 27A21B5F2F0F69DD0018C4F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = Gaze; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = Gaze/Gaze.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 8; + DEVELOPMENT_TEAM = 6GK4F9L62V; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Gaze/Info.plist; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 0.4.0; + OTHER_SWIFT_FLAGS = "-D APPSTORE"; + PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.Gaze; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 27A21B612F0F69DD0018C4F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 6; + DEVELOPMENT_TEAM = 6GK4F9L62V; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 26.2; + MARKETING_VERSION = 0.4.0; + PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.GazeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Gaze.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Gaze"; + }; + name = Debug; + }; + 27A21B622F0F69DD0018C4F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 6; + DEVELOPMENT_TEAM = 6GK4F9L62V; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 26.2; + MARKETING_VERSION = 0.4.0; + PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.GazeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Gaze.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Gaze"; + }; + name = Release; + }; + 27A21B642F0F69DD0018C4F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 6; + DEVELOPMENT_TEAM = 6GK4F9L62V; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 0.4.0; + PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.GazeUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = Gaze; + }; + name = Debug; + }; + 27A21B652F0F69DD0018C4F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 6; + DEVELOPMENT_TEAM = 6GK4F9L62V; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 0.4.0; + PRODUCT_BUNDLE_IDENTIFIER = com.mikefreno.GazeUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = Gaze; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 27A21B372F0F69DC0018C4F3 /* Build configuration list for PBXProject "Gaze" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 27A21B5B2F0F69DD0018C4F3 /* Debug */, + 27A21B5C2F0F69DD0018C4F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 27A21B5D2F0F69DD0018C4F3 /* Build configuration list for PBXNativeTarget "Gaze" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 27A21B5E2F0F69DD0018C4F3 /* Debug */, + 27A21B5F2F0F69DD0018C4F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 27A21B602F0F69DD0018C4F3 /* Build configuration list for PBXNativeTarget "GazeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 27A21B612F0F69DD0018C4F3 /* Debug */, + 27A21B622F0F69DD0018C4F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 27A21B632F0F69DD0018C4F3 /* Build configuration list for PBXNativeTarget "GazeUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 27A21B642F0F69DD0018C4F3 /* Debug */, + 27A21B652F0F69DD0018C4F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 27AE10B02F10B1FC00E00DBC /* XCRemoteSwiftPackageReference "lottie-spm" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/airbnb/lottie-spm.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.6.0; + }; + }; + 27SPARKLE00000000001 /* XCRemoteSwiftPackageReference "Sparkle" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sparkle-project/Sparkle"; + requirement = { + kind = exactVersion; + version = 2.8.1; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 27AE10B12F10B1FC00E00DBC /* Lottie */ = { + isa = XCSwiftPackageProductDependency; + package = 27AE10B02F10B1FC00E00DBC /* XCRemoteSwiftPackageReference "lottie-spm" */; + productName = Lottie; + }; + 27SPARKLE00000000002 /* Sparkle */ = { + isa = XCSwiftPackageProductDependency; + package = 27SPARKLE00000000001 /* XCRemoteSwiftPackageReference "Sparkle" */; + productName = Sparkle; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 27A21B342F0F69DC0018C4F3 /* Project object */; +} diff --git a/Gaze.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Gaze.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 726a161..b3cf5c5 100644 --- a/Gaze.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Gaze.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,15 +1,24 @@ { - "originHash": "513d974fbede884a919977d3446360023f6e3239ac314f4fbd9657e80aca7560", - "pins": [ + "originHash" : "513d974fbede884a919977d3446360023f6e3239ac314f4fbd9657e80aca7560", + "pins" : [ { - "identity": "lottie-spm", - "kind": "remoteSourceControl", - "location": "https://github.com/airbnb/lottie-spm.git", - "state": { - "revision": "69faaefa7721fba9e434a52c16adf4329c9084db", - "version": "4.6.0" + "identity" : "lottie-spm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-spm.git", + "state" : { + "revision" : "69faaefa7721fba9e434a52c16adf4329c9084db", + "version" : "4.6.0" + } + }, + { + "identity" : "sparkle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sparkle-project/Sparkle", + "state" : { + "revision" : "5581748cef2bae787496fe6d61139aebe0a451f6", + "version" : "2.8.1" } } ], - "version": 3 -} \ No newline at end of file + "version" : 3 +} diff --git a/Gaze/Gaze.entitlements b/Gaze/Gaze.entitlements index ee95ab7..4a6c209 100644 --- a/Gaze/Gaze.entitlements +++ b/Gaze/Gaze.entitlements @@ -6,5 +6,10 @@ com.apple.security.network.client + com.apple.security.temporary-exception.mach-lookup.global-name + + $(PRODUCT_BUNDLE_IDENTIFIER)-spks + $(PRODUCT_BUNDLE_IDENTIFIER)-spki + diff --git a/Gaze/Info.plist b/Gaze/Info.plist index 4b71fcf..3851b18 100644 --- a/Gaze/Info.plist +++ b/Gaze/Info.plist @@ -22,5 +22,15 @@ $(MARKETING_VERSION) NSHumanReadableCopyright Copyright © 2026 Mike Freno. All rights reserved. + SUPublicEDKey + Z2RmohI1y2bgeGQQUDqO9F0HNF2AzFotOt8CwGB6VJM= + SUFeedURL + https://freno.me/api/Gaze/appcast.xml + SUEnableAutomaticChecks + + SUScheduledCheckInterval + 86400 + SUEnableInstallerLauncherService + diff --git a/switch_to b/switch_to index 3e99043..d215ca7 100755 --- a/switch_to +++ b/switch_to @@ -107,76 +107,37 @@ except Exception as e: add_sparkle_package() { print_info "Adding Sparkle package dependency..." - # Check if Sparkle already exists - if has_sparkle_package || grep -q "Sparkle" "${PROJECT_FILE}"; then - print_info "Sparkle already present" + # Check if Sparkle package reference already fully exists (9 references like Lottie) + local sparkle_count=$(grep -c "Sparkle" "${PROJECT_FILE}" 2>/dev/null || echo "0") + sparkle_count=$(echo "$sparkle_count" | tr -d '[:space:]') + if [ "$sparkle_count" -ge 9 ]; then + print_info "Sparkle already fully configured" return 0 fi # Backup project file cp "${PROJECT_FILE}" "${PROJECT_FILE}.backup" - # Add Sparkle to Package.resolved - if [ ! -f "${PACKAGE_RESOLVED}" ]; then - # Create Package.resolved if it doesn't exist - mkdir -p "$(dirname "${PACKAGE_RESOLVED}")" - cat > "${PACKAGE_RESOLVED}" << 'EOF' -{ - "originHash" : "6b3386dc9ff1f3a74f1534de9c41d47137eae0901cfe819ed442f1b241549359", - "pins" : [ - { - "identity" : "lottie-spm", - "kind" : "remoteSourceControl", - "location" : "https://github.com/airbnb/lottie-spm.git", - "state" : { - "revision" : "69faaefa7721fba9e434a52c16adf4329c9084db", - "version" : "4.6.0" - } - } - ], - "version" : 3 -} -EOF - fi - - python3 -c " + # Remove any partial Sparkle from Package.resolved if it exists (Xcode will resolve it fresh) + if [ -f "${PACKAGE_RESOLVED}" ] && has_sparkle_package; then + python3 -c " import json try: with open('${PACKAGE_RESOLVED}', 'r') as f: data = json.load(f) - # Add Sparkle to pins if not present - # Note: We let Xcode resolve the actual revision - sparkle_pin = { - 'identity': 'sparkle', - 'kind': 'remoteSourceControl', - 'location': '${SPARKLE_REPO}', - 'state': { - 'version': '${SPARKLE_VERSION}' - } - } - - if 'pins' not in data: - data['pins'] = [] - - # Check if Sparkle already in pins - if not any(pin.get('identity', '').lower() == 'sparkle' for pin in data['pins']): - data['pins'].append(sparkle_pin) - data['pins'].sort(key=lambda x: x.get('identity', '')) + # Filter out Sparkle from pins - Xcode will resolve it fresh + if 'pins' in data: + data['pins'] = [pin for pin in data['pins'] if 'sparkle' not in pin.get('identity', '').lower()] with open('${PACKAGE_RESOLVED}', 'w') as f: json.dump(data, f, indent=2) - print('✓ Updated Package.resolved') + print('✓ Cleaned Package.resolved (Xcode will resolve Sparkle)') except Exception as e: - print(f'Error: {e}', file=sys.stderr) - sys.exit(1) + print(f'Warning: {e}', file=sys.stderr) " - if [ $? -ne 0 ]; then - print_error "Failed to update Package.resolved" - mv "${PROJECT_FILE}.backup" "${PROJECT_FILE}" - return 1 fi # Use Python script to safely add Sparkle to project.pbxproj @@ -452,9 +413,13 @@ switch_to_self() { print_success "Switched to self-distribution mode" print_info "Sparkle auto-updates enabled" - if ! has_sparkle_package; then + # Check if Sparkle was added to project.pbxproj (not Package.resolved since Xcode will resolve it) + if ! grep -q "Sparkle" "${PROJECT_FILE}"; then echo "" - print_warning "⚠️Sparkle not successfully added!" + print_warning "⚠️ Sparkle not successfully added to project!" + else + echo "" + print_info "Sparkle package will be resolved on next build" fi }