Skip to content

Separate iOS beta and App Store versions - #7854

Merged
azooz2003-bit merged 1 commit into
mainfrom
feat-separate-ios-lane-versions
Jul 10, 2026
Merged

azooz2003-bit merged 1 commit into
mainfrom
feat-separate-ios-lane-versions

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jul 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Add independent checked-in iOS beta and App Store marketing versions: beta stays 1.0.4, App Store starts at 1.0.0.
  • Stamp and verify the selected lane marketing version in the archive before export/upload.
  • Update App Store validation, CI summaries, release docs, and the iOS lane simulation test.

Testing

  • python3 tests/test_ios_appstore_lane_identity.py
  • bash -n ios/scripts/upload-testflight.sh ios/scripts/cloud-testflight.sh ios/scripts/validate-app-store-release.sh ios/scripts/bump-ios-version.sh ios/scripts/upload-app-store.sh ios/scripts/set-testflight-notes.sh
  • python3 -m py_compile tests/test_ios_appstore_lane_identity.py
  • git diff --check

Notes

  • Metadata/workflow change only. No tagged runtime reload needed.

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Medium Risk
Changes release/version stamping and pre-export guards on TestFlight and App Store upload paths; mistakes could block uploads or ship the wrong CFBundleShortVersionString, but scope is tooling and config with expanded automated tests.

Overview
Introduces independent TestFlight beta and production App Store marketing versions so beta can stay on an already-approved line (e.g. 1.0.4) while the first App Store upload can ship as 1.0.0.

ios/Config/Shared.xcconfig now defines CMUX_IOS_BETA_MARKETING_VERSION and CMUX_IOS_APPSTORE_MARKETING_VERSION, with MARKETING_VERSION aliasing the beta value for normal Xcode builds. upload-testflight.sh picks the lane version, stamps it at archive time, and fails closed if a reused archive’s CFBundleShortVersionString does not match. Beta --auto-version floors on the greater of the latest ios-v* tag and the checked-in beta version.

bump-ios-version.sh gains --lane beta|appstore; validate-app-store-release.sh and the App Store workflow default to the App Store key. cloud-testflight.sh pins BETA_MARKETING_VERSION before fleet/local archives. Docs, changelog wording, and test_ios_appstore_lane_identity.py are updated for lane-specific stamping and validation.

Reviewed by Cursor Bugbot for commit 6014d8a. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Split iOS beta and App Store marketing versions and make each lane stamp and enforce its own MARKETING_VERSION at archive time. Prevents wrong-version uploads and keeps beta and production release lines independent.

  • New Features

    • Added CMUX_IOS_BETA_MARKETING_VERSION and CMUX_IOS_APPSTORE_MARKETING_VERSION in ios/Config/Shared.xcconfig; MARKETING_VERSION defaults to the beta value.
    • Both lanes stamp their lane marketing version during archive and refuse export/upload if the archive’s CFBundleShortVersionString is invalid or mismatched; final IPAs keep the lane’s version.
    • --auto-version (beta-only) sets the next patch over the greater of the latest ios-vX.Y.Z tag or the checked-in beta version; never decreases and fails closed if it can’t compute a version. App Store lane rejects --auto-version.
    • Tooling: cloud-testflight.sh pins BETA_MARKETING_VERSION early; validate-app-store-release.sh and the App Store workflow default to CMUX_IOS_APPSTORE_MARKETING_VERSION; bump-ios-version.sh --lane beta|appstore updates the targeted lane and accepts trailing --lane; workflows/docs reference the new keys. Tests cover lane stamping in archives/IPAs, archive guards, auto-version flooring, validation defaults, and the bump helper.
  • Migration

    • Use ios/scripts/bump-ios-version.sh --lane beta|appstore to bump the correct lane.
    • Keep the top ios/CHANGELOG.md entry equal to CMUX_IOS_BETA_MARKETING_VERSION. No runtime changes.

Written for commit 6014d8a. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added separate, lane-aware iOS marketing versions for beta vs App Store, with updated version bumping and distribution behavior.
  • Documentation
    • Updated iOS App Store/Review, TestFlight, and identity checklist guidance to reference the new configuration-driven marketing version variables.
  • Bug Fixes
    • Improved App Store/TestFlight validation to derive and verify the correct lane marketing version and fail fast on missing/invalid values.
  • Tests
    • Expanded automated coverage for beta lanes, overrides, and beta auto-version floor logic.

@vercel

vercel Bot commented Jul 10, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jul 11, 2026 12:18am
cmux-staging Building Building Preview, Comment Jul 11, 2026 12:18am

@coderabbitai

coderabbitai Bot commented Jul 10, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR separates iOS beta and App Store marketing versions, updates version bumping and release scripts to use lane-specific values, aligns workflows and documentation, and expands end-to-end tests for beta and App Store archive identity and version propagation.

Changes

iOS versioning and release lanes

Layer / File(s) Summary
Lane-specific version contract
ios/Config/Shared.xcconfig, ios/scripts/bump-ios-version.sh
Defines separate beta and App Store marketing versions and adds lane-aware version bumping.
TestFlight version selection and archive validation
ios/scripts/upload-testflight.sh, ios/scripts/cloud-testflight.sh, ios/scripts/set-testflight-notes.sh, .github/workflows/ios-testflight.yml, ios/CHANGELOG.md, ios/README.md
Resolves lane-specific versions, supports beta auto-version stamping, validates archive metadata, and updates TestFlight workflow guidance.
App Store version sourcing and validation
ios/scripts/validate-app-store-release.sh, .github/workflows/ios-app-store.yml, ios/AppStoreReview/*, ios/README.md
Uses CMUX_IOS_APPSTORE_MARKETING_VERSION for App Store validation, defaults, and documentation.
Beta and App Store identity coverage
tests/test_ios_appstore_lane_identity.py
Adds beta-lane archive/export coverage and verifies separate bundle identities, provisioning profiles, and marketing versions.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Workflow
  participant upload-testflight.sh
  participant Shared.xcconfig
  participant xcodebuild
  participant IPA
  Workflow->>upload-testflight.sh: start lane upload
  upload-testflight.sh->>Shared.xcconfig: read lane marketing version
  upload-testflight.sh->>xcodebuild: archive with lane version
  xcodebuild->>IPA: write archive metadata
  upload-testflight.sh->>IPA: verify CFBundleShortVersionString
Loading

Possibly related PRs

Suggested reviewers: lawrencecchen


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux User-Facing Error Privacy ❌ Error FAIL: upload-testflight.sh adds log lines like lane-version: ... MARKETING_VERSION=..., exposing an internal config/env name in user-visible command output. Change the logs to say "selected lane marketing version" (or similar) without printing MARKETING_VERSION or other internal keys.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (23 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR changes only workflows, scripts, docs, xcconfig, and tests; no Swift production code or actor-isolation-sensitive declarations were introduced.
Cmux Swift Blocking Runtime ✅ Passed PASS: The PR changes only workflows/scripts/docs/tests; no .swift files are modified, so no new blocking waits/sleeps/locks were introduced in production Swift.
Cmux Browser Automation Off-Main ✅ Passed The PR only changes iOS versioning/workflow/docs/test files; no browser automation routing or WebKit/AppKit off-main changes are present.
Cmux Expensive Synchronous Load ✅ Passed No Swift/ObjC files were touched in HEAD; the PR only changes scripts, docs, config, and tests, so the sync-load rule is not applicable.
Cmux Cache Substitution Correctness ✅ Passed PASS: HEAD diff only touches YAML, shell, docs, xcconfig, and Python tests; no production Swift/TS/JS cache-substitution change is present.
Cmux No Hacky Sleeps ✅ Passed No new fixed sleeps, timers, or polling loops were introduced in the changed runtime scripts; workflow waits are out of scope.
Cmux Algorithmic Complexity ✅ Passed The runtime changes are one-time xcconfig reads and a version compare; no new nested scans or scalable per-target rescans were introduced.
Cmux Swift Concurrency ✅ Passed No Swift files were changed in this PR; it only touches workflows, scripts, docs, config, and Python tests, so the Swift concurrency rule is not applicable.
Cmux Swift @Concurrent ✅ Passed No Swift files are changed in this PR, so the @concurrent/nonisolated async rule is not applicable.
Cmux Swift File And Package Boundaries ✅ Passed No .swift files changed; the diff is limited to xcconfig, scripts, docs, and tests, so Swift file/package boundary rules are not implicated.
Cmux Swiftpm Lockfiles ✅ Passed Diff only touches iOS versioning docs/scripts/workflows/tests; no Package.swift, .gitignore, Xcode package-reference, or Package.resolved files changed.
Cmux Swift Logging ✅ Passed No Swift files changed in this PR; the diff is docs, scripts, workflows, config, and tests only.
Cmux Full Internationalization ✅ Passed PASS: The PR only changes docs/workflows/scripts/config/tests; no Swift text, xcstrings, Info.plist, or web i18n/message files were added or edited.
Cmux Swiftui State Layout ✅ Passed PASS: Diff only touches workflows/docs/scripts/config and a Python test; no SwiftUI views, state objects, GeometryReader layout, or render-time mutations were introduced.
Cmux Architecture Rethink ✅ Passed No Swift source or UI lifecycle wiring changed; this PR only updates xcconfig/scripts/docs/tests for lane marketing versions, so no architectural-rethink pattern is introduced.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR only changes iOS scripts/docs/tests and no Swift window code, so the auxiliary-window close-shortcut rule is not implicated.
Cmux Source Artifacts ✅ Passed Changed paths are source/docs/scripts/tests/config/workflows; no artifact-like outputs, caches, temp dirs, logs, screenshots, or build artifacts were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed No changed Swift files under production Sources/; the diff only touches docs, scripts, workflows, config, and tests.
Cmux No Ambient Global State ✅ Passed No production Swift files changed; this PR only touches workflows, docs, scripts, config, and tests, so the ambient-global-state rule isn’t implicated.
Title check ✅ Passed The title clearly summarizes the main change: splitting iOS beta and App Store versions.
Description check ✅ Passed The description covers the required summary and testing sections well, but it omits the demo video, review trigger, and checklist sections.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-separate-ios-lane-versions

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 78b8ad5. Configure here.

Comment thread ios/scripts/upload-testflight.sh
@greptile-apps

greptile-apps Bot commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR splits the iOS beta and App Store release versions. The main changes are:

  • Adds separate beta and App Store marketing-version keys in Shared.xcconfig.
  • Stamps the selected lane version during archive creation.
  • Verifies reused archives before export or upload.
  • Updates App Store validation, workflows, release docs, and lane-identity tests.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
ios/scripts/bump-ios-version.sh Updates the bump helper to parse lane arguments in either order and write the selected lane's version key.
ios/scripts/upload-testflight.sh Resolves, stamps, and checks lane-specific marketing versions for beta and App Store uploads.
ios/scripts/validate-app-store-release.sh Defaults App Store release validation to the App Store marketing-version key.
.github/workflows/ios-app-store.yml Reads the App Store marketing version for the validation step.
ios/Config/Shared.xcconfig Defines independent beta and App Store marketing versions while keeping the default Xcode version on the beta lane.

Reviews (7): Last reviewed commit: "Separate iOS beta and App Store versions" | Re-trigger Greptile

Comment thread ios/scripts/bump-ios-version.sh Outdated
elif [[ "${1:-}" == "major" ]]; then
NEW_MARKETING="$((MAJOR + 1)).0.0"
elif [[ "$1" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
elif [[ "${1:-}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Trailing Lane Is Ignored

When the version comes before the lane, such as ios/scripts/bump-ios-version.sh 1.0.1 --lane appstore, this parser keeps the default beta lane and treats 1.0.1 as the version. The trailing --lane appstore is ignored, so the beta key is updated while the App Store version stays unchanged.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ios-app-store.yml:
- Line 168: Change the VERSION extraction command in the workflow to use tail -n
1 instead of head -n 1, matching read_xcconfig_setting semantics and ensuring
the last CMUX_IOS_APPSTORE_MARKETING_VERSION entry is used.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1b2bd4e6-4fc6-45da-a08a-10941c3618a8

📥 Commits

Reviewing files that changed from the base of the PR and between 58f38dc and 78b8ad5.

📒 Files selected for processing (12)
  • .github/workflows/ios-app-store.yml
  • .github/workflows/ios-testflight.yml
  • ios/AppStoreReview/README.md
  • ios/AppStoreReview/metadata-screenshots-checklist.md
  • ios/CHANGELOG.md
  • ios/Config/Shared.xcconfig
  • ios/README.md
  • ios/scripts/bump-ios-version.sh
  • ios/scripts/set-testflight-notes.sh
  • ios/scripts/upload-testflight.sh
  • ios/scripts/validate-app-store-release.sh
  • tests/test_ios_appstore_lane_identity.py

Comment thread .github/workflows/ios-app-store.yml Outdated
@azooz2003-bit
azooz2003-bit force-pushed the feat-separate-ios-lane-versions branch from 78b8ad5 to 8d722c2 Compare July 10, 2026 18:56
Comment thread ios/scripts/bump-ios-version.sh Outdated
Comment on lines +27 to +37
if [[ "${1:-}" == "--lane" ]]; then
if [[ -z "${2:-}" ]]; then
echo "Usage: $0 [--lane beta|appstore] [version|patch|minor|major]" >&2
exit 1
fi
LANE="${2:-}"
shift 2
elif [[ "${1:-}" == --lane=* ]]; then
LANE="${1#--lane=}"
shift
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Trailing lane ignored

The parser still only recognizes --lane when it is the first argument. When a developer runs ios/scripts/bump-ios-version.sh 1.0.1 --lane appstore, this block is skipped, LANE stays beta, and the script updates CMUX_IOS_BETA_MARKETING_VERSION while leaving CMUX_IOS_APPSTORE_MARKETING_VERSION unchanged. That can make the next App Store upload use the old production version even though the bump command appeared to include the App Store lane.

@azooz2003-bit
azooz2003-bit force-pushed the feat-separate-ios-lane-versions branch from 8d722c2 to a6c00d6 Compare July 10, 2026 19:04
Comment thread ios/scripts/bump-ios-version.sh Outdated
Comment on lines +27 to +36
if [[ "${1:-}" == "--lane" ]]; then
if [[ -z "${2:-}" ]]; then
echo "Usage: $0 [--lane beta|appstore] [version|patch|minor|major]" >&2
exit 1
fi
LANE="${2:-}"
shift 2
elif [[ "${1:-}" == --lane=* ]]; then
LANE="${1#--lane=}"
shift

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Trailing lane ignored

This parser only reads --lane when it is the first argument. When someone runs ios/scripts/bump-ios-version.sh 1.0.1 --lane appstore, LANE stays beta, 1.0.1 is accepted as the version, and the trailing lane flag is ignored. That updates CMUX_IOS_BETA_MARKETING_VERSION while the App Store version stays stale, so the next App Store release can still use the old production version.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
.github/workflows/ios-app-store.yml (1)

168-168: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Use tail -n 1 to match read_xcconfig_setting semantics.

The workflow extracts CMUX_IOS_APPSTORE_MARKETING_VERSION with head -n 1 (first match), while validate-app-store-release.sh's read_xcconfig_setting uses tail -n 1 (last match). In xcconfig, the last value wins, so tail -n 1 is correct. If the xcconfig ever has duplicate entries, the workflow would pass the wrong version to the validation script.

🔧 Proposed fix
-          VERSION="$(sed -nE 's/^[[:space:]]*CMUX_IOS_APPSTORE_MARKETING_VERSION[[:space:]]*=[[:space:]]*([^[:space:]]+).*/\1/p' ios/Config/Shared.xcconfig | head -n 1)"
+          VERSION="$(sed -nE 's/^[[:space:]]*CMUX_IOS_APPSTORE_MARKETING_VERSION[[:space:]]*=[[:space:]]*([^[:space:]]+).*/\1/p' ios/Config/Shared.xcconfig | tail -n 1)"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ios-app-store.yml at line 168, Change the VERSION
extraction command in the workflow to use `tail -n 1` instead of `head -n 1`,
matching the last-value-wins behavior implemented by `read_xcconfig_setting` in
`validate-app-store-release.sh`.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ios/scripts/bump-ios-version.sh`:
- Line 48: Replace the exact-space grep parsing in the version reads of the bump
script, including CURRENT_MARKETING and the re-read around line 83, with the
existing read_xcconfig_setting pattern used by the other scripts. Reuse or
define that helper to tolerate arbitrary whitespace around the xcconfig key and
equals sign, and use it consistently for both reads.

---

Duplicate comments:
In @.github/workflows/ios-app-store.yml:
- Line 168: Change the VERSION extraction command in the workflow to use `tail
-n 1` instead of `head -n 1`, matching the last-value-wins behavior implemented
by `read_xcconfig_setting` in `validate-app-store-release.sh`.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: fbe55308-2d6e-4188-a3b6-b873fa0cc123

📥 Commits

Reviewing files that changed from the base of the PR and between 8d722c2 and a6c00d6.

📒 Files selected for processing (13)
  • .github/workflows/ios-app-store.yml
  • .github/workflows/ios-testflight.yml
  • ios/AppStoreReview/README.md
  • ios/AppStoreReview/metadata-screenshots-checklist.md
  • ios/CHANGELOG.md
  • ios/Config/Shared.xcconfig
  • ios/README.md
  • ios/scripts/bump-ios-version.sh
  • ios/scripts/cloud-testflight.sh
  • ios/scripts/set-testflight-notes.sh
  • ios/scripts/upload-testflight.sh
  • ios/scripts/validate-app-store-release.sh
  • tests/test_ios_appstore_lane_identity.py

Comment thread ios/scripts/bump-ios-version.sh Outdated
@azooz2003-bit
azooz2003-bit force-pushed the feat-separate-ios-lane-versions branch 3 times, most recently from 52d2057 to 218856e Compare July 10, 2026 21:15
@azooz2003-bit
azooz2003-bit force-pushed the feat-separate-ios-lane-versions branch from 218856e to 6014d8a Compare July 10, 2026 21:19

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ios/scripts/validate-app-store-release.sh`:
- Around line 49-54: Extract read_xcconfig_setting into a shared
ios/scripts/xcconfig-helpers.sh helper, preserving its current parsing behavior,
and source that helper from validate-app-store-release.sh and
upload-testflight.sh. Replace the duplicated inline sed parsing in the iOS
workflow with the shared helper or an equivalent invocation so all xcconfig
extraction uses one implementation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: bb4743d4-60dd-4418-be9e-e8d71ce4e8f1

📥 Commits

Reviewing files that changed from the base of the PR and between e62c8a3 and 6014d8a.

📒 Files selected for processing (13)
  • .github/workflows/ios-app-store.yml
  • .github/workflows/ios-testflight.yml
  • ios/AppStoreReview/README.md
  • ios/AppStoreReview/metadata-screenshots-checklist.md
  • ios/CHANGELOG.md
  • ios/Config/Shared.xcconfig
  • ios/README.md
  • ios/scripts/bump-ios-version.sh
  • ios/scripts/cloud-testflight.sh
  • ios/scripts/set-testflight-notes.sh
  • ios/scripts/upload-testflight.sh
  • ios/scripts/validate-app-store-release.sh
  • tests/test_ios_appstore_lane_identity.py

Comment on lines +49 to +54
read_xcconfig_setting() {
local key="$1"
local file="$2"
sed -nE "s/^[[:space:]]*$key[[:space:]]*=[[:space:]]*([^[:space:]]+).*/\\1/p" "$file" 2>/dev/null | tail -n 1
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider extracting read_xcconfig_setting into a shared helper.

The same read_xcconfig_setting function now exists in validate-app-store-release.sh and upload-testflight.sh, and the same sed logic is inlined in .github/workflows/ios-app-store.yml line 168. Duplicating the extraction logic risks divergence if the xcconfig format or parsing semantics change. Consider sourcing a shared ios/scripts/xcconfig-helpers.sh from both scripts.

🧰 Tools
🪛 Shellcheck (0.11.0)

[error] 52-52: Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet).

(SC1087)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ios/scripts/validate-app-store-release.sh` around lines 49 - 54, Extract
read_xcconfig_setting into a shared ios/scripts/xcconfig-helpers.sh helper,
preserving its current parsing behavior, and source that helper from
validate-app-store-release.sh and upload-testflight.sh. Replace the duplicated
inline sed parsing in the iOS workflow with the shared helper or an equivalent
invocation so all xcconfig extraction uses one implementation.

@azooz2003-bit
azooz2003-bit merged commit 2b122c4 into main Jul 10, 2026
40 of 43 checks passed
@azooz2003-bit
azooz2003-bit deleted the feat-separate-ios-lane-versions branch July 10, 2026 21:58

This branch was successfully deployed

1 active deployment
Preview – cmux — 6014d8ae Deployed Jul 11, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant