Explorer
/opt/struktur/buzz/scripts/mobile-worktree-overrides.sh
← Zurück ↓ Download
#!/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" <<XCCONFIG
// Generated by scripts/mobile-worktree-overrides.sh — gitignored, do not edit.
// Applies to Debug builds only (included from Flutter/Debug.xcconfig before
// AppOverrides.xcconfig, so a developer's app-specific overrides win).
BUNDLE_IDENTIFIER = ${ios_bundle_id}
APP_DISPLAY_NAME = Buzz (${label})
XCCONFIG

cat > "$android_props" <<PROPERTIES
# Generated by scripts/mobile-worktree-overrides.sh — gitignored, do not edit.
# Applies to the debug build type only (read by android/app/build.gradle.kts).
label=${label}
applicationIdSuffix=${android_suffix}
PROPERTIES

# The printed identifiers are the generated defaults; on iOS a developer's
# AppOverrides.xcconfig may override them per variable.
echo "📱 Worktree ${worktree_name}: label \"${label}\" (iOS default ${ios_bundle_id}, Android suffix ${android_suffix})"