← All repositories

listless

A simple list app for Apple platforms

git clone https://code.inqk.net/listless.git


commit 1b7c88e2967780908c44906a515f6d7b42d84218
parent 5a2ce38e4f7d9d08615ef1d1b92c668ee95d5c14
Author: Michael Camilleri <[email protected]>
Date:   Fri, 27 Feb 2026 20:29:36 +0900

Improve build number generation

Diffstat

M.gitignore | 1+
MListless.xcodeproj/project.pbxproj | 71++++++++++++++++++++++-------------------------------------------------
MListless.xcodeproj/xcshareddata/xcschemes/Listless iOS.xcscheme | 18++++++++++++++++++
MListless.xcodeproj/xcshareddata/xcschemes/Listless macOS.xcscheme | 20+++++++++++++++++++-
MListlessMac/Info.plist | 2+-
MListlessiOS/Info.plist | 2+-
Mproject.yml | 42+++++++++++++++++++++++++-----------------

7 files changed, 87 insertions(+), 69 deletions(-)

diff --git a/.gitignore b/.gitignore

@@ -3,6 +3,7 @@
 .cache/
 .DS_Store
 CLAUDE.md
+Generated/
 examples/
 notes/
 symlinks/

diff --git a/Listless.xcodeproj/project.pbxproj b/Listless.xcodeproj/project.pbxproj

@@ -129,6 +129,7 @@
 		CB43816B8E7F083A2AD07F28 /* TaskListView+Toolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TaskListView+Toolbar.swift"; sourceTree = "<group>"; };
 		D2C018476BD91B73870244B9 /* TaskListViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskListViewProtocol.swift; sourceTree = "<group>"; };
 		D2D9CDDA8913CD116FB4DA74 /* TaskListView+PullGestures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TaskListView+PullGestures.swift"; sourceTree = "<group>"; };
+		D43D37CE25806380C0B13466 /* BuildNumber.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = BuildNumber.xcconfig; sourceTree = "<group>"; };
 		D57C3CC81C4380EFAE4DB910 /* TaskRowDragGesture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskRowDragGesture.swift; sourceTree = "<group>"; };
 		D640E7D21735C62A30A26DA4 /* ClickableTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClickableTextField.swift; sourceTree = "<group>"; };
 		DC3DEE364304587D280C5672 /* TaskStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskStore.swift; sourceTree = "<group>"; };
@@ -181,6 +182,14 @@
 			path = Helpers;
 			sourceTree = "<group>";
 		};
+		51F881290E7FBA2684458F80 /* Generated */ = {
+			isa = PBXGroup;
+			children = (
+				D43D37CE25806380C0B13466 /* BuildNumber.xcconfig */,
+			);
+			path = Generated;
+			sourceTree = "<group>";
+		};
 		58051CBDE2390F9E13647235 /* Listless */ = {
 			isa = PBXGroup;
 			children = (
@@ -307,6 +316,7 @@
 			isa = PBXGroup;
 			children = (
 				9404C09EE1A4D91DFF338464 /* Media.xcassets */,
+				51F881290E7FBA2684458F80 /* Generated */,
 				58051CBDE2390F9E13647235 /* Listless */,
 				954AAB8DDFF6E6D6FD6A0A2C /* ListlessiOS */,
 				D5B197AFF26144948D032299 /* ListlessMac */,
@@ -347,7 +357,6 @@
 			buildPhases = (
 				409D108909CBEC2F69B56D0E /* Sources */,
 				6BCB6F65428622E5AA66936D /* Resources */,
-				AB71BC51B745C8453D165362 /* Set Build Number */,
 			);
 			buildRules = (
 			);
@@ -366,7 +375,6 @@
 			buildPhases = (
 				67F773566AF3BC117AA393B9 /* Sources */,
 				EC5CE716D5948EC163595BF2 /* Resources */,
-				2AF6CF799FE78291393A6F88 /* Set Build Number */,
 			);
 			buildRules = (
 			);
@@ -460,47 +468,6 @@
 		};
 /* End PBXResourcesBuildPhase section */
 
-/* Begin PBXShellScriptBuildPhase section */
-		2AF6CF799FE78291393A6F88 /* Set Build Number */ = {
-			isa = PBXShellScriptBuildPhase;
-			alwaysOutOfDate = 1;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Set Build Number";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "buildYear=`xcrun git log -1 --format=%cd --date=format:%Y`\nbuildVersion=`xcrun git rev-list HEAD | wc -l | tr -d ' '`\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $buildYear.$buildVersion\" \"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\n";
-		};
-		AB71BC51B745C8453D165362 /* Set Build Number */ = {
-			isa = PBXShellScriptBuildPhase;
-			alwaysOutOfDate = 1;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Set Build Number";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "buildYear=`xcrun git log -1 --format=%cd --date=format:%Y`\nbuildVersion=`xcrun git rev-list HEAD | wc -l | tr -d ' '`\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $buildYear.$buildVersion\" \"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\n";
-		};
-/* End PBXShellScriptBuildPhase section */
-
 /* Begin PBXSourcesBuildPhase section */
 		409D108909CBEC2F69B56D0E /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
@@ -600,7 +567,6 @@
 				CODE_SIGN_ENTITLEMENTS = ListlessMac/Listless.entitlements;
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
-				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				INFOPLIST_FILE = ListlessMac/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
@@ -619,7 +585,6 @@
 				CODE_SIGN_ENTITLEMENTS = ListlessMac/Listless.entitlements;
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
-				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				INFOPLIST_FILE = ListlessMac/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
@@ -633,8 +598,10 @@
 		};
 		AF0B2590EF824F9C4CDDFCCB /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = D43D37CE25806380C0B13466 /* BuildNumber.xcconfig */;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOL_EXTENSIONS = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -665,9 +632,12 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -682,6 +652,7 @@
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_EMIT_LOC_STRINGS = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-O";
 				SWIFT_VERSION = 6;
 			};
@@ -692,7 +663,6 @@
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				GENERATE_INFOPLIST_FILE = YES;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
@@ -708,8 +678,10 @@
 		};
 		D1B900A3E25ED5B39F0D9716 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = D43D37CE25806380C0B13466 /* BuildNumber.xcconfig */;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOL_EXTENSIONS = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -740,9 +712,12 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
 				DEBUG_INFORMATION_FORMAT = dwarf;
+				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_NO_COMMON_BLOCKS = YES;
@@ -764,6 +739,7 @@
 				ONLY_ACTIVE_ARCH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_EMIT_LOC_STRINGS = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 6;
 			};
@@ -776,7 +752,6 @@
 				CODE_SIGN_ENTITLEMENTS = ListlessiOS/Listless.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				INFOPLIST_FILE = ListlessiOS/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
@@ -793,7 +768,6 @@
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				GENERATE_INFOPLIST_FILE = YES;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
@@ -814,7 +788,6 @@
 				CODE_SIGN_ENTITLEMENTS = ListlessiOS/Listless.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 7TD7PZBNXP;
 				INFOPLIST_FILE = ListlessiOS/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",

diff --git a/Listless.xcodeproj/xcshareddata/xcschemes/Listless iOS.xcscheme b/Listless.xcodeproj/xcshareddata/xcschemes/Listless iOS.xcscheme

@@ -6,6 +6,24 @@
       parallelizeBuildables = "YES"
       buildImplicitDependencies = "YES"
       runPostActionsOnFailure = "NO">
+      <PreActions>
+         <ExecutionAction
+            ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
+            <ActionContent
+               title = "Run Script"
+               scriptText = "cd &quot;${SRCROOT}&quot;&#10;buildYear=`git log -1 --format=%cd --date=format:%Y`&#10;buildVersion=`git rev-list HEAD | wc -l | tr -d &apos; &apos;`&#10;echo &quot;CURRENT_PROJECT_VERSION = $buildYear.$buildVersion&quot; &gt; Generated/BuildNumber.xcconfig&#10;">
+               <EnvironmentBuildable>
+                  <BuildableReference
+                     BuildableIdentifier = "primary"
+                     BlueprintIdentifier = "34A03D42B91730DEAC2EBD8E"
+                     BuildableName = "Listless iOS.app"
+                     BlueprintName = "Listless iOS"
+                     ReferencedContainer = "container:Listless.xcodeproj">
+                  </BuildableReference>
+               </EnvironmentBuildable>
+            </ActionContent>
+         </ExecutionAction>
+      </PreActions>
       <BuildActionEntries>
          <BuildActionEntry
             buildForTesting = "YES"

diff --git a/Listless.xcodeproj/xcshareddata/xcschemes/Listless macOS.xcscheme b/Listless.xcodeproj/xcshareddata/xcschemes/Listless macOS.xcscheme

@@ -1,10 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
    LastUpgradeVersion = "1430"
-   version = "1.3">
+   version = "1.7">
    <BuildAction
       parallelizeBuildables = "YES"
       buildImplicitDependencies = "YES">
+      <PreActions>
+         <ExecutionAction
+            ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
+            <ActionContent
+               title = "Run Script"
+               scriptText = "cd &quot;${SRCROOT}&quot;&#10;buildYear=`git log -1 --format=%cd --date=format:%Y`&#10;buildVersion=`git rev-list HEAD | wc -l | tr -d &apos; &apos;`&#10;echo &quot;CURRENT_PROJECT_VERSION = $buildYear.$buildVersion&quot; &gt; Generated/BuildNumber.xcconfig&#10;">
+               <EnvironmentBuildable>
+                  <BuildableReference
+                     BuildableIdentifier = "primary"
+                     BlueprintIdentifier = "0FB4F07A37999BBC6DFE4DBB"
+                     BuildableName = "Listless.app"
+                     BlueprintName = "Listless macOS"
+                     ReferencedContainer = "container:Listless.xcodeproj">
+                  </BuildableReference>
+               </EnvironmentBuildable>
+            </ActionContent>
+         </ExecutionAction>
+      </PreActions>
       <BuildActionEntries>
          <BuildActionEntry
             buildForTesting = "YES"

diff --git a/ListlessMac/Info.plist b/ListlessMac/Info.plist

@@ -19,7 +19,7 @@
 	<key>CFBundleShortVersionString</key>
 	<string>1.0</string>
 	<key>CFBundleVersion</key>
-	<string>1</string>
+	<string>$(CURRENT_PROJECT_VERSION)</string>
 	<key>LSMinimumSystemVersion</key>
 	<string>14.0</string>
 </dict>

diff --git a/ListlessiOS/Info.plist b/ListlessiOS/Info.plist

@@ -19,7 +19,7 @@
 	<key>CFBundleShortVersionString</key>
 	<string>1.0</string>
 	<key>CFBundleVersion</key>
-	<string>1</string>
+	<string>$(CURRENT_PROJECT_VERSION)</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
 	<key>UIBackgroundModes</key>

diff --git a/project.yml b/project.yml

@@ -6,8 +6,17 @@ options:
     iOS: "18.0"
     macOS: "14.0"
 
+configFiles:
+  Debug: Generated/BuildNumber.xcconfig
+  Release: Generated/BuildNumber.xcconfig
+
 settings:
   SWIFT_VERSION: 6
+  DEAD_CODE_STRIPPING: YES
+  ENABLE_USER_SCRIPT_SANDBOXING: YES
+  ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOL_EXTENSIONS: YES
+  SWIFT_EMIT_LOC_STRINGS: YES
+  DEVELOPMENT_TEAM: 7TD7PZBNXP
 
 targets:
   Listless iOS:
@@ -31,6 +40,7 @@ targets:
       path: ListlessiOS/Info.plist
       properties:
         CFBundleDisplayName: Listless
+        CFBundleVersion: $(CURRENT_PROJECT_VERSION)
         LSRequiresIPhoneOS: true
         UILaunchScreen: {}
         UIBackgroundModes:
@@ -50,14 +60,6 @@ targets:
       TARGETED_DEVICE_FAMILY: "1,2"
       ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
       CODE_SIGN_STYLE: Automatic
-      DEVELOPMENT_TEAM: 7TD7PZBNXP
-    postBuildScripts:
-      - name: Set Build Number
-        basedOnDependencyAnalysis: false
-        script: |
-          buildYear=`xcrun git log -1 --format=%cd --date=format:%Y`
-          buildVersion=`xcrun git rev-list HEAD | wc -l | tr -d ' '`
-          /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildYear.$buildVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
 
   Listless macOS:
     type: application
@@ -82,6 +84,7 @@ targets:
       path: ListlessMac/Info.plist
       properties:
         CFBundleDisplayName: Listless
+        CFBundleVersion: $(CURRENT_PROJECT_VERSION)
         LSMinimumSystemVersion: "14.0"
     settings:
       PRODUCT_BUNDLE_IDENTIFIER: net.inqk.listless.mac
@@ -89,14 +92,6 @@ targets:
       INFOPLIST_FILE: ListlessMac/Info.plist
       ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
       CODE_SIGN_STYLE: Automatic
-      DEVELOPMENT_TEAM: 7TD7PZBNXP
-    postBuildScripts:
-      - name: Set Build Number
-        basedOnDependencyAnalysis: false
-        script: |
-          buildYear=`xcrun git log -1 --format=%cd --date=format:%Y`
-          buildVersion=`xcrun git rev-list HEAD | wc -l | tr -d ' '`
-          /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildYear.$buildVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
 
   Listless iOS Unit Tests:
     type: bundle.unit-test
@@ -109,7 +104,6 @@ targets:
     settings:
       PRODUCT_BUNDLE_IDENTIFIER: net.inqk.listless.ios.unittests
       CODE_SIGN_STYLE: Automatic
-      DEVELOPMENT_TEAM: 7TD7PZBNXP
       TEST_HOST: $(BUILT_PRODUCTS_DIR)/Listless iOS.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Listless iOS
       BUNDLE_LOADER: $(TEST_HOST)
       GENERATE_INFOPLIST_FILE: YES
@@ -119,6 +113,13 @@ schemes:
     build:
       targets:
         Listless iOS: all
+      preActions:
+        - script: |
+            cd "${SRCROOT}"
+            buildYear=`git log -1 --format=%cd --date=format:%Y`
+            buildVersion=`git rev-list HEAD | wc -l | tr -d ' '`
+            echo "CURRENT_PROJECT_VERSION = $buildYear.$buildVersion" > Generated/BuildNumber.xcconfig
+          settingsTarget: Listless iOS
     run:
       config: Debug
     test:
@@ -138,6 +139,13 @@ schemes:
     build:
       targets:
         Listless macOS: all
+      preActions:
+        - script: |
+            cd "${SRCROOT}"
+            buildYear=`git log -1 --format=%cd --date=format:%Y`
+            buildVersion=`git rev-list HEAD | wc -l | tr -d ' '`
+            echo "CURRENT_PROJECT_VERSION = $buildYear.$buildVersion" > Generated/BuildNumber.xcconfig
+          settingsTarget: Listless macOS
     run:
       config: Debug
     profile: