#!/bin/bash # # Copyright 2025 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # set -euo pipefail usage() { cat << EOF Usage: $0 [baseCommit] [tasksToRun] [--runOnDependentProjects] Optional arguments: baseCommit Commit hash to use for the :listAffectedProjects task. If not provided, the task will run with the last merge commit as the baseCommit. tasksToRun Comma-separated list of Gradle tasks to run for each affected project. If not provided, defaults to 'buildOnServer'. --runOnDependentProjects If specified, the tasks will also run on dependent projects. Enabling this flag will increase the processing time. Examples: 1. Run with a base commit (e.g. HEAD~1) and a specified list of tasks: ./development/validate_changes.sh HEAD~1 bOS,allHostTests 2. Run with a base commit, a specified list of tasks, and enable running on dependent projects: ./development/validate_changes.sh HEAD~1 bOS,allHostTests --runOnDependentProjects 3. Run with default base commit (last merge commit), specified tasks, and enabling dependent projects: ./development/validate_changes.sh "" bOS,allHostTests --runOnDependentProjects Options: --help Display this help message and exit. EOF } if [[ "${1:-}" == "--help" ]]; then usage exit 0 fi # ANSI color codes for error messages RED='\033[0;31m' NC='\033[0m' # Parse arguments RUN_ON_DEPENDENT_PROJECTS="false" ARGS=() while [[ $# -gt 0 ]]; do case "$1" in --runOnDependentProjects) RUN_ON_DEPENDENT_PROJECTS="true" shift ;; --help) usage exit 0 ;; *) ARGS+=("$1") shift ;; esac done BASE_COMMIT="${ARGS[0]:-}" TASKS_TO_RUN="${ARGS[1]:-bOS}" if [[ "$RUN_ON_DEPENDENT_PROJECTS" != "true" ]]; then echo -e "${RED}Dependent projects will NOT be captured. Running with --runOnDependentProjects will\ run tasks on dependent projects, but it may take more time.${NC}" fi REPO_ROOT=$(git rev-parse --show-toplevel) cd "$REPO_ROOT" || { echo "Error: Unable to change directory to repository root"; exit 1; } OUTPUT_FILE="$REPO_ROOT/../../out/androidx/build/changedProjects.txt" gradle_cmd=(./gradlew :listAffectedProjects) if [[ -n "$BASE_COMMIT" ]]; then gradle_cmd+=("--baseCommit=$BASE_COMMIT") fi gradle_cmd+=("--tasksToRun=$TASKS_TO_RUN") if [[ "$RUN_ON_DEPENDENT_PROJECTS" == "true" ]]; then gradle_cmd+=("--runOnDependentProjects=true") fi echo "Running: ${gradle_cmd[*]}" "${gradle_cmd[@]}" if [[ ! -f "$OUTPUT_FILE" ]]; then echo -e "${RED}Output file '$OUTPUT_FILE' not found. Exiting.${NC}" exit 1 fi TASKS=$(<"$OUTPUT_FILE") if [[ -z "$TASKS" ]]; then echo -e "${RED}No tasks found in '$OUTPUT_FILE'. Nothing to execute.${NC}" exit 0 fi read -r -a tasks_array <<< "$TASKS" echo "Running: ./gradlew "${tasks_array[@]}"" PROJECT_PREFIX=: ANDROIDX_PROJECTS=ALL ./gradlew --strict "${tasks_array[@]}"