listless

A simple list app for Apple platforms
Log | Files | Refs | README | LICENSE

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: