90 lines
2.8 KiB
Bash
Executable File
90 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Script to detect changed files and find corresponding test files
|
|
# Usage: ./detect_changed_tests.sh [base_sha] [head_sha] [event_type]
|
|
#
|
|
# Outputs to GITHUB_OUTPUT:
|
|
# test_files: Space-separated list of test files to run
|
|
# has_tests: 'true' if test files found, 'false' otherwise
|
|
|
|
set -e
|
|
|
|
BASE_SHA="${1:-}"
|
|
HEAD_SHA="${2:-}"
|
|
EVENT_TYPE="${3:-push}"
|
|
|
|
# Determine base and head SHA based on event type
|
|
if [ "$EVENT_TYPE" = "pull_request" ]; then
|
|
BASE_SHA="${BASE_SHA:-$GITHUB_BASE_REF}"
|
|
HEAD_SHA="${HEAD_SHA:-$GITHUB_SHA}"
|
|
elif [ -z "$BASE_SHA" ] || [ -z "$HEAD_SHA" ]; then
|
|
# For push events, use git to find the previous commit
|
|
BASE_SHA="${BASE_SHA:-$(git rev-parse HEAD~1 2>/dev/null || echo HEAD)}"
|
|
HEAD_SHA="${HEAD_SHA:-HEAD}"
|
|
fi
|
|
|
|
echo "Event type: $EVENT_TYPE"
|
|
echo "Base SHA: $BASE_SHA"
|
|
echo "Head SHA: $HEAD_SHA"
|
|
|
|
# Get changed Python files
|
|
CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT "$BASE_SHA" "$HEAD_SHA" | grep -E '\.(py)$' || true)
|
|
|
|
if [ -z "$CHANGED_FILES" ]; then
|
|
echo "No Python files changed"
|
|
echo "test_files=" >> "$GITHUB_OUTPUT"
|
|
echo "has_tests=false" >> "$GITHUB_OUTPUT"
|
|
exit 0
|
|
fi
|
|
|
|
echo "Changed Python files:"
|
|
echo "$CHANGED_FILES"
|
|
|
|
# Extract related test files
|
|
TEST_FILES=""
|
|
for file in $CHANGED_FILES; do
|
|
# If changed file is a test file, add it directly
|
|
if [[ "$file" == tests/* ]]; then
|
|
TEST_FILES="$TEST_FILES $file"
|
|
# If changed file is source code, find corresponding test file
|
|
elif [[ "$file" == vllm_omni/* ]]; then
|
|
# Convert vllm_omni/path/to/module.py to possible test file paths
|
|
REL_PATH=$(echo "$file" | sed 's|^vllm_omni/||' | sed 's|\.py$||')
|
|
MODULE_NAME=$(basename "$REL_PATH")
|
|
DIR_PATH=$(dirname "$REL_PATH")
|
|
|
|
# Try multiple possible test file naming patterns
|
|
POSSIBLE_TESTS=(
|
|
"tests/test_${REL_PATH//\//_}.py"
|
|
"tests/${REL_PATH//\//_}_test.py"
|
|
)
|
|
|
|
# If multi-level directory, also try directory structure
|
|
if [ "$DIR_PATH" != "." ]; then
|
|
POSSIBLE_TESTS+=(
|
|
"tests/${DIR_PATH}/test_${MODULE_NAME}.py"
|
|
"tests/${DIR_PATH}/${MODULE_NAME}_test.py"
|
|
)
|
|
fi
|
|
|
|
for test_file in "${POSSIBLE_TESTS[@]}"; do
|
|
if [ -f "$test_file" ]; then
|
|
TEST_FILES="$TEST_FILES $test_file"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
|
|
# Deduplicate and format
|
|
TEST_FILES=$(echo "$TEST_FILES" | tr ' ' '\n' | grep -v '^$' | sort -u | tr '\n' ' ' | sed 's/^ *//;s/ *$//')
|
|
|
|
if [ -z "$TEST_FILES" ]; then
|
|
echo "No related test files found, will run all tests"
|
|
echo "test_files=" >> "$GITHUB_OUTPUT"
|
|
echo "has_tests=false" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "Found test files: $TEST_FILES"
|
|
echo "test_files=$TEST_FILES" >> "$GITHUB_OUTPUT"
|
|
echo "has_tests=true" >> "$GITHUB_OUTPUT"
|
|
fi
|