This is an automated email from the ASF dual-hosted git repository.
mmodzelewski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iggy.git
The following commit(s) were added to refs/heads/master by this push:
new 3bc814dd7 fix(ci): use portable fallbacks for bash-4 builtins and GNU
sed in hook scripts (#3694)
3bc814dd7 is described below
commit 3bc814dd7dc59d1c1c6326032f9647f2bb9f5cca
Author: Gunther Xing <[email protected]>
AuthorDate: Wed Aug 5 03:52:58 2026 +0800
fix(ci): use portable fallbacks for bash-4 builtins and GNU sed in hook
scripts (#3694)
---
scripts/ci/license-headers.sh | 6 ++++--
scripts/ci/python-sdk-version-sync.sh | 10 ++++++----
scripts/ci/sync-python-interpreter-version.sh | 26 +++++++++++++++++++-------
scripts/ci/sync-rustc-version.sh | 12 ++++++++----
scripts/verify-crates-publish.sh | 7 +++++--
5 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/scripts/ci/license-headers.sh b/scripts/ci/license-headers.sh
index 8a7fc531c..0f61e12ea 100755
--- a/scripts/ci/license-headers.sh
+++ b/scripts/ci/license-headers.sh
@@ -194,14 +194,16 @@ find_duplicate_license_headers() {
local path
: > "$output_file"
- mapfile -t LICENSE_EXCLUDES < <(load_license_excludes)
+ LICENSE_EXCLUDES=()
+ while IFS= read -r _hdr_tmp; do LICENSE_EXCLUDES+=("$_hdr_tmp"); done <
<(load_license_excludes)
while IFS= read -r -d '' path; do
if is_license_excluded "$path"; then
continue
fi
- if ! LC_ALL=C grep -Iq . "$path"; then
+ # short-circuit the symlink that may point to dir.
+ if [ ! -f "$path" ] || ! LC_ALL=C grep -Iq . "$path"; then
continue
fi
diff --git a/scripts/ci/python-sdk-version-sync.sh
b/scripts/ci/python-sdk-version-sync.sh
index 591f68edb..fa9e3d33d 100755
--- a/scripts/ci/python-sdk-version-sync.sh
+++ b/scripts/ci/python-sdk-version-sync.sh
@@ -139,9 +139,9 @@ compare_versions() {
dev2="0"
fi
- # Compare base versions using sort -V
+ # Compare base versions using POSIX sort (X.Y.Z numeric per component).
local sorted
- sorted=$(printf '%s\n%s' "$base1" "$base2" | sort -V | head -1)
+ sorted=$(printf '%s\n%s' "$base1" "$base2" | sort -t. -k1,1n -k2,2n -k3,3n
| head -1)
if [ "$base1" != "$base2" ]; then
if [ "$sorted" = "$base1" ]; then
@@ -196,13 +196,15 @@ elif [ "$MODE" = "fix" ]; then
# Cargo version is newer, update pyproject.toml
NEW_PYPROJECT_VERSION="$CARGO_NORMALIZED"
echo -e "${YELLOW}Cargo.toml has newer version, updating
pyproject.toml...${NC}"
- sed -i "s/^version = \"$PYPROJECT_VERSION\"/version =
\"$NEW_PYPROJECT_VERSION\"/" "$PYPROJECT_TOML"
+ sed -i.bak "s/^version = \"$PYPROJECT_VERSION\"/version =
\"$NEW_PYPROJECT_VERSION\"/" "$PYPROJECT_TOML"
+ rm -f "$PYPROJECT_TOML.bak"
echo -e "${GREEN}✓ Updated $PYPROJECT_TOML: $PYPROJECT_VERSION ->
$NEW_PYPROJECT_VERSION${NC}"
elif [ "$COMPARISON" = "2" ]; then
# pyproject version is newer, update Cargo.toml
NEW_CARGO_VERSION=$(to_cargo_format "$PYPROJECT_NORMALIZED")
echo -e "${YELLOW}pyproject.toml has newer version, updating
Cargo.toml...${NC}"
- sed -i "s/^version = \"$CARGO_VERSION\"/version =
\"$NEW_CARGO_VERSION\"/" "$CARGO_TOML"
+ sed -i.bak "s/^version = \"$CARGO_VERSION\"/version =
\"$NEW_CARGO_VERSION\"/" "$CARGO_TOML"
+ rm -f "$CARGO_TOML.bak"
echo -e "${GREEN}✓ Updated $CARGO_TOML: $CARGO_VERSION ->
$NEW_CARGO_VERSION${NC}"
fi
diff --git a/scripts/ci/sync-python-interpreter-version.sh
b/scripts/ci/sync-python-interpreter-version.sh
index 4c71c3ef2..2c33e475f 100755
--- a/scripts/ci/sync-python-interpreter-version.sh
+++ b/scripts/ci/sync-python-interpreter-version.sh
@@ -122,7 +122,8 @@ ensure_line() {
fi
if [ "$MODE" = "fix" ]; then
- sed -i -E "s|$current_pattern|$replacement|" "$file"
+ sed -i.bak -E "s|$current_pattern|$replacement|" "$file"
+ rm -f "$file.bak"
FIXED_CHECKS=$((FIXED_CHECKS + 1))
echo -e "${GREEN}Fixed${NC} $file: $description"
else
@@ -149,7 +150,8 @@ ensure_classifiers() {
return
fi
- mapfile -t versions < <(sed -nE 's/^ "Programming Language :: Python ::
([0-9]+\.[0-9]+)",$/\1/p' "$file")
+ versions=()
+ while IFS= read -r _py_ver_tmp; do versions+=("$_py_ver_tmp"); done <
<(sed -nE 's/^ "Programming Language :: Python :: ([0-9]+\.[0-9]+)",$/\1/p'
"$file")
if [ "${#versions[@]}" -eq 0 ]; then
echo -e "${RED}✗${NC} $file: could not find Python version classifiers"
@@ -187,12 +189,19 @@ ensure_classifiers() {
version_number=$((version_major * 100 + version_minor))
if [ "$version_number" -lt "$PYTHON_VERSION_NUMBER" ]; then
- sed -i -E "/^ \"Programming Language :: Python ::
${version//./\\.}\",$/d" "$file"
+ sed -i.bak -E "/^ \"Programming Language :: Python ::
${version//./\\.}\",$/d" "$file"
+ rm -f "$file.bak"
fi
done
if [ "$has_minimum" -eq 0 ]; then
- sed -i -E "/^ \"Programming Language :: Python ::
${PYTHON_VERSION_MAJOR}\",$/a\\ \"Programming Language :: Python ::
${PYTHON_VERSION}\"," "$file"
+ awk -v major="$PYTHON_VERSION_MAJOR" -v version="$PYTHON_VERSION" '
+ { print }
+ $0 == " \"Programming Language :: Python :: " major "\"," {
+ printf " \"Programming Language :: Python :: %s\",\n",
version
+ }
+ ' "$file" > "$file.new"
+ mv "$file.new" "$file"
fi
FIXED_CHECKS=$((FIXED_CHECKS + 1))
@@ -244,7 +253,8 @@ ensure_lock_python_requirement() {
fi
if [ "$MODE" = "fix" ]; then
- sed -i -E "1,${top_level_end}s|$current_pattern|$replacement|" "$file"
+ sed -i.bak -E "1,${top_level_end}s|$current_pattern|$replacement|"
"$file"
+ rm -f "$file.bak"
FIXED_CHECKS=$((FIXED_CHECKS + 1))
echo -e "${GREEN}Fixed${NC} $file: lock file Python requirement"
else
@@ -270,7 +280,8 @@ ensure_wheel_interpreters() {
return
fi
- mapfile -t classifier_versions < <(sed -nE 's/^ "Programming Language
:: Python :: ([0-9]+\.[0-9]+)",$/\1/p' "$SOURCE_FILE")
+ classifier_versions=()
+ while IFS= read -r _py_cls_tmp; do classifier_versions+=("$_py_cls_tmp");
done < <(sed -nE 's/^ "Programming Language :: Python ::
([0-9]+\.[0-9]+)",$/\1/p' "$SOURCE_FILE")
if [ "${#classifier_versions[@]}" -eq 0 ]; then
echo -e "${RED}✗${NC} $SOURCE_FILE: could not find Python version
classifiers"
@@ -303,7 +314,8 @@ ensure_wheel_interpreters() {
fi
if [ "$MODE" = "fix" ]; then
- sed -i -E "s|(--interpreter ).*$|\\1${expected_interpreters}|" "$file"
+ sed -i.bak -E "s|(--interpreter ).*$|\\1${expected_interpreters}|"
"$file"
+ rm -f "$file.bak"
FIXED_CHECKS=$((FIXED_CHECKS + 1))
echo -e "${GREEN}Fixed${NC} $file: wheel interpreter versions"
else
diff --git a/scripts/ci/sync-rustc-version.sh b/scripts/ci/sync-rustc-version.sh
index cc494dabd..6e317df6b 100755
--- a/scripts/ci/sync-rustc-version.sh
+++ b/scripts/ci/sync-rustc-version.sh
@@ -156,13 +156,17 @@ for dockerfile in $DOCKERFILES; do
elif [ "$MODE" = "fix" ]; then
if { [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION"
]; } || [ "$RUST_IMAGE_MISMATCH" = "true" ]; then
if [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION"
] && [ "$SOURCE" = "arg" ]; then
- sed -i "s/^ARG RUST_VERSION=.*/ARG
RUST_VERSION=$EXPECTED_VERSION/" "$dockerfile"
+ sed -i.bak "s/^ARG RUST_VERSION=.*/ARG
RUST_VERSION=$EXPECTED_VERSION/" "$dockerfile"
+ rm -f "$dockerfile.bak"
elif [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" !=
"$EXPECTED_VERSION" ]; then
- sed -i -E "/FROM[[:space:]].*\\brust:[0-9]/
s#(\\brust:)[0-9]+\\.[0-9]+(\\.[0-9]+)?#\\1$EXPECTED_VERSION#g" "$dockerfile"
+ sed -i.bak -E "/FROM[[:space:]].*\\brust:[0-9]/
s#(\\brust:)[0-9]+\\.[0-9]+(\\.[0-9]+)?#\\1$EXPECTED_VERSION#g" "$dockerfile"
+ rm -f "$dockerfile.bak"
fi
if [ "$RUST_IMAGE_MISMATCH" = "true" ]; then
- sed -i -E "/$RUST_IMAGE_PATTERN/
s#$RUST_IMAGE_TAG_PATTERN-[^[:space:]]+#\\1-$RUST_IMAGE_VARIANT#g" "$dockerfile"
- sed -i -E "/$RUST_IMAGE_PATTERN/ {
/-$RUST_IMAGE_VARIANT([[:space:]]|$)/!
s#$RUST_IMAGE_TAG_PATTERN([[:space:]]|$)#\\1-$RUST_IMAGE_VARIANT\\2#g; }"
"$dockerfile"
+ sed -i.bak -E "/$RUST_IMAGE_PATTERN/
s#$RUST_IMAGE_TAG_PATTERN-[^[:space:]]+#\\1-$RUST_IMAGE_VARIANT#g" "$dockerfile"
+ rm -f "$dockerfile.bak"
+ sed -i.bak -E "/$RUST_IMAGE_PATTERN/ {
/-$RUST_IMAGE_VARIANT([[:space:]]|$)/!
s#$RUST_IMAGE_TAG_PATTERN([[:space:]]|$)#\\1-$RUST_IMAGE_VARIANT\\2#g; }"
"$dockerfile"
+ rm -f "$dockerfile.bak"
fi
FIXED_FILES=$((FIXED_FILES + 1))
MESSAGE=""
diff --git a/scripts/verify-crates-publish.sh b/scripts/verify-crates-publish.sh
index f78cce945..7cb4a9204 100755
--- a/scripts/verify-crates-publish.sh
+++ b/scripts/verify-crates-publish.sh
@@ -60,6 +60,7 @@ cp Cargo.toml "$CARGO_TOML_BACKUP"
AUTO_INSTALL="${AUTO_INSTALL:-0}"
# Ordered topologically: each crate depends only on the ones before it.
+# MUST be lowercase (crates-index path is derived from the name directly).
CRATES=(
iggy_binary_protocol
iggy_common
@@ -84,6 +85,7 @@ cleanup() {
if [[ "$CARGO_TOML_PATCHED" == "true" ]]; then
log "Reverting Cargo.toml patch"
cp "$CARGO_TOML_BACKUP" Cargo.toml
+ rm -f Cargo.toml.bak
fi
rm -f "$CARGO_TOML_BACKUP"
@@ -254,12 +256,13 @@ log "Patching workspace.dependencies to target local-dev"
CARGO_TOML_PATCHED=true
# Injects `, registry = "local-dev"` before the closing brace of the line.
# Match by crate name + path + version so we do not touch unrelated entries.
-sed -i -E \
+sed -i.bak -E \
-e 's|^(iggy_binary_protocol = \{ path = "[^"]+", version = "[^"]+")(
\})$|\1, registry = "local-dev"\2|' \
-e 's|^(iggy_common = \{ path = "[^"]+", version = "[^"]+")( \})$|\1,
registry = "local-dev"\2|' \
-e 's|^(iggy = \{ path = "[^"]+", version = "[^"]+")( \})$|\1, registry =
"local-dev"\2|' \
-e 's|^(iggy-cli = \{ path = "[^"]+", version = "[^"]+")( \})$|\1,
registry = "local-dev"\2|' \
Cargo.toml
+rm -f Cargo.toml.bak
# Sanity check: all four lines must now carry the registry marker. This
# catches formatting drift in Cargo.toml before it becomes a confusing
@@ -310,7 +313,7 @@ log "Verifying all four crates appear in the local registry"
# Every published iggy crate is >=4 chars, so the shorter-name buckets
# (1/, 2/, 3/<c>/) from the full layout are intentionally not handled.
for crate in "${CRATES[@]}"; do
- lc="${crate,,}"
+ lc="$crate" # relies on CRATES entries being lowercase (see definition
above)
rel="${lc:0:2}/${lc:2:2}/$lc"
if [[ ! -f "$REGISTRY_DIR/$rel" ]]; then
err "Crate ${crate} missing from local registry (expected at $rel)"