99# SERVICE_ACCOUNT_KEY_JSON — path to the Google service account JSON file
1010# PKG — package name (default: com.flipcash.app.android)
1111# MANIFEST_PATH — manifest location (default: .well-known/release-manifest.json)
12+ # TRACKS — space-separated list of tracks to fetch and update
13+ # (default: production beta alpha internal)
14+ # Tracks not listed are preserved from the existing manifest.
1215#
1316# Outputs (written to $GITHUB_OUTPUT when running in CI):
1417# old_prod / new_prod — previous and current production versionCode
2831SA_PATH=" $SERVICE_ACCOUNT_KEY_JSON "
2932PKG=" ${PKG:- com.flipcash.app.android} "
3033MANIFEST_PATH=" ${MANIFEST_PATH:- .well-known/ release-manifest.json} "
34+ TRACKS=" ${TRACKS:- production beta alpha internal} "
35+ FORCE_BUMP=" ${FORCE_BUMP:- false} "
36+
37+ ALL_TRACKS=" production beta alpha internal"
38+
39+ # --- helper: check if a value is in a space-separated list ---
40+ in_list () { [[ " $2 " == * " $1 " * ]]; }
3141
3242# --- helper: write to $GITHUB_OUTPUT when in CI, otherwise just print ---
3343emit () {
@@ -71,25 +81,6 @@ fetch_track() {
7181 | max_by(.code) // { code: null, name: null }'
7282}
7383
74- PROD_JSON=$( fetch_track production)
75- BETA_JSON=$( fetch_track beta)
76- ALPHA_JSON=$( fetch_track alpha)
77- INTERNAL_JSON=$( fetch_track internal)
78-
79- PROD=$( echo " $PROD_JSON " | jq ' .code' )
80- BETA=$( echo " $BETA_JSON " | jq ' .code' )
81- ALPHA=$( echo " $ALPHA_JSON " | jq ' .code' )
82- INTERNAL=$( echo " $INTERNAL_JSON " | jq ' .code' )
83-
84- PROD_NAME=$( echo " $PROD_JSON " | jq -r ' .name // empty' )
85- BETA_NAME=$( echo " $BETA_JSON " | jq -r ' .name // empty' )
86- ALPHA_NAME=$( echo " $ALPHA_JSON " | jq -r ' .name // empty' )
87- INTERNAL_NAME=$( echo " $INTERNAL_JSON " | jq -r ' .name // empty' )
88-
89- echo " Tracks: prod=$PROD ($PROD_NAME ) beta=$BETA ($BETA_NAME ) alpha=$ALPHA ($ALPHA_NAME ) internal=$INTERNAL ($INTERNAL_NAME )"
90-
91- curl -s -X DELETE " $BASE /edits/$EDIT_ID " -H " $AUTH " > /dev/null || true
92-
9384# --- helper: build a track object or null ---
9485track_obj () {
9586 local code=" $1 " name=" $2 "
@@ -101,17 +92,45 @@ track_obj() {
10192 fi
10293}
10394
95+ echo " Updating tracks: $TRACKS "
96+
97+ # --- read existing manifest as base ---
98+ mkdir -p " $( dirname " $MANIFEST_PATH " ) "
99+ if [ -f " $MANIFEST_PATH " ]; then
100+ EXISTING=$( cat " $MANIFEST_PATH " )
101+ else
102+ EXISTING=' {"tracks":{}}'
103+ fi
104+
105+ # --- for each track, either fetch fresh or preserve existing ---
106+ declare -A TRACK_OBJS
107+ for t in $ALL_TRACKS ; do
108+ if in_list " $t " " $TRACKS " ; then
109+ JSON=$( fetch_track " $t " )
110+ CODE=$( echo " $JSON " | jq ' .code' )
111+ NAME=$( echo " $JSON " | jq -r ' .name // empty' )
112+ TRACK_OBJS[$t ]=$( track_obj " $CODE " " $NAME " )
113+ echo " $t : fetched code=$CODE name=$NAME "
114+ else
115+ TRACK_OBJS[$t ]=$( echo " $EXISTING " | jq -c " .tracks.$t // null" )
116+ echo " $t : preserved from manifest"
117+ fi
118+ done
119+
120+ curl -s -X DELETE " $BASE /edits/$EDIT_ID " -H " $AUTH " > /dev/null || true
121+
104122# --- read previous prod ---
105- OLD_PROD=$( jq -r ' .tracks.production.versionCode // .tracks.production // empty' " $MANIFEST_PATH " 2> /dev/null || echo " " )
106- echo " Previous prod: ${OLD_PROD:- <none>} | New prod: $PROD "
123+ OLD_PROD=$( echo " $EXISTING " | jq -r ' .tracks.production.versionCode // .tracks.production // empty' 2> /dev/null || echo " " )
124+ NEW_PROD=$( echo " ${TRACK_OBJS[production]} " | jq -r ' .versionCode // empty' 2> /dev/null || echo " " )
125+ NEW_PROD_NAME=$( echo " ${TRACK_OBJS[production]} " | jq -r ' .versionName // empty' 2> /dev/null || echo " " )
126+ echo " Previous prod: ${OLD_PROD:- <none>} | Current prod: ${NEW_PROD:- <none>} (${NEW_PROD_NAME:- <none>} )"
107127
108128# --- write manifest ---
109- mkdir -p " $( dirname " $MANIFEST_PATH " ) "
110129jq -n \
111- --argjson production " $( track_obj " $PROD " " $PROD_NAME " ) " \
112- --argjson beta " $( track_obj " $BETA " " $BETA_NAME " ) " \
113- --argjson alpha " $( track_obj " $ALPHA " " $ALPHA_NAME " ) " \
114- --argjson internal " $( track_obj " $INTERNAL " " $INTERNAL_NAME " ) " \
130+ --argjson production " ${TRACK_OBJS[production]} " \
131+ --argjson beta " ${TRACK_OBJS[beta]} " \
132+ --argjson alpha " ${TRACK_OBJS[alpha]} " \
133+ --argjson internal " ${TRACK_OBJS[internal]} " \
115134 --arg updated " $( date -u +%FT%TZ) " \
116135 ' {updated: $updated, tracks: {production:$production, beta:$beta, alpha:$alpha, internal:$internal}}' \
117136 > " $MANIFEST_PATH "
@@ -120,17 +139,24 @@ echo "Manifest written:"
120139cat " $MANIFEST_PATH "
121140
122141emit " old_prod" " ${OLD_PROD:- null} "
123- emit " new_prod" " $PROD "
142+ emit " new_prod" " ${NEW_PROD:- null} "
143+ emit " new_prod_name" " ${NEW_PROD_NAME:- null} "
144+
145+ # --- decide whether to bump patch ---
146+ PROD_CHANGED=false
147+ if in_list " production" " $TRACKS " && [ " ${OLD_PROD:- null} " != " ${NEW_PROD:- null} " ]; then
148+ PROD_CHANGED=true
149+ fi
124150
125- # --- decide whether prod changed ---
126- if [ " $OLD_PROD " = " $PROD " ]; then
127- echo " Production unchanged, skipping patch bump"
151+ if [ " $FORCE_BUMP " != " true" ] && [ " $PROD_CHANGED " != " true" ]; then
152+ echo " Production unchanged and force_bump not set, skipping patch bump"
128153 emit " prod_changed" " false"
129154 exit 0
130155fi
131156
132- emit " prod_changed" " true"
133- echo " Production changed ($OLD_PROD -> $PROD ), bumping patch version"
157+ emit " prod_changed" " $PROD_CHANGED "
158+ emit " forced" " $FORCE_BUMP "
159+ echo " Bumping patch version (prod_changed=$PROD_CHANGED , forced=$FORCE_BUMP )"
134160
135161# --- bump patch version ---
136162KOTLIN_FILE=buildSrc/src/main/java/Packaging.kt
0 commit comments