react-native-insider 7.0.6 → 7.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/RNInsider.podspec +2 -2
  2. package/android/.gradle/8.13/checksums/checksums.lock +0 -0
  3. package/android/.gradle/8.13/checksums/md5-checksums.bin +0 -0
  4. package/android/.gradle/8.13/checksums/sha1-checksums.bin +0 -0
  5. package/android/.gradle/8.13/executionHistory/executionHistory.lock +0 -0
  6. package/android/.gradle/8.13/fileHashes/fileHashes.bin +0 -0
  7. package/android/.gradle/8.13/fileHashes/fileHashes.lock +0 -0
  8. package/android/.gradle/9.0-milestone-1/checksums/checksums.lock +0 -0
  9. package/android/.gradle/9.0-milestone-1/checksums/sha1-checksums.bin +0 -0
  10. package/android/.gradle/9.0-milestone-1/executionHistory/executionHistory.bin +0 -0
  11. package/android/.gradle/9.0-milestone-1/executionHistory/executionHistory.lock +0 -0
  12. package/android/.gradle/9.0-milestone-1/fileChanges/last-build.bin +0 -0
  13. package/android/.gradle/9.0-milestone-1/fileHashes/fileHashes.bin +0 -0
  14. package/android/.gradle/9.0-milestone-1/fileHashes/fileHashes.lock +0 -0
  15. package/android/.gradle/9.0-milestone-1/fileHashes/resourceHashesCache.bin +0 -0
  16. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  17. package/android/.gradle/buildOutputCleanup/cache.properties +2 -2
  18. package/android/.gradle/config.properties +1 -1
  19. package/android/.gradle/file-system.probe +0 -0
  20. package/android/build/reports/problems/problems-report.html +663 -0
  21. package/android/build.gradle +1 -1
  22. package/android/local.properties +2 -2
  23. package/devops/create_release_pull_request.sh +258 -0
  24. package/devops/generate_native_release_notes.sh +275 -0
  25. package/devops/github_deploy_release.sh +51 -13
  26. package/devops/release.sh +101 -0
  27. package/devops/update_version_number.sh +24 -2
  28. package/ios/RNInsider/RNUtils.m +0 -2
  29. package/ios/RNInsider.xcodeproj/project.xcworkspace/xcuserdata/ozgur.vatansever.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  30. package/package.json +1 -1
  31. package/react-native-insider-7.0.7.tgz +0 -0
  32. package/android/.gradle/8.10/checksums/checksums.lock +0 -0
  33. package/android/.gradle/8.10/fileHashes/fileHashes.lock +0 -0
  34. package/ios/RNInsider.xcodeproj/project.xcworkspace/xcuserdata/heysem.katibi.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  35. package/ios/RNInsider.xcodeproj/project.xcworkspace/xcuserdata/heysem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  36. package/ios/RNInsider.xcodeproj/xcuserdata/heysem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  37. package/ios/RNInsider.xcodeproj/xcuserdata/heysem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  38. /package/android/.gradle/{8.10 → 8.13}/fileChanges/last-build.bin +0 -0
  39. /package/android/.gradle/{8.10/dependencies-accessors → 8.13}/gc.properties +0 -0
  40. /package/android/.gradle/{8.10 → 9.0-milestone-1}/gc.properties +0 -0
  41. /package/ios/RNInsider.xcodeproj/xcuserdata/{heysem.katibi.xcuserdatad → ozgur.vatansever.xcuserdatad}/xcschemes/xcschememanagement.plist +0 -0
@@ -42,7 +42,7 @@ repositories {
42
42
 
43
43
  dependencies {
44
44
  implementation "com.facebook.react:react-native:${getVersionFromPartner('reactNativeVersion', '+')}"
45
- implementation 'com.useinsider:insider:15.2.1'
45
+ implementation 'com.useinsider:insider:15.2.3'
46
46
  implementation 'com.useinsider:insiderhybrid:1.3.4'
47
47
 
48
48
  implementation 'androidx.security:security-crypto:1.1.0-alpha06'
@@ -4,5 +4,5 @@
4
4
  # Location of the SDK. This is only used by Gradle.
5
5
  # For customization when using a Version Control System, please read the
6
6
  # header note.
7
- #Tue Apr 08 11:19:03 TRT 2025
8
- sdk.dir=/Users/heysem/Library/Android/sdk
7
+ #Wed Jul 02 14:27:03 TRT 2025
8
+ sdk.dir=/Users/ozgur.vatansever/Library/Android/sdk
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ usage() {
5
+ cat <<EOF
6
+ Kullanım: $(basename "$0") --repository <repository> --version <version> [opsiyonlar]
7
+
8
+ Zorunlu:
9
+ -r, --repository <git-repository>
10
+ -v, --version <release-version>
11
+
12
+ Opsiyonel:
13
+ -t, --task <jira-task> (tekrar verilebilir)
14
+ -b, --branch <branch-name> (tekrar verilebilir)
15
+ --is-nh (NH versiyonu için)
16
+
17
+ Örnekler:
18
+ $(basename "$0") --repository react-native-insider --version 7.1.0 --task MOB-1234 --task MOB-2345
19
+ $(basename "$0") --repository react-native-insider --version 7.1.0 --branch feature/MOB-123 --branch epic/webview
20
+ $(basename "$0") --repository react-native-insider --version 7.1.0-nh --is-nh --task MOB-1234
21
+ EOF
22
+ }
23
+
24
+ TASKS=()
25
+ GIT_REPOSITORY=""
26
+ GIT_BRANCHES=()
27
+ GIT_TARGET_BRANCH="develop"
28
+ GIT_BASE_BRANCH="master"
29
+ GIT_PULL_REQUESTS=()
30
+ RELEASE_VERSION=""
31
+ IS_NH="false"
32
+
33
+ while [[ $# -gt 0 ]]; do
34
+ case "$1" in
35
+ -r|--repository) GIT_REPOSITORY="$2"; shift 2;;
36
+ -v|--version) RELEASE_VERSION="$2"; shift 2;;
37
+ -t|--task) TASKS+=("$2"); shift 2;;
38
+ -b|--branch) GIT_BRANCHES+=("$2"); shift 2;;
39
+ --is-nh) IS_NH="true"; shift;;
40
+ -h|--help) usage; exit 0;;
41
+ *) echo "⛔ Error: Bilinmeyen argüman: $1"; usage; exit 1;;
42
+ esac
43
+ done
44
+
45
+ if [[ -z "${GIT_REPOSITORY}" || -z "${RELEASE_VERSION}" ]]; then
46
+ echo "⛔ Error: --repository ve --version zorunludur."
47
+ usage; exit 1
48
+ fi
49
+
50
+ # NH version kontrolü
51
+ if [[ "${IS_NH}" == "true" ]]; then
52
+ GIT_TARGET_BRANCH="develop-nh"
53
+ GIT_BASE_BRANCH="master-nh"
54
+ if [[ ! "${RELEASE_VERSION}" == *-nh ]]; then
55
+ echo "⚠️ Warning: NH versiyonu için version '-nh' suffix'i ile bitmeli. Otomatik ekleniyor..."
56
+ RELEASE_VERSION="${RELEASE_VERSION}-nh"
57
+ fi
58
+ elif [[ "${RELEASE_VERSION}" == *-nh ]]; then
59
+ echo "⚠️ Warning: Version '-nh' ile bitiyor ama --is-nh flag'i verilmemiş. IS_NH=true olarak ayarlanıyor..."
60
+ IS_NH="true"
61
+ GIT_TARGET_BRANCH="develop-nh"
62
+ GIT_BASE_BRANCH="master-nh"
63
+ fi
64
+
65
+ echo "ℹ️ Project: $(git rev-parse --show-toplevel)"
66
+ echo "ℹ️ Target Branch: ${GIT_TARGET_BRANCH}"
67
+ echo "ℹ️ Base Branch: ${GIT_BASE_BRANCH}"
68
+ echo "ℹ️ Release Version: ${RELEASE_VERSION}"
69
+
70
+ # JIRA task'lardan branch'leri bul
71
+ if [[ ${#TASKS[@]} -gt 0 ]]; then
72
+ for task in "${TASKS[@]}"; do
73
+ echo "🔍 JIRA'dan talep edildi: ${task}"
74
+ response="$(acli jira workitem view "${task}" --fields summary,customfield_14159 --json)"
75
+ summary="$(jq -r '.fields.summary' <<< "${response}")"
76
+ while IFS=' ' read -r url; do
77
+ read owner repository pullRequest <<< "$(
78
+ sed -E 's#.*github.com/([^/]+)/([^/]+)/pull/([0-9]+).*#\1 \2 \3#' <<< "${url}"
79
+ )"
80
+ if [[ "${repository}" != "${GIT_REPOSITORY}" ]]; then
81
+ echo "⚠️ Warning: Branch bulunamadı: ${repository} (beklenen: ${GIT_REPOSITORY})"
82
+ else
83
+ branch=$(gh pr view "${pullRequest}" --repo "${owner}/${repository}" \
84
+ --json headRefName --jq .headRefName)
85
+ GIT_BRANCHES+=("$branch")
86
+ GIT_PULL_REQUESTS+=("$url")
87
+ echo "✅ Branch <${branch}> ${summary}"
88
+ fi
89
+ done < <(
90
+ jq -r '.fields.customfield_14159.content[].content[]?.marks[]?.attrs.href // empty' <<< "${response}" \
91
+ | sed -E 's#/files$##' \
92
+ | grep -E 'github\.com/.+/pull/[0-9]+'
93
+ )
94
+ done
95
+ fi
96
+
97
+ # Octopus merge stratejisi (parallel merge)
98
+ octopus_merge() {
99
+ local dry_run="${3:-true}"
100
+ local working_directory="$(git rev-parse --show-toplevel)"
101
+ local target_branch="${1}"
102
+ local -a source_branches=()
103
+ read -r -a source_branches <<< "${2//,/ }"
104
+ if [[ "${dry_run}" == "true" ]]; then
105
+ working_directory="$(mktemp -d)"
106
+ git worktree add --detach "${working_directory}" "origin/${target_branch}" >/dev/null
107
+ trap "git worktree remove --force '${working_directory}' 2>/dev/null || true" RETURN
108
+ git -C "${working_directory}" fetch --prune --tags origin +refs/heads/*:refs/remotes/origin/*
109
+ git -C "${working_directory}" checkout --detach "refs/remotes/origin/${target_branch}" >/dev/null
110
+ fi
111
+ echo "🐙 Birleştirilecek (parallel): ${source_branches[*]} → ${working_directory}"
112
+ echo "🐙 Birleştiriliyor... ${source_branches[*]}"
113
+ if [[ "${dry_run}" == "true" ]]; then
114
+ if git -C "${working_directory}" merge --no-ff --no-commit "${source_branches[@]/#/origin/}" ; then
115
+ echo "✅ Birleştirildi: ${source_branches[*]}"
116
+ git -C "${working_directory}" merge --abort 2>/dev/null; return 0
117
+ else
118
+ echo "⛔ Error: Birleştirme başarısız: ${source_branches[*]}"
119
+ git -C "${working_directory}" merge --abort 2>/dev/null; return 1
120
+ fi
121
+ else
122
+ git -C "${working_directory}" merge --no-ff "${source_branches[@]/#/origin/}" \
123
+ --message "Merge branch ${source_branches[*]} into ${target_branch}"
124
+ fi
125
+ }
126
+
127
+ # Sequential merge stratejisi (sıralı merge)
128
+ sequential_merge() {
129
+ local dry_run="${3:-true}"
130
+ local working_directory="$(git rev-parse --show-toplevel)"
131
+ local target_branch="${1}"
132
+ local -a source_branches=()
133
+ read -r -a source_branches <<< "${2//,/ }"
134
+ if [[ "${dry_run}" == "true" ]]; then
135
+ working_directory="$(mktemp -d)"
136
+ git worktree add --detach "${working_directory}" "origin/${target_branch}" >/dev/null
137
+ trap "git worktree remove --force '${working_directory}' 2>/dev/null || true" RETURN
138
+ git -C "${working_directory}" fetch --prune --tags origin +refs/heads/*:refs/remotes/origin/*
139
+ git -C "${working_directory}" checkout --detach "refs/remotes/origin/${target_branch}" >/dev/null
140
+ fi
141
+ echo "➡️ Birleştirilecek (sequential): ${source_branches[*]} → ${working_directory}"
142
+ local -a merged_branches=()
143
+ local -a pending_branches=("${source_branches[@]}")
144
+ local changed=1
145
+ while (( changed > 0)) && (( ${#pending_branches[@]} > 0 )); do
146
+ changed=0
147
+ local -a next_pending=()
148
+ for branch in "${pending_branches[@]}"; do
149
+ echo "➡️ Birleştiriliyor... ${branch}"
150
+ if [[ "${dry_run}" == "true" ]]; then
151
+ if git -C "${working_directory}" merge --no-ff --no-commit "origin/${branch}" >/dev/null; then
152
+ git -C "${working_directory}" commit --no-edit
153
+ merged_branches+=("${branch}"); changed=1
154
+ echo "✅ Birleştirildi: ${branch}"
155
+ else
156
+ git -C "${working_directory}" merge --abort 2>/dev/null
157
+ next_pending+=("${branch}")
158
+ echo "⛔ Error: Birleştirme başarısız: ${branch}"
159
+ fi
160
+ else
161
+ git -C "${working_directory}" merge --no-ff "origin/${branch}" \
162
+ --message "Merge branch ${branch} into ${target_branch}"
163
+ merged_branches+=("${branch}"); changed=1
164
+ echo "✅ Birleştirildi: ${branch}"
165
+ fi
166
+ done
167
+ if (( ${#next_pending[@]} > 0 )); then
168
+ pending_branches=("${next_pending[@]-}")
169
+ else
170
+ changed=0; pending_branches=()
171
+ fi
172
+ done
173
+ if [[ "${dry_run}" == "true" ]]; then
174
+ git -C "${working_directory}" merge --abort 2>/dev/null
175
+ fi
176
+ return $(( ${#pending_branches[@]} == 0 ? 0 : 1 ))
177
+ }
178
+
179
+ if [[ ${#GIT_BRANCHES[@]} -eq 0 ]]; then
180
+ echo "⚠️ Warning: Birleştirilecek branch yok, sadece release oluşturulacak."
181
+ else
182
+ # Merge stratejisini belirle (dry-run ile test et)
183
+ MERGE_STRATEGY=""
184
+ if octopus_merge "${GIT_TARGET_BRANCH}" "${GIT_BRANCHES[*]}" "true"; then
185
+ MERGE_STRATEGY="parallel"
186
+ else
187
+ echo "⚠️ Warning: Parallel merge başarısız, sequential merge deneniyor..."
188
+ if sequential_merge "${GIT_TARGET_BRANCH}" "${GIT_BRANCHES[*]}" "true"; then
189
+ MERGE_STRATEGY="sequential"
190
+ else
191
+ echo "⛔ Error: Merge işlemi başarısız, çıkılıyor."
192
+ exit 1
193
+ fi
194
+ fi
195
+ echo "ℹ️ Merge için belirlenen strateji: ${MERGE_STRATEGY}"
196
+ fi
197
+
198
+ # Git hazırlık
199
+ git fetch --all --prune || true
200
+ git clean -fdx || true
201
+
202
+ # Target branch'e geç
203
+ if git rev-parse --verify "refs/heads/${GIT_TARGET_BRANCH}" >/dev/null 2>&1; then
204
+ git switch "${GIT_TARGET_BRANCH}"
205
+ else
206
+ git switch --track -c "${GIT_TARGET_BRANCH}" "origin/${GIT_TARGET_BRANCH}"
207
+ fi
208
+
209
+ git reset --hard "origin/${GIT_TARGET_BRANCH}"
210
+
211
+ if [[ ${#GIT_BRANCHES[@]} -eq 0 ]]; then
212
+ echo "⚠️ Warning: Birleştirilecek branch yok, sadece release oluşturulacak."
213
+ else
214
+ # Merge işlemini gerçekleştir
215
+ echo "ℹ️ Merge ediliyor... (${MERGE_STRATEGY})"
216
+ if [[ "${MERGE_STRATEGY}" == "parallel" ]]; then
217
+ octopus_merge "${GIT_TARGET_BRANCH}" "${GIT_BRANCHES[*]}" "false"
218
+ else
219
+ sequential_merge "${GIT_TARGET_BRANCH}" "${GIT_BRANCHES[*]}" "false"
220
+ fi
221
+ fi
222
+
223
+ # Target branch'i push et
224
+ echo "ℹ️ Branch <${GIT_TARGET_BRANCH}> gönderiliyor..."
225
+ git push origin "${GIT_TARGET_BRANCH}"
226
+
227
+ # Release branch oluştur
228
+ GIT_RELEASE_BRANCH="release/${RELEASE_VERSION}"
229
+
230
+ echo "ℹ️ Release oluşturuluyor: ${GIT_TARGET_BRANCH} → ${GIT_RELEASE_BRANCH}"
231
+
232
+ git switch -c "${GIT_RELEASE_BRANCH}" "${GIT_TARGET_BRANCH}"
233
+ if ! git log --oneline "origin/${GIT_BASE_BRANCH}..${GIT_RELEASE_BRANCH}" | grep -q .; then
234
+ git commit -S --allow-empty -m "chore: create release branch ${GIT_RELEASE_BRANCH}"
235
+ fi
236
+ git push -u origin "${GIT_RELEASE_BRANCH}"
237
+
238
+ # Pull Request oluştur
239
+ echo "ℹ️ Pull Request yaratılıyor: ${GIT_BASE_BRANCH} ← ${GIT_RELEASE_BRANCH}"
240
+
241
+ printf -v GIT_PULL_REQUEST_BODY 'Automated release: `%s`\n\n' "${GIT_RELEASE_BRANCH}"
242
+ if [[ ${#GIT_PULL_REQUESTS[@]} -gt 0 ]]; then
243
+ for pullRequest in "${GIT_PULL_REQUESTS[@]}"; do
244
+ # Extract PR number from URL: https://github.com/owner/repo/pull/123 -> #123
245
+ prNumber=$(sed -E 's#.*/pull/([0-9]+).*#\1#' <<< "${pullRequest}")
246
+ printf -v GIT_PULL_REQUEST_BODY '%s- [#%s](%s)\n' "${GIT_PULL_REQUEST_BODY}" "${prNumber}" "${pullRequest}"
247
+ done
248
+ fi
249
+
250
+ gh pr create \
251
+ --repo "useinsider/${GIT_REPOSITORY}" \
252
+ --base "${GIT_BASE_BRANCH}" \
253
+ --head "${GIT_RELEASE_BRANCH}" \
254
+ --title "Release ${RELEASE_VERSION}" \
255
+ --body "${GIT_PULL_REQUEST_BODY}" \
256
+ --assignee "insider-automation"
257
+
258
+ echo "✅ Pull Request yaratıldı: ${GIT_RELEASE_BRANCH}"
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ usage() {
5
+ cat <<EOF
6
+ Kullanım: $(basename "$0") [opsiyonlar]
7
+
8
+ Opsiyonel:
9
+ --previous-version <version> Önceki RN version (belirtilmezse git'ten bulunur)
10
+ --current-version <version> Güncel RN version (belirtilmezse package.json'dan alınır)
11
+
12
+ Örnekler:
13
+ $(basename "$0")
14
+ $(basename "$0") --previous-version 7.0.0 --current-version 7.1.0
15
+ EOF
16
+ }
17
+
18
+ PREVIOUS_VERSION=""
19
+ CURRENT_VERSION=""
20
+
21
+ while [[ $# -gt 0 ]]; do
22
+ case "$1" in
23
+ --previous-version) PREVIOUS_VERSION="$2"; shift 2;;
24
+ --current-version) CURRENT_VERSION="$2"; shift 2;;
25
+ -h|--help) usage; exit 0;;
26
+ *) echo "⛔ Error: Bilinmeyen argüman: $1" >&2; usage; exit 1;;
27
+ esac
28
+ done
29
+
30
+ PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
31
+ PACKAGE_FILE="${PROJECT_ROOT}/package.json"
32
+ PODSPEC_FILE="${PROJECT_ROOT}/RNInsider.podspec"
33
+ GRADLE_FILE="${PROJECT_ROOT}/android/build.gradle"
34
+
35
+ # Güncel versiyonu al
36
+ if [[ -z "${CURRENT_VERSION}" ]]; then
37
+ CURRENT_VERSION="$(sed -nE 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/p' "${PACKAGE_FILE}" | head -n1)"
38
+ fi
39
+
40
+ # Önceki versiyonu al (git tag'lerden)
41
+ if [[ -z "${PREVIOUS_VERSION}" ]]; then
42
+ # NH olmayan en son tag'i bul
43
+ PREVIOUS_VERSION="$(git tag --sort=-version:refname | grep -v '\-nh$' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n2 | tail -n1 || echo "")"
44
+ if [[ -z "${PREVIOUS_VERSION}" ]]; then
45
+ echo "⚠️ Warning: Önceki versiyon bulunamadı, native SDK notes oluşturulamayacak." >&2
46
+ exit 0
47
+ fi
48
+ fi
49
+
50
+ echo "ℹ️ Önceki RN Versiyon: ${PREVIOUS_VERSION}" >&2
51
+ echo "ℹ️ Güncel RN Versiyon: ${CURRENT_VERSION}" >&2
52
+
53
+ # Önceki versiyon için native SDK versiyonlarını al (git checkout ile)
54
+ get_previous_native_versions() {
55
+ local version=$1
56
+ local temp_dir="$(mktemp -d)"
57
+ trap "rm -rf '${temp_dir}'" RETURN
58
+
59
+ # Önceki versiyonu checkout et
60
+ git archive "${version}" | tar -x -C "${temp_dir}" 2>/dev/null || return 1
61
+
62
+ # Android versiyonlarını al
63
+ PREV_ANDROID_INSIDER="$(sed -nE 's/^[[:space:]]*(implementation|api|compileOnly|runtimeOnly)[[:space:]]+['\''"]com\.useinsider:insider:([^'\''"]+)['\''"]/\2/p' "${temp_dir}/android/build.gradle" | head -n1 || echo "")"
64
+ PREV_ANDROID_HYBRID="$(sed -nE 's/^[[:space:]]*(implementation|api|compileOnly|runtimeOnly)[[:space:]]+['\''"]com\.useinsider:insiderhybrid:([^'\''"]+)['\''"]/\2/p' "${temp_dir}/android/build.gradle" | head -n1 || echo "")"
65
+
66
+ # iOS versiyonlarını al
67
+ PREV_IOS_MOBILE="$(sed -nE "s/^[[:space:]]*s\.dependency[[:space:]]*['\"]InsiderMobile['\"][[:space:]]*,[[:space:]]*['\"]([^'\"#]+)['\"]/\1/p" "${temp_dir}/RNInsider.podspec" | head -n1 || echo "")"
68
+ PREV_IOS_GEOFENCE="$(sed -nE "s/^[[:space:]]*s\.dependency[[:space:]]*['\"]InsiderGeofence['\"][[:space:]]*,[[:space:]]*['\"]([^'\"#]+)['\"]/\1/p" "${temp_dir}/RNInsider.podspec" | head -n1 || echo "")"
69
+ PREV_IOS_HYBRID="$(sed -nE "s/^[[:space:]]*s\.dependency[[:space:]]*['\"]InsiderHybrid['\"][[:space:]]*,[[:space:]]*['\"]([^'\"#]+)['\"]/\1/p" "${temp_dir}/RNInsider.podspec" | head -n1 || echo "")"
70
+ }
71
+
72
+ # Güncel native SDK versiyonlarını al
73
+ CURR_ANDROID_INSIDER="$(sed -nE 's/^[[:space:]]*(implementation|api|compileOnly|runtimeOnly)[[:space:]]+['\''"]com\.useinsider:insider:([^'\''"]+)['\''"]/\2/p' "${GRADLE_FILE}" | head -n1 || echo "")"
74
+ CURR_ANDROID_HYBRID="$(sed -nE 's/^[[:space:]]*(implementation|api|compileOnly|runtimeOnly)[[:space:]]+['\''"]com\.useinsider:insiderhybrid:([^'\''"]+)['\''"]/\2/p' "${GRADLE_FILE}" | head -n1 || echo "")"
75
+
76
+ CURR_IOS_MOBILE="$(sed -nE "s/^[[:space:]]*s\.dependency[[:space:]]*['\"]InsiderMobile['\"][[:space:]]*,[[:space:]]*['\"]([^'\"#]+)['\"]/\1/p" "${PODSPEC_FILE}" | head -n1 || echo "")"
77
+ CURR_IOS_GEOFENCE="$(sed -nE "s/^[[:space:]]*s\.dependency[[:space:]]*['\"]InsiderGeofence['\"][[:space:]]*,[[:space:]]*['\"]([^'\"#]+)['\"]/\1/p" "${PODSPEC_FILE}" | head -n1 || echo "")"
78
+ CURR_IOS_HYBRID="$(sed -nE "s/^[[:space:]]*s\.dependency[[:space:]]*['\"]InsiderHybrid['\"][[:space:]]*,[[:space:]]*['\"]([^'\"#]+)['\"]/\1/p" "${PODSPEC_FILE}" | head -n1 || echo "")"
79
+
80
+ # Önceki versiyonları al
81
+ get_previous_native_versions "${PREVIOUS_VERSION}" || {
82
+ echo "⚠️ Warning: Önceki versiyon tag'i bulunamadı, native SDK karşılaştırması yapılamıyor." >&2
83
+ exit 0
84
+ }
85
+
86
+ echo "ℹ️ Android Insider: ${PREV_ANDROID_INSIDER} → ${CURR_ANDROID_INSIDER}" >&2
87
+ echo "ℹ️ Android Hybrid: ${PREV_ANDROID_HYBRID} → ${CURR_ANDROID_HYBRID}" >&2
88
+ echo "ℹ️ iOS Mobile: ${PREV_IOS_MOBILE} → ${CURR_IOS_MOBILE}" >&2
89
+ echo "ℹ️ iOS Geofence: ${PREV_IOS_GEOFENCE} → ${CURR_IOS_GEOFENCE}" >&2
90
+ echo "ℹ️ iOS Hybrid: ${PREV_IOS_HYBRID} → ${CURR_IOS_HYBRID}" >&2
91
+
92
+ # Android tag'lerini topla
93
+ collect_android_tags() {
94
+ local prev_version=$1
95
+ local curr_version=$2
96
+ local module=$3
97
+
98
+ if [[ -z "${prev_version}" ]] || [[ -z "${curr_version}" ]]; then
99
+ return 0
100
+ fi
101
+
102
+ # Version aynıysa skip et
103
+ if [[ "${prev_version}" == "${curr_version}" ]]; then
104
+ return 0
105
+ fi
106
+
107
+ # mobileandroid repo'sundan tag'leri al
108
+ local tags="$(gh api repos/useinsider/mobileandroid/tags --paginate \
109
+ | jq -r '.[].name' \
110
+ | grep -E "^${module}/[0-9]+\.[0-9]+\.[0-9]+$" \
111
+ | sed "s|^${module}/||" \
112
+ | sort -V \
113
+ || echo "")"
114
+
115
+ # Version range'i filtrele
116
+ echo "${tags}" | awk -v prev="${prev_version}" -v curr="${curr_version}" '
117
+ function version_compare(v1, v2) {
118
+ split(v1, a, ".")
119
+ split(v2, b, ".")
120
+ for (i = 1; i <= 3; i++) {
121
+ if (a[i] < b[i]) return -1
122
+ if (a[i] > b[i]) return 1
123
+ }
124
+ return 0
125
+ }
126
+ {
127
+ if (version_compare($1, prev) > 0 && version_compare($1, curr) <= 0) {
128
+ print $1
129
+ }
130
+ }
131
+ '
132
+ }
133
+
134
+ # iOS tag'lerini topla (CocoaPods trunk'tan)
135
+ collect_ios_tags() {
136
+ local prev_version=$1
137
+ local curr_version=$2
138
+ local module=$3
139
+
140
+ if [[ -z "${prev_version}" ]] || [[ -z "${curr_version}" ]]; then
141
+ return 0
142
+ fi
143
+
144
+ # Version aynıysa skip et
145
+ if [[ "${prev_version}" == "${curr_version}" ]]; then
146
+ return 0
147
+ fi
148
+
149
+ # Pod trunk'tan versiyonları al
150
+ local versions="$(pod trunk info "${module}" 2>/dev/null \
151
+ | sed -nE 's/^[[:space:]]*-[[:space:]]*([^[:space:]]+)[[:space:]]*\(([^)]+)\).*/\2/p' \
152
+ | grep -v '\-' \
153
+ | sort -V \
154
+ || echo "")"
155
+
156
+ # Version range'i filtrele
157
+ echo "${versions}" | awk -v prev="${prev_version}" -v curr="${curr_version}" '
158
+ function version_compare(v1, v2) {
159
+ split(v1, a, ".")
160
+ split(v2, b, ".")
161
+ for (i = 1; i <= 3; i++) {
162
+ if (a[i] < b[i]) return -1
163
+ if (a[i] > b[i]) return 1
164
+ }
165
+ return 0
166
+ }
167
+ {
168
+ if (version_compare($1, prev) > 0 && version_compare($1, curr) <= 0) {
169
+ print $1
170
+ }
171
+ }
172
+ '
173
+ }
174
+
175
+ # Release notes başlangıç
176
+ echo "## 📦 Native SDK Updates"
177
+ echo ""
178
+
179
+ HAS_UPDATES="false"
180
+
181
+ # Android Insider updates
182
+ if [[ -n "${PREV_ANDROID_INSIDER}" ]] && [[ -n "${CURR_ANDROID_INSIDER}" ]] && [[ "${PREV_ANDROID_INSIDER}" != "${CURR_ANDROID_INSIDER}" ]]; then
183
+ HAS_UPDATES="true"
184
+ echo "### Android SDK Updates (insider: ${PREV_ANDROID_INSIDER} → ${CURR_ANDROID_INSIDER})"
185
+ echo ""
186
+
187
+ ANDROID_TAGS="$(collect_android_tags "${PREV_ANDROID_INSIDER}" "${CURR_ANDROID_INSIDER}" "insider")"
188
+ if [[ -n "${ANDROID_TAGS}" ]]; then
189
+ while IFS= read -r tag; do
190
+ if [[ -n "${tag}" ]]; then
191
+ # GitHub release notes'u al (insider modülü için tag formatı: insider/VERSION)
192
+ RELEASE_BODY="$(gh api "repos/useinsider/mobileandroid/releases/tags/insider/${tag}" --jq '.body' 2>/dev/null || echo "")"
193
+ if [[ -n "${RELEASE_BODY}" ]]; then
194
+ echo "#### [${tag}](https://github.com/useinsider/mobileandroid/releases/tag/insider/${tag})"
195
+ echo "${RELEASE_BODY}"
196
+ echo ""
197
+ else
198
+ echo "- **${tag}**: [Release Notes](https://github.com/useinsider/mobileandroid/releases/tag/insider/${tag})"
199
+ fi
200
+ fi
201
+ done <<< "${ANDROID_TAGS}"
202
+ else
203
+ echo "- Updated to version ${CURR_ANDROID_INSIDER}"
204
+ echo ""
205
+ fi
206
+ fi
207
+
208
+ # Android Hybrid updates
209
+ if [[ -n "${PREV_ANDROID_HYBRID}" ]] && [[ -n "${CURR_ANDROID_HYBRID}" ]] && [[ "${PREV_ANDROID_HYBRID}" != "${CURR_ANDROID_HYBRID}" ]]; then
210
+ HAS_UPDATES="true"
211
+ echo "### Android SDK Updates (insiderhybrid: ${PREV_ANDROID_HYBRID} → ${CURR_ANDROID_HYBRID})"
212
+ echo ""
213
+
214
+ ANDROID_HYBRID_TAGS="$(collect_android_tags "${PREV_ANDROID_HYBRID}" "${CURR_ANDROID_HYBRID}" "insiderhybrid")"
215
+ if [[ -n "${ANDROID_HYBRID_TAGS}" ]]; then
216
+ while IFS= read -r tag; do
217
+ if [[ -n "${tag}" ]]; then
218
+ RELEASE_BODY="$(gh api "repos/useinsider/mobileandroid/releases/tags/insiderhybrid/${tag}" --jq '.body' 2>/dev/null || echo "")"
219
+ if [[ -n "${RELEASE_BODY}" ]]; then
220
+ echo "#### [insiderhybrid/${tag}](https://github.com/useinsider/mobileandroid/releases/tag/insiderhybrid/${tag})"
221
+ echo "${RELEASE_BODY}"
222
+ echo ""
223
+ else
224
+ echo "- **${tag}**: [Release Notes](https://github.com/useinsider/mobileandroid/releases/tag/insiderhybrid/${tag})"
225
+ fi
226
+ fi
227
+ done <<< "${ANDROID_HYBRID_TAGS}"
228
+ else
229
+ echo "- Updated to version ${CURR_ANDROID_HYBRID}"
230
+ echo ""
231
+ fi
232
+ fi
233
+
234
+ # iOS Mobile updates
235
+ if [[ -n "${PREV_IOS_MOBILE}" ]] && [[ -n "${CURR_IOS_MOBILE}" ]] && [[ "${PREV_IOS_MOBILE}" != "${CURR_IOS_MOBILE}" ]]; then
236
+ HAS_UPDATES="true"
237
+ echo "### iOS SDK Updates (InsiderMobile: ${PREV_IOS_MOBILE} → ${CURR_IOS_MOBILE})"
238
+ echo ""
239
+
240
+ IOS_MOBILE_TAGS="$(collect_ios_tags "${PREV_IOS_MOBILE}" "${CURR_IOS_MOBILE}" "InsiderMobile")"
241
+ if [[ -n "${IOS_MOBILE_TAGS}" ]]; then
242
+ while IFS= read -r tag; do
243
+ if [[ -n "${tag}" ]]; then
244
+ echo "- **${tag}**: [CocoaPods](https://cocoapods.org/pods/InsiderMobile)"
245
+ fi
246
+ done <<< "${IOS_MOBILE_TAGS}"
247
+ echo ""
248
+ else
249
+ echo "- Updated to version ${CURR_IOS_MOBILE}"
250
+ echo ""
251
+ fi
252
+ fi
253
+
254
+ # iOS Geofence updates
255
+ if [[ -n "${PREV_IOS_GEOFENCE}" ]] && [[ -n "${CURR_IOS_GEOFENCE}" ]] && [[ "${PREV_IOS_GEOFENCE}" != "${CURR_IOS_GEOFENCE}" ]]; then
256
+ HAS_UPDATES="true"
257
+ echo "### iOS SDK Updates (InsiderGeofence: ${PREV_IOS_GEOFENCE} → ${CURR_IOS_GEOFENCE})"
258
+ echo ""
259
+ echo "- Updated to version ${CURR_IOS_GEOFENCE}"
260
+ echo ""
261
+ fi
262
+
263
+ # iOS Hybrid updates
264
+ if [[ -n "${PREV_IOS_HYBRID}" ]] && [[ -n "${CURR_IOS_HYBRID}" ]] && [[ "${PREV_IOS_HYBRID}" != "${CURR_IOS_HYBRID}" ]]; then
265
+ HAS_UPDATES="true"
266
+ echo "### iOS SDK Updates (InsiderHybrid: ${PREV_IOS_HYBRID} → ${CURR_IOS_HYBRID})"
267
+ echo ""
268
+ echo "- Updated to version ${CURR_IOS_HYBRID}"
269
+ echo ""
270
+ fi
271
+
272
+ if [[ "${HAS_UPDATES}" == "false" ]]; then
273
+ echo "No native SDK updates in this release."
274
+ echo ""
275
+ fi
@@ -44,12 +44,10 @@ if [[ -z "${LIBRARY_ZIP}" ]]; then
44
44
  usage; exit 1
45
45
  fi
46
46
 
47
- # Dry run method
47
+ # Execute commands directly (no dry-run mode for GitHub releases)
48
48
  run() {
49
49
  echo "+ $*"
50
- if [[ "${DRY_RUN}" == "false" ]]; then
51
- eval "$@"
52
- fi
50
+ eval "$@"
53
51
  }
54
52
 
55
53
  PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
@@ -58,19 +56,40 @@ CURRENT_VERSION_NUMBER="$(sed -nE 's/^[[:space:]]*"version"[[:space:]]*:[[:space
58
56
 
59
57
  echo "ℹ️ (Github) Güncel versiyon: ${CURRENT_VERSION_NUMBER}"
60
58
 
61
- if gh release view "${CURRENT_VERSION_NUMBER}" >/dev/null 2>&1; then
62
- if [[ "${DRY_RUN}" == "false" ]]; then
63
- echo "⛔ (Github) Error: Bu version halihazırda mevcut: ${CURRENT_VERSION_NUMBER}"
64
- exit 1
59
+ IS_NH_VERSION="false"
60
+ RELEASE_NAME="${CURRENT_VERSION_NUMBER}"
61
+ if [[ "${CURRENT_VERSION_NUMBER}" == *-nh ]]; then
62
+ echo "ℹ️ (Github) -nh versiyonu tespit edildi."
63
+ IS_NH_VERSION="true"
64
+ RELEASE_NAME="${CURRENT_VERSION_NUMBER%-nh}"
65
+ fi
66
+
67
+ if [[ "${IS_NH_VERSION}" == "false" ]]; then
68
+ if gh release view "${RELEASE_NAME}" >/dev/null 2>&1; then
69
+ if [[ "${DRY_RUN}" == "false" ]]; then
70
+ echo "⛔ (Github) Error: Bu version halihazırda mevcut: ${RELEASE_NAME}"
71
+ exit 1
72
+ else
73
+ echo "⚠️ (Github) Warning: Bu version halihazırda mevcut: ${RELEASE_NAME} (dry-run modunda atlanıyor.)"
74
+ fi
75
+ fi
76
+ else
77
+ if gh release view "${RELEASE_NAME}" >/dev/null 2>&1; then
78
+ echo "✅ (Github) Version mevcut: ${RELEASE_NAME}"
65
79
  else
66
- echo "⚠️ (Github) Warning: Bu version halihazırda mevcut: ${CURRENT_VERSION_NUMBER} (dry-run modunda atlanıyor.)"
80
+ if [[ "${DRY_RUN}" == "false" ]]; then
81
+ echo "⛔ (Github) Error: Bu version bulunamadı: ${RELEASE_NAME}"
82
+ exit 1
83
+ else
84
+ echo "⚠️ (Github) Warning: Bu version bulunamadı: ${RELEASE_NAME} (dry-run modunda atlanıyor.)"
85
+ fi
67
86
  fi
68
87
  fi
69
88
 
70
89
  RELEASE_EXTRA_FLAGS=""
71
90
 
72
91
  if [[ -z "${RELEASE_TITLE}" ]]; then
73
- RELEASE_EXTRA_FLAGS+="--title \"${CURRENT_VERSION_NUMBER}\""
92
+ RELEASE_EXTRA_FLAGS+="--title \"${RELEASE_NAME}\""
74
93
  else
75
94
  RELEASE_EXTRA_FLAGS+="--title \"${RELEASE_TITLE}\""
76
95
  fi
@@ -82,16 +101,35 @@ elif [[ -n "${RELEASE_NOTES_FILE}" ]]; then
82
101
  echo "⛔ (Github) Error: Not dosyası bulunamadı: ${RELEASE_NOTES_FILE}"
83
102
  exit 1
84
103
  fi
85
- RELEASE_EXTRA_FLAGS+=" --notes-file \"${RELEASE_NOTES_FILE}\""
104
+ # Release notes dosyasını oku ve GitHub notes ile birleştir
105
+ TEMP_COMBINED_NOTES="$(mktemp)"
106
+ trap "rm -f '${TEMP_COMBINED_NOTES}'" EXIT
107
+
108
+ # Dosyadan notları al
109
+ cat "${RELEASE_NOTES_FILE}" > "${TEMP_COMBINED_NOTES}"
110
+ echo "" >> "${TEMP_COMBINED_NOTES}"
111
+ echo "---" >> "${TEMP_COMBINED_NOTES}"
112
+ echo "" >> "${TEMP_COMBINED_NOTES}"
113
+
114
+ # Auto-generated notes ekle
115
+ echo "## What's Changed" >> "${TEMP_COMBINED_NOTES}"
116
+ gh api "repos/{owner}/{repo}/releases/generate-notes" \
117
+ -f tag_name="${CURRENT_VERSION_NUMBER}" \
118
+ -f target_commitish="$(git rev-parse HEAD)" \
119
+ --jq '.body' >> "${TEMP_COMBINED_NOTES}" 2>/dev/null || echo "Auto-generated release notes could not be created." >> "${TEMP_COMBINED_NOTES}"
120
+
121
+ RELEASE_EXTRA_FLAGS+=" --notes-file \"${TEMP_COMBINED_NOTES}\""
86
122
  else
87
123
  RELEASE_EXTRA_FLAGS+=" --generate-notes"
88
124
  fi
89
125
 
90
- run "gh release create \"${CURRENT_VERSION_NUMBER}\" ${RELEASE_EXTRA_FLAGS}"
126
+ if [[ "${IS_NH_VERSION}" == "false" ]]; then
127
+ run "gh release create \"${RELEASE_NAME}\" ${RELEASE_EXTRA_FLAGS}"
128
+ fi
91
129
 
92
130
  echo "📦 (Github) Sürüm pakedi yükleniyor: ${LIBRARY_ZIP}"
93
131
  if [[ -f "${LIBRARY_ZIP}" ]]; then
94
- run "gh release upload \"${CURRENT_VERSION_NUMBER}\" \"${LIBRARY_ZIP}\" --clobber"
132
+ run "gh release upload \"${RELEASE_NAME}\" \"${LIBRARY_ZIP}\" --clobber"
95
133
  else
96
134
  echo "⚠️ (Github) Warning: Asset bulunamadı, atlanıyor: ${LIBRARY_ZIP}"
97
135
  fi