#!/usr/bin/env bash # Writes worktree-aware identity overrides for mobile debug builds, mirroring # the desktop dev experience in scripts/instance-env.sh: debug builds produced # from a git worktree get a unique app identifier keyed to the WORKTREE # DIRECTORY NAME (stable across branch switches, so installs and login state # are bounded by worktree count) plus a display-only branch label (short SHA # when detached). # # In a worktree this writes two gitignored override files consumed by the # native build systems (so direct Xcode / Android Studio / `flutter run` # builds pick them up too): # mobile/ios/Flutter/WorktreeOverrides.xcconfig (Debug builds only; a # developer's AppOverrides.xcconfig takes precedence per variable) # mobile/android/worktree.properties (debug build type only) # In the main checkout it removes any stale override files. Release and # profile builds never read these overrides. set -euo pipefail # `just mobile-*` recipes unset these before invoking Flutter; do the same so # an inherited GIT_DIR pointing elsewhere cannot misdetect the worktree. unset GIT_DIR GIT_WORK_TREE repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ios_overrides="$repo_root/mobile/ios/Flutter/WorktreeOverrides.xcconfig" android_props="$repo_root/mobile/android/worktree.properties" # Worktree detection: in the main working tree --git-dir and --git-common-dir # are identical; in any linked worktree they differ (same check as # scripts/instance-env.sh). in_worktree=0 if git -C "$repo_root" rev-parse --is-inside-work-tree &>/dev/null; then git_dir=$(git -C "$repo_root" rev-parse --git-dir) git_common_dir=$(git -C "$repo_root" rev-parse --git-common-dir 2>/dev/null) if [[ -n "$git_common_dir" && "$git_dir" != "$git_common_dir" ]]; then in_worktree=1 fi fi if [[ "$in_worktree" != "1" ]]; then rm -f "$ios_overrides" "$android_props" exit 0 fi # Install identity comes from the worktree directory name: stable across # branch switches, so one worktree keeps one installed app (and its login # state) no matter how many branches it visits. worktree_name="$(basename "$repo_root")" # Display label is context only: the branch name, or a short SHA when the # worktree is detached. Sanitized to [A-Za-z0-9._-] so no valid Git ref can # break Android string resources or xcconfig values. branch=$(git -C "$repo_root" rev-parse --abbrev-ref HEAD) if [[ "$branch" == "HEAD" ]]; then label_raw=$(git -C "$repo_root" rev-parse --short HEAD) else label_raw="${branch##*/}" fi label=$(printf '%s' "$label_raw" | sed -e 's/[^A-Za-z0-9._-]/-/g' -e 's/--*/-/g' -e 's/^-//' -e 's/-$//') [[ -n "$label" ]] || label="worktree" # iOS bundle-identifier slug: lowercase, non-alphanumerics collapsed to # hyphens (hyphens are valid in bundle identifiers). ios_slug=$(printf '%s' "$worktree_name" | tr '[:upper:]' '[:lower:]' | sed -e 's/[^a-z0-9]/-/g' -e 's/--*/-/g' -e 's/^-//' -e 's/-$//') [[ -n "$ios_slug" ]] || ios_slug="worktree" # Android applicationId segments must match [a-z][a-z0-9_]*: swap hyphens for # underscores and prefix a letter when the slug starts with a digit. android_slug="${ios_slug//-/_}" case "$android_slug" in [0-9]*) android_slug="w_$android_slug" ;; esac ios_bundle_id="com.buzz.buzzMobile.${ios_slug}" android_suffix=".${android_slug}" cat > "$ios_overrides" < "$android_props" <