1
+ #! /bin/bash
2
+
3
+ # This script generates a maven command to test unit and integration tests for
4
+ # the repo. The outputted maven command will be in the rough following format
5
+ # `mvn verify ... -D{dependency.name}.version={dependency.version]`. The variables
6
+ # ${dependency.name} and ${dependency.version} are parsed from the input to the script.
7
+ #
8
+ # Default invocation ./.github/scripts/test_dependency_compatibility.sh will use the default
9
+ # upper-bounds dependency file at the root of the repo.
10
+ # There are two potential inputs to the script:
11
+ # 1. -f {file}: Custom file/path for the upper-bound dependencies to test
12
+ # 2. -l {deps_list}: Comma-separated list of dependencies to test (e.g. protobuf=4.31.0,guava=33.4.8-jre)
13
+ # Note: Do not include the `-D` prefix or `.version` suffix. Those values will be appended when generating
14
+ # the maven command.
15
+ #
16
+ # If both inputs are supplied, the deps_list input has precedence. For Github Actions workflow,
17
+ # the default workflow will run with the upper-bounds file. A `workflow_dispatch` option takes in
18
+ # an input for the deps_list to manually run a subset of dependencies.
19
+ #
20
+ # The default upper-bound dependencies file is `dependencies.txt` located in the root
21
+ # of sdk-platform-java. The upper-bound dependencies file will be in the format of:
22
+ # ${dependency.name}=${dependency.version}
23
+
24
+ set -ex
25
+
26
+ function print_help() {
27
+ echo " Unexpected input argument for this script."
28
+ echo " Use -f {file} for the directory of the upper-bound dependencies file."
29
+ echo " Use -l {deps_list} for a comma-separated list of dependencies to test (Format: dep1=1.0,dep2=2.0)"
30
+ }
31
+
32
+ # Function to parse a dependency string and append it to the Maven command
33
+ function add_dependency_to_maven_command() {
34
+ local dep_pair=$1
35
+ if [[ ! " ${dep_pair} " =~ .* = .* ]]; then
36
+ echo " Malformed dependency string: ${dep_pair} . Expected format: dependency=version"
37
+ exit 1
38
+ fi
39
+ local dependency=$( echo " ${dep_pair} " | cut -d' =' -f1 | tr -d ' [:space:]' )
40
+ local version=$( echo " ${dep_pair} " | cut -d' =' -f2 | sed ' s/^[[:space:]]*//;s/[[:space:]]*$//' )
41
+ MAVEN_COMMAND+=" -D${dependency} .version=${version} "
42
+ }
43
+
44
+ # Default to the upper bounds file in the root of the repo
45
+ file=' dependencies.txt'
46
+ dependency_list=' '
47
+
48
+ # The colon (:) after the letter means that there is an input associated with the flag
49
+ while getopts ' f:l:' flag; do
50
+ case " ${flag} " in
51
+ f) file=" ${OPTARG} " ;;
52
+ l) dependency_list=" ${OPTARG} " ;;
53
+ * ) print_help && exit 1
54
+ esac
55
+ done
56
+
57
+ # Error if both the file and deps_list inputs is empty
58
+ if [[ -z " ${file} " && -z " ${dependency_list} " ]]; then
59
+ print_help && exit 1
60
+ fi
61
+
62
+ MAVEN_COMMAND=" mvn verify -Penable-integration-tests -Dclirr.skip -Dcheckstyle.skip -Dfmt.skip -Denforcer.skip "
63
+
64
+ # Check if a list of dependencies was provided as an argument. If the list of dependency inputted
65
+ # is empty, then run with the upper-bound dependencies file
66
+ if [ -z " ${dependency_list} " ]; then
67
+ UPPER_BOUND_DEPENDENCY_FILE=$file
68
+
69
+ if [ ! -e " ${UPPER_BOUND_DEPENDENCY_FILE} " ]; then
70
+ echo " The inputted upper-bound dependency file '${UPPER_BOUND_DEPENDENCY_FILE} ' cannot be found"
71
+ exit 1
72
+ fi
73
+
74
+ # Read the file line by line
75
+ while IFS= read -r line; do
76
+ # Ignore any comments and blank lines
77
+ if [[ " ${line} " =~ ^[[:space:]]* # ]] || [[ -z "${line}" ]]; then
78
+ continue
79
+ fi
80
+ add_dependency_to_maven_command " ${line} "
81
+ done < " ${UPPER_BOUND_DEPENDENCY_FILE} "
82
+ else # This else block means that a list of dependencies was inputted
83
+ # Set the Internal Field Separator (IFS) to a comma.
84
+ # This tells 'read' to split the string by commas into an array named DEPS.
85
+ # The 'read -ra' command reads the input into an array.
86
+ IFS= ' ,' read -r a DEPS <<< " ${dependency_list} "
87
+
88
+ # Loop through each item in the DEPS array.
89
+ for DEP_PAIR in " ${DEPS[@]} " ; do
90
+ # Skip any empty items that might result from trailing commas.
91
+ if [ -z " ${DEP_PAIR} " ]; then
92
+ continue
93
+ fi
94
+ add_dependency_to_maven_command " ${DEP_PAIR} "
95
+ done
96
+ fi
97
+
98
+ # Run the generated maven command to test with the dependency versions
99
+ $MAVEN_COMMAND
0 commit comments