diff --git a/HISTORY.md b/HISTORY.md
index c76f95dbb9..d31f440304 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,5 +1,34 @@
# Keyman Version History
+## 19.0.78 alpha 2025-07-04
+
+* docs(developer): Fix links in gestures guide (#14297)
+
+## 19.0.77 alpha 2025-07-04
+
+* maint(mac): rename `_do_publish` function to `do_publish` to fix release build (#14273)
+* maint(ios): remove extra `cd` command from ios release builds (#14272)
+* maint(android): remove `--ci` parameter from android builds (#14264)
+* refactor(resources): replace shebang for TC include files (#14265)
+* fix(core): fix failing `common-test-core.sh` script (#14271)
+* maint(common): match OSTYPE correctly on macOS (#14277)
+* fix(common): fix triggering builds if no builds to start (#14274)
+* maint(common): trigger common builds for resources/teamcity/common changes (#14279)
+
+## 19.0.76 alpha 2025-07-03
+
+* maint(common): move TC configuration for common tests (#14205)
+* refactor(common): improve downloads include script (#14253)
+* maint(web): move rsync code to shared functions (#14254)
+* maint(developer): replace Powershell scripts (#14255)
+* maint(windows): move TC configuration for Keyman Windows to scripts (#14186)
+* feat(windows): human text message for 413 error (#14055)
+* refactor(web): move helper functions to beginning of function (#14252)
+* maint(android): add TC build scripts for Keyman for Android (#14222)
+* maint(linux): use `tc_rsync_upload` and `write_download_info` functions (#14258)
+* maint(ios): add TC build scripts for iOS (#14229)
+* maint(mac): add TC build scripts for macOS (#14239)
+
## 19.0.75 alpha 2025-07-02
* feat(resources): support ignoring unknown options in builder (#14216)
diff --git a/VERSION.md b/VERSION.md
index ba0827f2cf..1b64c3a8c4 100644
--- a/VERSION.md
+++ b/VERSION.md
@@ -1 +1 @@
-19.0.76
\ No newline at end of file
+19.0.79
\ No newline at end of file
diff --git a/android/build.sh b/android/build.sh
index 12017e2c6b..caeddb5b51 100755
--- a/android/build.sh
+++ b/android/build.sh
@@ -39,7 +39,6 @@ builder_describe \
test \
"publish Publishes symbols to Sentry and the APKs to the Play Store." \
"archive Copy release artifacts to upload/ and rsync to downloads.keyman" \
- "--ci+ Deprecated build option. Remove in 20.0" \
--upload-sentry+ \
":engine=KMEA Keyman Engine for Android" \
":app=KMAPro Keyman for Android" \
diff --git a/developer/docs/help/guides/develop/touch-keyboard-tutorial/gestures.md b/developer/docs/help/guides/develop/touch-keyboard-tutorial/gestures.md
index c66039cee3..b09d5919cf 100644
--- a/developer/docs/help/guides/develop/touch-keyboard-tutorial/gestures.md
+++ b/developer/docs/help/guides/develop/touch-keyboard-tutorial/gestures.md
@@ -4,11 +4,11 @@ title: Using Gestures in Keyman Developer
Keyman Developer offers **Longpress** keys, **Flicks**, and **Multitaps** for touch keyboard layout. To allow gestures onto your keyboard, go to the Touch layout tab and define the keys as follows:
-
+
## Tips
-***Flicks** and **long presses** can both be used in a single keyboard. In this scenario, it is recommended to use flicks in only one direction—south (down). Long presses work well alongside this pattern. See, for example, [sil_euro_latin](../../../../keyboard/sil_euro_latin/3.0.3/sil_euro_latin#toc-mobile-keyboard-layout).
+***Flicks** and **long presses** can both be used in a single keyboard. In this scenario, it is recommended to use flicks in only one direction—south (down). Long presses work well alongside this pattern. See, for example, [sil_euro_latin](https://help.keyman.com/keyboard/sil_euro_latin/3.0.3/sil_euro_latin#toc-mobile-keyboard-layout).
* Another helpful tip seen in the sil_euro_latin keyboard is using south-flicks on the base and shift layers corresponding to the numeric/symbol layer, this aids in both memorization and discovery.
* **Flicks** in multiple directions are possible, but currently Keyman does not support hints for multiple directions, so they are not very discoverable.
* **Long presses** are more discoverable, but **flicks** are faster. We suggest using south flicks along with long presses, and including the flick output in the long press for maximum discoverability and optimum ergonomics.
@@ -22,5 +22,5 @@ Keyman Developer offers **Longpress** keys, **Flicks**, and **Multitaps** for to
## See also
-* The [Winchus keyboard](../../../../keyboard/winchus/1.4/winchus#guia-rapida-celular)
-* The [GFF Amharic keyboard](../../../../keyboard/gff_amharic/3.2.1/gff_amharic#toc-using-this-keyboard)
\ No newline at end of file
+* The [Winchus keyboard](https://help.keyman.com/keyboard/winchus/1.4/winchus#guia-rapida-celular)
+* The [GFF Amharic keyboard](https://help.keyman.com/keyboard/gff_amharic/3.2.1/gff_amharic#toc-using-this-keyboard)
\ No newline at end of file
diff --git a/resources/build/run-required-test-builds.sh b/resources/build/run-required-test-builds.sh
index 02ec814969..9227c613cc 100755
--- a/resources/build/run-required-test-builds.sh
+++ b/resources/build/run-required-test-builds.sh
@@ -259,7 +259,7 @@ fi
# Start test builds as required
#
-if (( ${#build_platforms[@]} > 0)); then
+if [[ ! -z ${build_platforms:-} ]] && (( ${#build_platforms[@]:-0} > 0)); then
builder_echo heading "Start test builds"
triggerTestBuilds build_platforms $PRNUM
else
diff --git a/resources/build/trigger-definitions.inc.sh b/resources/build/trigger-definitions.inc.sh
index db879b95e8..8748e63edf 100644
--- a/resources/build/trigger-definitions.inc.sh
+++ b/resources/build/trigger-definitions.inc.sh
@@ -38,15 +38,23 @@ available_platforms_regex=`echo "${available_platforms[@]}" | sed 's/ /|/g'`
# We also allow 'common' and 'core' platforms for Build-bot: commands
readonly available_platforms_regex="$available_platforms_regex|common|core"
-# the base folder for each pattern does not need to be included, nor oem folders
-# e.g. android='common/models|common/predictive-text'
-# will expand into android='^(android|(oem/[^/]+/android)|common/models|common/predictive-text)'
+# the base folder for each pattern does not need to be included, nor oem
+# folders, nor resources/teamcity folders
+#
+# e.g. watch_android='web|comon/web' will expand to cover:
+# android
+# oem/*/android
+# web
+# common/web
+# resources/teamcity/android
+# resources/teamcity/includes
-watch_android='web|common/models|common/predictive-text|common/web'
-watch_ios='web|common/models|common/predictive-text|common/web'
+
+watch_android='web|common/web'
+watch_ios='web|common/web'
watch_linux='core|common/test/keyboards/baseline'
watch_mac='core'
-watch_web='common/models|common/predictive-text|common/web|core'
+watch_web='common/web|core'
watch_windows='common|core|web'
watch_developer='common|core|web'
@@ -55,10 +63,10 @@ watch_developer='common|core|web'
watch_common_web='common/web'
# Currently, we run web tests on all three of our build platforms, to ensure
# that they work in all our environments. So we need to include common/web in
-# the matches for these
-watch_common_windows='common/windows|common/web'
-watch_common_mac='common/mac|common/web'
-watch_common_linux='common/linux|common/web'
+# the matches for these, as well as resources/teamcity/common
+watch_common_windows='common/windows|common/web|resources/teamcity/common'
+watch_common_mac='common/mac|common/web|resources/teamcity/common'
+watch_common_linux='common/linux|common/web|resources/teamcity/common'
#
# Available build configurations and VCS identifiers; identifiers are somewhat inconsistent due
diff --git a/resources/teamcity/android/android-actions.inc.sh b/resources/teamcity/android/android-actions.inc.sh
index 4e0273c5fc..5c56b81abe 100755
--- a/resources/teamcity/android/android-actions.inc.sh
+++ b/resources/teamcity/android/android-actions.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
android_clean_action() {
@@ -11,8 +11,9 @@ android_clean_action() {
android_build_action() {
builder_echo start "build" "Building Keyman for Android"
local TARGETS="$1"
+ local ARGS="$2"
# REVIEW: is it deliberate that we `configure` all targets but only `build,test` `$TARGETS`?
- "${KEYMAN_ROOT}/android/build.sh" configure build,test:"${TARGETS}" --debug --ci
+ "${KEYMAN_ROOT}/android/build.sh" configure build,test:"${TARGETS}" ${ARGS}
builder_echo end "build" success "Finished building Keyman for Android"
}
diff --git a/resources/teamcity/android/keyman-android-release.sh b/resources/teamcity/android/keyman-android-release.sh
index bd0aa14b44..f11cecb5b6 100755
--- a/resources/teamcity/android/keyman-android-release.sh
+++ b/resources/teamcity/android/keyman-android-release.sh
@@ -120,10 +120,10 @@ fi
if builder_has_action all; then
android_clean_action
- android_build_action "${TARGETS}"
+ android_build_action "${TARGETS}" --release
do_publish
else
builder_run_action clean android_clean_action
- builder_run_action build android_build_action "${TARGETS}"
+ builder_run_action build android_build_action "${TARGETS}" --release
builder_run_action publish do_publish
fi
diff --git a/resources/teamcity/android/keyman-android-test-samples.sh b/resources/teamcity/android/keyman-android-test-samples.sh
index 2698ad914a..1faa1b6c66 100755
--- a/resources/teamcity/android/keyman-android-test-samples.sh
+++ b/resources/teamcity/android/keyman-android-test-samples.sh
@@ -31,7 +31,7 @@ cd "${KEYMAN_ROOT}/android"
function do_build() {
"${KEYMAN_ROOT}/android/build.sh" \
configure,build:engine,sample1,sample2,keyboardharness \
- --debug --ci
+ --debug
}
if builder_has_action all; then
diff --git a/resources/teamcity/android/keyman-android-test.sh b/resources/teamcity/android/keyman-android-test.sh
index 8a531a2bfe..ca856e1ff4 100755
--- a/resources/teamcity/android/keyman-android-test.sh
+++ b/resources/teamcity/android/keyman-android-test.sh
@@ -38,8 +38,8 @@ fi
if builder_has_action all; then
android_clean_action
- android_build_action "${TARGETS}"
+ android_build_action "${TARGETS}" --debug
else
builder_run_action clean android_clean_action
- builder_run_action build android_build_action "${TARGETS}"
+ builder_run_action build android_build_action "${TARGETS}" --debug
fi
diff --git a/resources/teamcity/common/common-test-core.sh b/resources/teamcity/common/common-test-core.sh
index 57bc8a1c2c..9ea781697a 100755
--- a/resources/teamcity/common/common-test-core.sh
+++ b/resources/teamcity/common/common-test-core.sh
@@ -25,19 +25,16 @@ builder_parse "$@"
if is_ubuntu; then
ARCH=arch
elif is_windows; then
- ARCH=x86
+ ARCH=win
elif is_macos; then
ARCH=mac
else
builder_echo error "Unknown architecture"
- return 1
+ exit 1
fi
function do_all() {
"${KEYMAN_ROOT}/core/build.sh" configure,build,test:${ARCH}
- if is_windows; then
- "${KEYMAN_ROOT}/core/build.sh" configure,build,test:x64
- fi
}
builder_run_action all do_all
diff --git a/resources/teamcity/developer/developer-actions.inc.sh b/resources/teamcity/developer/developer-actions.inc.sh
index 73e1a325df..9f0819aef2 100644
--- a/resources/teamcity/developer/developer-actions.inc.sh
+++ b/resources/teamcity/developer/developer-actions.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
developer_install_dependencies_on_linux_action() {
diff --git a/resources/teamcity/includes/tc-download-info.inc.sh b/resources/teamcity/includes/tc-download-info.inc.sh
index 25755af877..c1e596a394 100644
--- a/resources/teamcity/includes/tc-download-info.inc.sh
+++ b/resources/teamcity/includes/tc-download-info.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
# shellcheck disable=SC2154
diff --git a/resources/teamcity/includes/tc-helpers.inc.sh b/resources/teamcity/includes/tc-helpers.inc.sh
index 065df7fe9e..9022599607 100644
--- a/resources/teamcity/includes/tc-helpers.inc.sh
+++ b/resources/teamcity/includes/tc-helpers.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
# Returns 0 if we're running on Ubuntu.
@@ -22,7 +22,7 @@ is_windows() {
# Returns 0 if we're running on macOS.
is_macos() {
- if [[ "${OSTYPE:-}" == "darwin" ]]; then
+ if [[ "${OSTYPE:-}" == darwin* ]]; then
return 0
else
return 1
diff --git a/resources/teamcity/includes/tc-linux.inc.sh b/resources/teamcity/includes/tc-linux.inc.sh
index 7e219f7e28..9d65f6e7a7 100644
--- a/resources/teamcity/includes/tc-linux.inc.sh
+++ b/resources/teamcity/includes/tc-linux.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
#
# Shared functions for any builds that run on Linux agents,
diff --git a/resources/teamcity/includes/tc-mac.inc.sh b/resources/teamcity/includes/tc-mac.inc.sh
index a5de278343..397a0d393b 100644
--- a/resources/teamcity/includes/tc-mac.inc.sh
+++ b/resources/teamcity/includes/tc-mac.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
#
# Shared functions for any builds that run on Mac agents
diff --git a/resources/teamcity/includes/tc-windows.inc.sh b/resources/teamcity/includes/tc-windows.inc.sh
index 4c0411eda6..d7170fd191 100644
--- a/resources/teamcity/includes/tc-windows.inc.sh
+++ b/resources/teamcity/includes/tc-windows.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
#
# Shared functions for any builds that run on Windows agents
diff --git a/resources/teamcity/ios/ios-actions.inc.sh b/resources/teamcity/ios/ios-actions.inc.sh
index 00b82b7f5c..acf904fe0f 100755
--- a/resources/teamcity/ios/ios-actions.inc.sh
+++ b/resources/teamcity/ios/ios-actions.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
ios_build() {
diff --git a/resources/teamcity/ios/keyman-ios-release.sh b/resources/teamcity/ios/keyman-ios-release.sh
index d8f3848289..b9386a3ed3 100755
--- a/resources/teamcity/ios/keyman-ios-release.sh
+++ b/resources/teamcity/ios/keyman-ios-release.sh
@@ -203,7 +203,6 @@ function __do_upload_to_fastlane() {
export PILOT_GROUPS="Alpha"
fi
- cd "upload/${KEYMAN_VERSION}"
command -v fastlane
# shellcheck disable=SC2154
fastlane pilot upload \
diff --git a/resources/teamcity/macos/keyman-macos-release.sh b/resources/teamcity/macos/keyman-macos-release.sh
index fb73185019..50830b747b 100755
--- a/resources/teamcity/macos/keyman-macos-release.sh
+++ b/resources/teamcity/macos/keyman-macos-release.sh
@@ -69,7 +69,7 @@ function _build_publish() {
builder_echo end success "publish" "Finished publishing Keyman for macOS"
}
-function _do_publish() {
+function do_publish() {
_build_publish
_publish_to_downloads_keyman_com
tc_upload_help "Keyman for macOS" mac
diff --git a/resources/teamcity/macos/macos-actions.inc.sh b/resources/teamcity/macos/macos-actions.inc.sh
index a463db4612..84095beac7 100755
--- a/resources/teamcity/macos/macos-actions.inc.sh
+++ b/resources/teamcity/macos/macos-actions.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
macos_clean_action() {
diff --git a/resources/teamcity/web/web-actions.inc.sh b/resources/teamcity/web/web-actions.inc.sh
index d12b846e96..4966f8f468 100644
--- a/resources/teamcity/web/web-actions.inc.sh
+++ b/resources/teamcity/web/web-actions.inc.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
web_install_dependencies_on_linux_action() {
diff --git a/resources/teamcity/windows/windows-actions.inc.sh b/resources/teamcity/windows/windows-actions.inc.sh
index e8553bef0f..3b5699447c 100755
--- a/resources/teamcity/windows/windows-actions.inc.sh
+++ b/resources/teamcity/windows/windows-actions.inc.sh
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
windows_build_action() {