-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetup
executable file
·217 lines (182 loc) · 7.36 KB
/
setup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#!/bin/bash
. .env
# Checking for required tools
MISSING_TOOLS=()
REQUIRED_TOOLS=("git" "gh" "gcloud" "sed" "flutter" "shorebird" "curl" "app-store-connect" "bundler" "fastlane")
for tool in "${REQUIRED_TOOLS[@]}"; do
if ! command -v "$tool" &>/dev/null; then
MISSING_TOOLS+=("$tool")
fi
done
if [ "${#MISSING_TOOLS[@]}" -ne 0 ]; then
echo "Error: The following tools are not installed: ${MISSING_TOOLS[*]}"
exit 1
fi
# Exit if there are uncommitted changes
if [[ -n $(git status --porcelain) ]]; then
echo "There are uncommitted changes in the repository. Please commit or stash them before proceeding."
exit 1
fi
# Get Git origin URL and validate its scheme
GIT_REPO_URL=$(git config --get remote.origin.url)
if [[ ! $GIT_REPO_URL =~ ^git@ ]]; then
echo "Git origin URL must use the SSH scheme (git@...). Current URL: $GIT_REPO_URL"
exit 1
fi
echo "Cleaning up..."
rm LICENSE
flutter clean >> /dev/null
flutter pub upgrade >> /dev/null
echo "Done"
# Project name (snake_case)
PROJECT_DIR=${PWD##*/}
if [[ $PROJECT_DIR =~ ^[a-z][a-z0-9_]*$ ]]; then
read -r -p "App name [${PROJECT_DIR}]: " APP_NAME_SNAKE
: "${APP_NAME_SNAKE:=${PROJECT_DIR}}"
fi
# Validate APP_NAME_SNAKE using Dart identifier syntax rules
while [[ ! $APP_NAME_SNAKE =~ ^[a-z][a-z0-9_]*$ ]]; do
echo "Error: '$APP_NAME_SNAKE' is not a valid Dart identifier."
echo "It must start with a lowercase letter, and contain only lowercase letters, digits, and underscores."
read -r -p "Enter a valid project name (snake_case): " APP_NAME_SNAKE
done
APP_LABEL_DASHBOARD=$(echo "$APP_NAME_SNAKE" | tr '_' ' ' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')
sed -i "s/^description:.*$/description: '${APP_LABEL_DASHBOARD}'/" pubspec.yaml
if [ "${TEMPLATE_NAME_SNAKE}" == "${APP_NAME_SNAKE}" ]; then
DEFAULT_SCREEN_NAME="sba-template"
else
DEFAULT_SCREEN_NAME=$APP_LABEL_DASHBOARD
fi
read -r -p "App screen name (you can change it later) [${DEFAULT_SCREEN_NAME}]: " APP_LABEL_SCREEN
: "${APP_LABEL_SCREEN:=${DEFAULT_SCREEN_NAME}}"
# Project name (camelCased)
APP_NAME_CAMEL=$(echo "$APP_NAME_SNAKE" | awk -F_ '{for(i=1;i<=NF;i++) printf "%s%s", (i==1?tolower($i):toupper(substr($i,1,1)) tolower(substr($i,2))), ""}')
# Project name (kebab-cased): Google Cloud project, slack channels
APP_NAME_SLUG="${APP_NAME_SNAKE//_/-}"
# Domain name
GIT_USER=$(gh api user --jq '.login')
FALLBACK_DOMAIN=$([ "$GIT_USER" == "akabanov" ] && [ "$APP_NAME_SNAKE" != "sneaky_bird_apps_template" ] && echo "sneaky""bird.app" || echo "$TEMPLATE_DOMAIN")
read -r -p "App domain [${FALLBACK_DOMAIN}]: " APP_DOMAIN
: "${APP_DOMAIN:=${FALLBACK_DOMAIN}}"
APP_DOMAIN_REVERSED="$(echo "$APP_DOMAIN" | awk -F. '{for(i=NF;i>0;i--) printf "%s%s", $i, (i>1 ? "." : "")}')"
# Fully-qualified name (and bundle ID in iOS)
BUNDLE_ID="${APP_DOMAIN_REVERSED}.${APP_NAME_CAMEL}"
# Trim to 30 characters: max project ID in Google Cloud, and
# add fully-qualified name hash to make the name quasi-unique
APP_ID_SLUG="$APP_NAME_SLUG"
if [ "${APP_NAME_SLUG}" != "${TEMPLATE_NAME_SLUG}" ]; then
APP_ID_SLUG="$(echo "$APP_NAME_SLUG" | cut -c-23)-$(echo "$BUNDLE_ID" | md5sum | cut -c1-6)"
fi
FALLBACK_APP_LANGUAGE=$(echo "$LANG" | cut -d. -f1 | tr '_' '-')
#read -r -p "Primary language [${FALLBACK_APP_LANGUAGE}]: " PRIMARY_APP_LANGUAGE
: "${PRIMARY_APP_LANGUAGE:=$FALLBACK_APP_LANGUAGE}"
echo "Primary language: ${PRIMARY_APP_LANGUAGE}"
mapfile -t APP_STORE_LANGUAGES < "ios/app-store-languages"
# shellcheck disable=SC2076
if [[ ! " ${APP_STORE_LANGUAGES[*]} " =~ " ${PRIMARY_APP_LANGUAGE} " ]]; then
echo "'${PRIMARY_APP_LANGUAGE}' is not a valid language option: ${APP_STORE_LANGUAGES[*]}"
exit 1
fi
if [ "$PRIMARY_APP_LANGUAGE" != "en-US" ]; then
mv "assets/dev/android/en-US" "assets/dev/android/${PRIMARY_APP_LANGUAGE}"
fi
echo "Updating project files"
# Domain name
if [ "${TEMPLATE_DOMAIN}" != "${APP_DOMAIN}" ]; then
find . -type f -not -path '*/.git/*' -exec sed -i "s/${TEMPLATE_DOMAIN}/${APP_DOMAIN}/g" {} +
find . -type f -not -path '*/.git/*' -exec sed -i "s/${TEMPLATE_DOMAIN_REVERSED}/${APP_DOMAIN_REVERSED}/g" {} +
APP_PKG_PATH="${APP_DOMAIN_REVERSED//./\/}"
TEMPLATE_PKG_PATH="${TEMPLATE_DOMAIN_REVERSED//./\/}"
JAVA_PKG_ROOTS=("android/app/src/androidTest/java" "android/app/src/main/kotlin")
for path in "${JAVA_PKG_ROOTS[@]}"; do
mkdir -p "${path}/${APP_PKG_PATH}"
mv "${path}/${TEMPLATE_PKG_PATH}/"* "${path}/${APP_PKG_PATH}"
find "${path}" -type d -empty -delete
done
fi
find . -type f -not -path '*/.git/*' -exec sed -i "s/${TEMPLATE_ID_SLUG}/${APP_ID_SLUG}/g" {} +
# App name
if [ "${TEMPLATE_NAME_SNAKE}" != "${APP_NAME_SNAKE}" ]; then
find . -type f -not -path '*/.git/*' -exec sed -i "s/${TEMPLATE_NAME_SNAKE}/${APP_NAME_SNAKE}/g" {} +
find . -type f -not -path '*/.git/*' -exec sed -i "s/${TEMPLATE_NAME_SLUG}/${APP_NAME_SLUG}/g" {} +
find . -type f -not -path '*/.git/*' -exec sed -i "s/${TEMPLATE_NAME_CAMEL}/${APP_NAME_CAMEL}/g" {} +
find . -depth -name "*${TEMPLATE_NAME_SNAKE}*" -not -path '*/.git/*' \
-execdir bash -c 'mv "$1" "${1//'"${TEMPLATE_NAME_SNAKE}"'/'"${APP_NAME_SNAKE}"'}"' _ {} \;
fi
# Write to .env AFTER substitution and BEFORE calling other scripts
echo "GIT_REPO_URL=${GIT_REPO_URL}" >> .env
echo "APP_NAME_SNAKE=${APP_NAME_SNAKE}" >> .env
echo "APP_LABEL_DASHBOARD='${APP_LABEL_DASHBOARD}'" >> .env
echo "APP_LABEL_SCREEN='${APP_LABEL_SCREEN}'" >> .env
echo "APP_NAME_CAMEL=${APP_NAME_CAMEL}" >> .env
echo "APP_NAME_SLUG=${APP_NAME_SLUG}" >> .env
echo "APP_DOMAIN=${APP_DOMAIN}" >> .env
echo "APP_DOMAIN_REVERSED=${APP_DOMAIN_REVERSED}" >> .env
echo "BUNDLE_ID=${BUNDLE_ID}" >> .env
echo "APP_STORE_COMPANY_NAME='${APP_STORE_COMPANY_NAME}'" >> .env
echo "APP_ID_SLUG=${APP_ID_SLUG}" >> .env
echo "PRIMARY_APP_LANGUAGE=${PRIMARY_APP_LANGUAGE}" >> .env
flutter clean
flutter test -x screenshots
read -n 1 -r -p "Setup Google Cloud integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source ./setup-gcloud.sh
fi
read -n 1 -r -p "Setup Shorebird integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source ./setup-shorebird.sh
fi
read -n 1 -r -p "Setup Sentry integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source ./setup-sentry.sh
fi
read -n 1 -r -p "Setup Codemagic integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source ./setup-codemagic.sh
fi
read -n 1 -r -p "Setup OneSignal integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source setup-one-signal.sh
fi
read -n 1 -r -p "Setup App Store Connect integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source setup-app-store.sh
fi
read -n 1 -r -p "Setup Google Play Console integration? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source setup-play-store.sh
fi
# template debugging
if [ "$APP_NAME_SNAKE" == "sneaky_bird_apps_template" ]; then
if ! git show-ref --verify --quiet refs/heads/dev; then
git checkout -b dev
else
git checkout dev
fi
fi
git add -A . > /dev/null
git commit -q -m "Initial setup"
REMOTE_BRANCH=$(git rev-parse --abbrev-ref HEAD)
read -n 1 -r -p "Push initial setup to remote git branch ${REMOTE_BRANCH}? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
if ! git ls-remote --exit-code --heads origin "$REMOTE_BRANCH"; then
git push --set-upstream origin "$REMOTE_BRANCH" > /dev/null
else
git push > /dev/null
fi
else
exit
fi
read -n 1 -r -p "Start Codemagic integration smoke tests? (Y/n) " YN
echo
if [[ ! "$YN" =~ ^[nN] ]]; then
source ci.sh ios-beta
fi