141 lines
3.0 KiB
Bash
141 lines
3.0 KiB
Bash
trim() {
|
|
local var="$*"
|
|
var="${var#"${var%%[![:space:]]*}"}"
|
|
var="${var%"${var##*[![:space:]]}"}"
|
|
printf '%s' "$var"
|
|
}
|
|
|
|
declare -A context
|
|
|
|
#
|
|
# Load context
|
|
#
|
|
while IFS='=' read -r key value; do
|
|
|
|
key="$(trim "${key:-}")"
|
|
value="$(trim "${value:-}")"
|
|
|
|
[[ -z "$key" ]] && continue
|
|
[[ "$key" =~ ^# ]] && continue
|
|
|
|
context["$key"]="$value"
|
|
|
|
done <<< "$CONTEXT"
|
|
|
|
matched=false
|
|
|
|
#
|
|
# Evaluate conditions (OR)
|
|
#
|
|
while IFS= read -r condition; do
|
|
|
|
condition="$(trim "${condition:-}")"
|
|
|
|
[[ -z "$condition" ]] && continue
|
|
[[ "$condition" =~ ^# ]] && continue
|
|
|
|
read -r variable operator expected <<< "$condition"
|
|
|
|
#
|
|
# Validate condition format
|
|
#
|
|
if [[ -z "${variable:-}" || -z "${operator:-}" || -z "${expected:-}" ]]; then
|
|
echo "Invalid condition: $condition"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -v context["$variable"] ]]; then
|
|
echo "Unknown context variable '$variable'"
|
|
exit 1
|
|
fi
|
|
|
|
actual="${context[$variable]}"
|
|
|
|
case "$operator" in
|
|
|
|
"==")
|
|
[[ "$actual" == "$expected" ]] && matched=true
|
|
;;
|
|
|
|
"!=")
|
|
[[ "$actual" != "$expected" ]] && matched=true
|
|
;;
|
|
|
|
">"|">="|"<"|"<=")
|
|
|
|
#
|
|
# Numeric comparisons only
|
|
#
|
|
if [[ ! "$actual" =~ ^-?[0-9]+$ ]]; then
|
|
echo "Numeric operator '$operator' requires integer value. Actual: '$actual'"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! "$expected" =~ ^-?[0-9]+$ ]]; then
|
|
echo "Numeric operator '$operator' requires integer comparison value. Expected: '$expected'"
|
|
exit 1
|
|
fi
|
|
|
|
case "$operator" in
|
|
">")
|
|
(( actual > expected )) && matched=true
|
|
;;
|
|
">=")
|
|
(( actual >= expected )) && matched=true
|
|
;;
|
|
"<")
|
|
(( actual < expected )) && matched=true
|
|
;;
|
|
"<=")
|
|
(( actual <= expected )) && matched=true
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
*)
|
|
echo "Unsupported operator: $operator"
|
|
exit 1
|
|
;;
|
|
|
|
esac
|
|
|
|
#
|
|
# OR logic:
|
|
# stop at first match
|
|
#
|
|
[[ "$matched" == true ]] && break
|
|
|
|
done <<< "$CONDITIONS"
|
|
|
|
#
|
|
# Set outputs
|
|
#
|
|
if [[ "$matched" == true ]]; then
|
|
|
|
while IFS= read -r output; do
|
|
|
|
output="$(trim "${output:-}")"
|
|
|
|
[[ -z "$output" ]] && continue
|
|
[[ "$output" =~ ^# ]] && continue
|
|
|
|
#
|
|
# Validate output syntax
|
|
#
|
|
if [[ ! "$output" =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then
|
|
echo "Invalid variable definition: $output"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$output" >> "$GITHUB_OUTPUT"
|
|
|
|
done <<< "$VARIABLES"
|
|
|
|
fi
|
|
|
|
if [[ "$matched" == false && "$FAIL_ON_NO_MATCH" == "true" ]]; then
|
|
echo "No conditions matched"
|
|
exit 1
|
|
fi
|
|
|
|
echo "matched=$matched" >> "$GITHUB_OUTPUT" |