You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@yetus.apache.org by aw...@apache.org on 2016/03/22 23:54:25 UTC

yetus git commit: YETUS-300. CHANGED_FILES, CHANGED_MODULES, etc should really be arrays

Repository: yetus
Updated Branches:
  refs/heads/master ae566eef8 -> 66352f53e


YETUS-300. CHANGED_FILES, CHANGED_MODULES, etc should really be arrays

Signed-off-by: Sean Busbey <bu...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/yetus/repo
Commit: http://git-wip-us.apache.org/repos/asf/yetus/commit/66352f53
Tree: http://git-wip-us.apache.org/repos/asf/yetus/tree/66352f53
Diff: http://git-wip-us.apache.org/repos/asf/yetus/diff/66352f53

Branch: refs/heads/master
Commit: 66352f53e0f1b17521618a9a99e6d29496897fbe
Parents: ae566ee
Author: Allen Wittenauer <aw...@apache.org>
Authored: Mon Mar 21 21:57:30 2016 -0700
Committer: Allen Wittenauer <aw...@apache.org>
Committed: Tue Mar 22 15:52:55 2016 -0700

----------------------------------------------------------------------
 .../in-progress/precommit-advanced.md           |   4 +-
 .../in-progress/precommit-buildtools.md         |   4 +-
 precommit/core.d/00-yetuslib.sh                 |  16 +++
 precommit/personality/accumulo.sh               |   5 +-
 precommit/personality/hadoop.sh                 |  23 +++--
 precommit/personality/hbase.sh                  |   4 +-
 precommit/personality/kafka.sh                  |   4 +-
 precommit/test-patch.d/ant.sh                   |   5 +-
 precommit/test-patch.d/author.sh                |  13 ++-
 precommit/test-patch.d/checkstyle.sh            |   2 +-
 precommit/test-patch.d/cmake.sh                 |   2 +-
 precommit/test-patch.d/gradle.sh                |   5 +-
 precommit/test-patch.d/make.sh                  |   5 +-
 precommit/test-patch.d/maven.sh                 |  39 ++++----
 precommit/test-patch.d/nobuild.sh               |   5 +-
 precommit/test-patch.d/perlcritic.sh            |   4 +-
 precommit/test-patch.d/pylint.sh                |   4 +-
 precommit/test-patch.d/rubocop.sh               |   4 +-
 precommit/test-patch.d/ruby-lint.sh             |   4 +-
 precommit/test-patch.d/test4tests.sh            |   2 +-
 precommit/test-patch.d/xml.sh                   |   2 +-
 precommit/test-patch.sh                         | 100 +++++++++----------
 22 files changed, 138 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/asf-site-src/source/documentation/in-progress/precommit-advanced.md
----------------------------------------------------------------------
diff --git a/asf-site-src/source/documentation/in-progress/precommit-advanced.md b/asf-site-src/source/documentation/in-progress/precommit-advanced.md
index 3a66799..d64392a 100644
--- a/asf-site-src/source/documentation/in-progress/precommit-advanced.md
+++ b/asf-site-src/source/documentation/in-progress/precommit-advanced.md
@@ -249,9 +249,9 @@ There are a handful of extremely important system variables that make life easie
 
 * BUILDTOOL specifies which tool is currently being used to drive compilation.  Additionally, many build tools define xyz\_ARGS to pass on to the build tool command line. (e.g., MAVEN\_ARGS if maven is in use).  Projects may set this in their personality.  NOTE: today, only one build tool at a time is supported.  This may change in the future.
 
-* CHANGED\_FILES is a list of all files that appear to be added, deleted, or modified in the patch.
+* CHANGED\_FILES[@] is an array of all files that appear to be added, deleted, or modified in the patch.
 
-* CHANGED\_MODULES is a list of all modules that house all of the CHANGED\_FILES.  Be aware that the root of the source tree is reported as '.'.
+* CHANGED\_MODULES[@] is an array of all modules that house all of the CHANGED\_FILES[@].  Be aware that the root of the source tree is reported as '.'.
 
 * GITHUB\_REPO is to help test-patch when talking to Github.  If test-patch is given just a number on the command line, it will default to using this repo to determine the pull request.
 

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/asf-site-src/source/documentation/in-progress/precommit-buildtools.md
----------------------------------------------------------------------
diff --git a/asf-site-src/source/documentation/in-progress/precommit-buildtools.md b/asf-site-src/source/documentation/in-progress/precommit-buildtools.md
index 98d94e9..e800135 100644
--- a/asf-site-src/source/documentation/in-progress/precommit-buildtools.md
+++ b/asf-site-src/source/documentation/in-progress/precommit-buildtools.md
@@ -90,7 +90,7 @@ For example, the gradle build tool does not have a standard way to execute check
 
 * pluginname\_reorder\_modules
 
-    - This functions allows the plugin to (re-)order the modules (e.g. based on the output of the maven dependency plugin). When called CHANGED\_MODULES already contains all changed modules. It must be altered to have an effect.
+    - This functions allows the plugin to (re-)order the modules (e.g. based on the output of the maven dependency plugin). When called CHANGED\_MODULES[@] already contains all changed modules. It must be altered to have an effect.
 
 * pluginname\_(test)\_logfilter
 
@@ -166,4 +166,4 @@ By default, test-patch will pass -Ptest-patch to Maven. This will allow you to c
 
 Maven will test eclipse and site if maven is being used as the build tool and appropriate files trigger them.
 
-Maven will trigger add a maven install test when the `maven_add_install` function has been used and the related tests are requierd. Plug-ins that need to run maven before MUST call it as part of their respective initialize functions, otherwise maven may fail unexpectedly.  All Yetus provided plug-ins that require maven will trigger the maven install functionality.
\ No newline at end of file
+Maven will trigger add a maven install test when the `maven_add_install` function has been used and the related tests are requierd. Plug-ins that need to run maven before MUST call it as part of their respective initialize functions, otherwise maven may fail unexpectedly.  All Yetus provided plug-ins that require maven will trigger the maven install functionality.

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/core.d/00-yetuslib.sh
----------------------------------------------------------------------
diff --git a/precommit/core.d/00-yetuslib.sh b/precommit/core.d/00-yetuslib.sh
index 1410b33..1bd63b7 100755
--- a/precommit/core.d/00-yetuslib.sh
+++ b/precommit/core.d/00-yetuslib.sh
@@ -224,3 +224,19 @@ function yetus_generic_columnprinter
     ((i=i+1))
   done
 }
+
+## @description  Convert a comma-delimited string to an array
+## @audience     public
+## @stability    evolving
+## @replaceable  no
+## @param        arrayname
+## @param        string
+function yetus_comma_to_array
+{
+  declare var=$1
+  declare string=$2
+
+  oldifs="${IFS}"
+  IFS=',' read -r -a "${var}" <<< "${string}"
+  IFS="${oldifs}"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/personality/accumulo.sh
----------------------------------------------------------------------
diff --git a/precommit/personality/accumulo.sh b/precommit/personality/accumulo.sh
index 84a9c8c..de1b890 100755
--- a/precommit/personality/accumulo.sh
+++ b/precommit/personality/accumulo.sh
@@ -50,8 +50,7 @@ function personality_modules
   fi
 
   # Make sure we re-add the changed modules if we didn't short-circuit out
-  for module in ${CHANGED_MODULES}; do
-    # shellcheck disable=SC2086
-    personality_enqueue_module ${module}
+  for module in "${CHANGED_MODULES[@]}"; do
+    personality_enqueue_module "${module}"
   done
 }

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/personality/hadoop.sh
----------------------------------------------------------------------
diff --git a/precommit/personality/hadoop.sh b/precommit/personality/hadoop.sh
index 1084cd5..02df4b1 100755
--- a/precommit/personality/hadoop.sh
+++ b/precommit/personality/hadoop.sh
@@ -38,9 +38,9 @@ function hadoop_order
   declare hadoopm
 
   if [[ ${ordering} = normal ]]; then
-    hadoopm=${CHANGED_MODULES}
+    hadoopm="${CHANGED_MODULES[*]}"
   elif  [[ ${ordering} = union ]]; then
-    hadoopm=${CHANGED_UNION_MODULES}
+    hadoopm="${CHANGED_UNION_MODULES}"
   else
     hadoopm="${ordering}"
   fi
@@ -144,6 +144,7 @@ function personality_modules
   declare extra=""
   declare ordering="normal"
   declare needflags=false
+  declare foundbats=false
   declare flags
   declare fn
   declare i
@@ -170,7 +171,7 @@ function personality_modules
       needflags=true
 
       # if something in common changed, we build the whole world
-      if [[ ${CHANGED_MODULES} =~ hadoop-common ]]; then
+      if [[ "${CHANGED_MODULES[*]}" =~ hadoop-common ]]; then
         yetus_debug "hadoop personality: javac + hadoop-common = ordering set to . "
         ordering="."
       fi
@@ -180,7 +181,7 @@ function personality_modules
       extra="-DskipTests"
     ;;
     javadoc)
-      if [[ "${CHANGED_MODULES}" =~ \. ]]; then
+      if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
         ordering=.
       fi
 
@@ -199,7 +200,7 @@ function personality_modules
       extra="-Pdocs -DskipTests"
     ;;
     mvneclipse)
-      if [[ "${CHANGED_MODULES}" =~ \. ]]; then
+      if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
         ordering=.
       fi
     ;;
@@ -210,12 +211,12 @@ function personality_modules
       fi
     ;;
     mvnsite)
-      if [[ "${CHANGED_MODULES}" =~ \. ]]; then
+      if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
         ordering=.
       fi
     ;;
     unit)
-      if [[ "${CHANGED_MODULES}" =~ \. ]]; then
+      if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
         ordering=.
       fi
 
@@ -237,7 +238,13 @@ function personality_modules
         fi
       fi
 
-      if ! verify_needed_test shellcheck && [[ ! ${CHANGED_FILES} =~ \.bats ]]; then
+      for i in "${CHANGED_FILES[@]}"; do
+        if [[ "${i}" =~ \.bats ]]; then
+          foundbats=true
+        fi
+      done
+
+      if ! verify_needed_test shellcheck && [[ ${foundbats} = false ]]; then
         yetus_debug "hadoop: NO shell code change detected; disabling shelltest profile"
         extra="${extra} -P!shelltest"
       else

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/personality/hbase.sh
----------------------------------------------------------------------
diff --git a/precommit/personality/hbase.sh b/precommit/personality/hbase.sh
index 4705903..7863bb2 100755
--- a/precommit/personality/hbase.sh
+++ b/precommit/personality/hbase.sh
@@ -51,7 +51,7 @@ function personality_modules
    fi
 
   if [[ ${testtype} = findbugs ]]; then
-    for module in ${CHANGED_MODULES}; do
+    for module in "${CHANGED_MODULES[@]}"; do
       # skip findbugs on hbase-shell
       if [[ ${module} == hbase-shell ]]; then
         continue
@@ -63,7 +63,7 @@ function personality_modules
     return
   fi
 
-  for module in ${CHANGED_MODULES}; do
+  for module in "${CHANGED_MODULES[@]}"; do
     # shellcheck disable=SC2086
     personality_enqueue_module ${module} ${extra}
   done

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/personality/kafka.sh
----------------------------------------------------------------------
diff --git a/precommit/personality/kafka.sh b/precommit/personality/kafka.sh
index 3c2f2c4..8d866c9 100755
--- a/precommit/personality/kafka.sh
+++ b/precommit/personality/kafka.sh
@@ -56,8 +56,8 @@ function personality_modules
     ;;
   esac
 
-  for module in ${CHANGED_MODULES}; do
+  for module in "${CHANGED_MODULES[@]}"; do
     # shellcheck disable=SC2086
-    personality_enqueue_module ${module} ${extra}
+    personality_enqueue_module "${module}" ${extra}
   done
 }

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/ant.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/ant.sh b/precommit/test-patch.d/ant.sh
index 51356e7..64c4067 100755
--- a/precommit/test-patch.d/ant.sh
+++ b/precommit/test-patch.d/ant.sh
@@ -156,9 +156,8 @@ function ant_builtin_personality_modules
 
   clear_personality_queue
 
-  for module in ${CHANGED_MODULES}; do
-    # shellcheck disable=SC2086
-    personality_enqueue_module ${module}
+  for module in "${CHANGED_MODULES[@]}"; do
+    personality_enqueue_module "${module}"
   done
 }
 

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/author.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/author.sh b/precommit/test-patch.d/author.sh
index 19b4dee..4497d03 100755
--- a/precommit/test-patch.d/author.sh
+++ b/precommit/test-patch.d/author.sh
@@ -28,16 +28,19 @@ function author_patchfile
   declare authorTags
   # shellcheck disable=SC2155
   declare -r appname=$(basename "${BASH_SOURCE-$0}")
+  declare i
 
   big_console_header "Checking there are no @author tags in the patch."
 
   start_clock
 
-  if [[ ${CHANGED_FILES} =~ ${appname} ]]; then
-    echo "Skipping @author checks as ${appname} has been patched."
-    add_vote_table 0 @author "Skipping @author checks as ${appname} has been patched."
-    return 0
-  fi
+  for i in "${CHANGED_FILES[@]}"; do
+    if [[ ${i} =~ ${appname} ]]; then
+      echo "Skipping @author checks as ${appname} has been patched."
+      add_vote_table 0 @author "Skipping @author checks as ${appname} has been patched."
+      return 0
+    fi
+  done
 
   ${GREP} -i -n '^[^-].*@author' "${patchfile}" >> "${PATCH_DIR}/author-tags.txt"
   # shellcheck disable=SC2016

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/checkstyle.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/checkstyle.sh b/precommit/test-patch.d/checkstyle.sh
index 1c0e078..de1935f 100755
--- a/precommit/test-patch.d/checkstyle.sh
+++ b/precommit/test-patch.d/checkstyle.sh
@@ -215,7 +215,7 @@ function checkstyle_runner
       # this will grealy cut down how much work we
       # have to do later
 
-      for j in ${CHANGED_FILES}; do
+      for j in "${CHANGED_FILES[@]}"; do
         ${GREP} "${j}" "${tmp}" >> "${tmp}.1"
       done
 

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/cmake.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/cmake.sh b/precommit/test-patch.d/cmake.sh
index 2eabd1e..9b5f265 100755
--- a/precommit/test-patch.d/cmake.sh
+++ b/precommit/test-patch.d/cmake.sh
@@ -77,7 +77,7 @@ function cmake_reorder_modules
     #shellcheck disable=SC2034
     BUILDTOOLCWD="@@@BASEDIR@@@/${CMAKE_BUILD_DIR}"
     #shellcheck disable=SC2034
-    CHANGED_MODULES="."
+    CHANGED_MODULES=(".")
     #shellcheck disable=SC2034
     CHANGED_UNION_MODULES="."
   else

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/gradle.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/gradle.sh b/precommit/test-patch.d/gradle.sh
index f6724ad..57e023d 100755
--- a/precommit/test-patch.d/gradle.sh
+++ b/precommit/test-patch.d/gradle.sh
@@ -217,9 +217,8 @@ function gradle_builtin_personality_modules
 
   clear_personality_queue
 
-  for module in ${CHANGED_MODULES}; do
-    # shellcheck disable=SC2086
-    personality_enqueue_module ${module}
+  for module in "${CHANGED_MODULES[@]}"; do
+    personality_enqueue_module "${module}"
   done
 }
 

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/make.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/make.sh b/precommit/test-patch.d/make.sh
index 5e80132..92ba8e6 100755
--- a/precommit/test-patch.d/make.sh
+++ b/precommit/test-patch.d/make.sh
@@ -131,9 +131,8 @@ function make_builtin_personality_modules
 
   clear_personality_queue
 
-  for module in ${CHANGED_MODULES}; do
-    # shellcheck disable=SC2086
-    personality_enqueue_module ${module}
+  for module in "${CHANGED_MODULES[@]}"; do
+    personality_enqueue_module "${module}"
   done
 }
 

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/maven.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/maven.sh b/precommit/test-patch.d/maven.sh
index 3e98957..6cc64f5 100755
--- a/precommit/test-patch.d/maven.sh
+++ b/precommit/test-patch.d/maven.sh
@@ -356,10 +356,10 @@ function maven_javadoc_calcdiffs
 
 function maven_builtin_personality_modules
 {
-  local repostatus=$1
-  local testtype=$2
+  declare repostatus=$1
+  declare testtype=$2
 
-  local module
+  declare module
 
   yetus_debug "Using builtin personality_modules"
   yetus_debug "Personality: ${repostatus} ${testtype}"
@@ -369,14 +369,13 @@ function maven_builtin_personality_modules
   # this always makes sure the local repo has a fresh
   # copy of everything per pom rules.
   if [[ ${repostatus} == branch
-     && ${testtype} == mvninstall ]];then
-     personality_enqueue_module "${CHANGED_UNION_MODULES}"
-     return
-   fi
+        && ${testtype} == mvninstall ]];then
+    personality_enqueue_module "${CHANGED_UNION_MODULES}"
+    return
+  fi
 
-  for module in ${CHANGED_MODULES}; do
-    # shellcheck disable=SC2086
-    personality_enqueue_module ${module}
+  for module in "${CHANGED_MODULES[@]}"; do
+    personality_enqueue_module "${module}"
   done
 }
 
@@ -581,9 +580,11 @@ function maven_reorder_module_process
   declare needroot=false
   declare found
 
-  if [[ ${CHANGED_MODULES} =~ \. ]]; then
-    needroot=true
-  fi
+  for module in "${CHANGED_MODULES[@]}"; do
+    if [[ "${module}" =~ \. ]]; then
+      needroot=true
+    fi
+  done
 
   fn=$(module_file_fragment "${CHANGED_UNION_MODULES}")
   pushd "${BASEDIR}/${CHANGED_UNION_MODULES}" >/dev/null
@@ -600,7 +601,7 @@ function maven_reorder_module_process
     else
       continue
     fi
-    for indexm in ${CHANGED_MODULES}; do
+    for indexm in "${CHANGED_MODULES[@]}"; do
       # modules could be foo/bar, where bar is the artifactid
       # so get the basename and compare that too
       basemod=${indexm##*/}
@@ -619,12 +620,12 @@ function maven_reorder_module_process
     newlist=("${newlist[@]}" " . ")
   fi
 
-  indexm=$(echo "${CHANGED_MODULES}" | wc -w)
+  indexm="${#CHANGED_MODULES[@]}"
   indexn="${#newlist[@]}"
 
   if [[ ${indexm} -ne ${indexn} ]]; then
     yetus_debug "mrm: Missed a module"
-    for indexm in ${CHANGED_MODULES}; do
+    for indexm in "${CHANGED_MODULES[@]}"; do
       found=false
       for indexn in ${newlist[*]}; do
         if [[ "${indexn}" = "${indexm}" ]]; then
@@ -638,7 +639,7 @@ function maven_reorder_module_process
     done
   fi
 
-  CHANGED_MODULES="${newlist[*]}"
+  CHANGED_MODULES=("${newlist[@]}")
 }
 
 ## @description  take a stab at reordering modules based upon
@@ -658,7 +659,7 @@ function maven_reorder_modules
   fi
 
   # don't bother if there is only one
-  index=$(echo "${CHANGED_MODULES}" | wc -w)
+  index="${#CHANGED_MODULES[@]}"
   if [[ ${index} -eq 1 ]]; then
     return
   fi
@@ -670,7 +671,7 @@ function maven_reorder_modules
   maven_reorder_module_process "${repostatus}"
 
   yetus_debug "Maven: finish re-ordering modules"
-  yetus_debug "Finished list: ${CHANGED_MODULES}"
+  yetus_debug "Finished list: ${CHANGED_MODULES[*]}"
 
   add_vote_table 0 mvndep "Maven dependency ordering for ${repostatus}"
 }

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/nobuild.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/nobuild.sh b/precommit/test-patch.d/nobuild.sh
old mode 100644
new mode 100755
index 74d35aa..cf5a2ad
--- a/precommit/test-patch.d/nobuild.sh
+++ b/precommit/test-patch.d/nobuild.sh
@@ -40,9 +40,8 @@ function nobuild_builtin_personality_modules
   yetus_debug "built-in personality for no build system: ${status} ${testtype}"
 
   clear_personality_queue
-  for module in ${CHANGED_MODULES}; do
-    # shellcheck disable=SC2086
-    personality_enqueue_module ${module}
+  for module in "${CHANGED_MODULES[@]}"; do
+    personality_enqueue_module "${module}"
   done
 }
 

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/perlcritic.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/perlcritic.sh b/precommit/test-patch.d/perlcritic.sh
index c346e3d..8297f46 100755
--- a/precommit/test-patch.d/perlcritic.sh
+++ b/precommit/test-patch.d/perlcritic.sh
@@ -70,7 +70,7 @@ function perlcritic_preapply
 
   echo "Running perlcritic against modified perl scripts/modules."
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.p[lm]$ && -f ${i} ]]; then
       ${PERLCRITIC} -1 --verbose 1 "${i}" 2>/dev/null >> "${PATCH_DIR}/branch-perlcritic-result.txt"
     fi
@@ -117,7 +117,7 @@ function perlcritic_postapply
   echo "Running perlcritic against modified perl scripts/modules."
   # we re-check this in case one has been added
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.p[lm]$ && -f ${i} ]]; then
       ${PERLCRITIC} -1 --verbose 1 "${i}" 2>/dev/null >> "${PATCH_DIR}/patch-perlcritic-result.txt"
     fi

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/pylint.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/pylint.sh b/precommit/test-patch.d/pylint.sh
index b73d8a0..2a9e1f8 100755
--- a/precommit/test-patch.d/pylint.sh
+++ b/precommit/test-patch.d/pylint.sh
@@ -77,7 +77,7 @@ function pylint_preapply
 
   echo "Running pylint against modified python scripts."
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.py$ && -f ${i} ]]; then
       # shellcheck disable=SC2086
       eval "${PYLINT} ${PYLINT_OPTIONS} --msg-template='{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}' --reports=n ${i}" \
@@ -124,7 +124,7 @@ function pylint_postapply
   echo "Running pylint against modified python scripts."
   # we re-check this in case one has been added
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.py$ && -f ${i} ]]; then
       # shellcheck disable=SC2086
       eval "${PYLINT} ${PYLINT_OPTIONS} --msg-template='{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}' --reports=n ${i}" \

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/rubocop.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/rubocop.sh b/precommit/test-patch.d/rubocop.sh
index 070eb55..8e1d5b8 100755
--- a/precommit/test-patch.d/rubocop.sh
+++ b/precommit/test-patch.d/rubocop.sh
@@ -70,7 +70,7 @@ function rubocop_preapply
 
   echo "Running rubocop against modified ruby scripts."
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.rb$ && -f ${i} ]]; then
       ${RUBOCOP} -f e "${i}" | ${AWK} '!/[0-9]* files? inspected/' >> "${PATCH_DIR}/branch-rubocop-result.txt"
     fi
@@ -117,7 +117,7 @@ function rubocop_postapply
   echo "Running rubocop against modified ruby scripts."
   # we re-check this in case one has been added
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.rb$ && -f ${i} ]]; then
       ${RUBOCOP} -f e "${i}" | ${AWK} '!/[0-9]* files? inspected/' >> "${PATCH_DIR}/patch-rubocop-result.txt"
     fi

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/ruby-lint.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/ruby-lint.sh b/precommit/test-patch.d/ruby-lint.sh
index 350733e..94d4f53 100755
--- a/precommit/test-patch.d/ruby-lint.sh
+++ b/precommit/test-patch.d/ruby-lint.sh
@@ -69,7 +69,7 @@ function ruby_lint_preapply
 
   echo "Running ruby-lint against modified ruby scripts."
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.rb$ && -f ${i} ]]; then
       ${RUBY_LINT} -p syntastic "${i}" | sort -t : -k 1,1 -k 3,3n -k 4,4n >> "${PATCH_DIR}/branch-ruby-lint-result.txt"
     fi
@@ -147,7 +147,7 @@ function ruby_lint_postapply
   echo "Running ruby-lint against modified ruby scripts."
   # we re-check this in case one has been added
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.rb$ && -f ${i} ]]; then
       ${RUBY_LINT} -p syntastic "${i}" | sort -t : -k 1,1 -k 3,3n -k 4,4n >> "${PATCH_DIR}/patch-ruby-lint-result.txt"
     fi

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/test4tests.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/test4tests.sh b/precommit/test-patch.d/test4tests.sh
index f4ad1c7..644fbf9 100755
--- a/precommit/test-patch.d/test4tests.sh
+++ b/precommit/test-patch.d/test4tests.sh
@@ -36,7 +36,7 @@ function test4tests_patchfile
 
   start_clock
 
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ (^|/)test/ ]]; then
       ((testReferences=testReferences + 1))
     fi

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.d/xml.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.d/xml.sh b/precommit/test-patch.d/xml.sh
index dd8f206..08e0a61 100755
--- a/precommit/test-patch.d/xml.sh
+++ b/precommit/test-patch.d/xml.sh
@@ -55,7 +55,7 @@ function xml_postcompile
   start_clock
 
   pushd "${BASEDIR}" >/dev/null
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     if [[ ${i} =~ \.xml$ && -f ${i} ]]; then
       ${js} -e "XMLDocument(arguments[0])" "${i}" >> "${PATCH_DIR}/xml.txt" 2>&1
       if [[ $? != 0 ]]; then

http://git-wip-us.apache.org/repos/asf/yetus/blob/66352f53/precommit/test-patch.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.sh b/precommit/test-patch.sh
index 3f42cd2..7e93b35 100755
--- a/precommit/test-patch.sh
+++ b/precommit/test-patch.sh
@@ -32,6 +32,8 @@ GLOBALTIMER=$(date +"%s")
 QATESTMODE=false
 
 # global arrays
+declare -a CHANGED_FILES
+declare -a CHANGED_MODULES
 declare -a TP_HEADER
 declare -a TP_VOTE_TABLE
 declare -a TP_TEST_TABLE
@@ -42,6 +44,7 @@ declare -a MODULE_STATUS_MSG
 declare -a MODULE_STATUS_LOG
 declare -a MODULE_COMPILE_LOG
 declare -a MODULE
+declare -a USER_MODULE_LIST
 
 TP_HEADER_COUNTER=0
 TP_VOTE_COUNTER=0
@@ -80,12 +83,7 @@ function setup_defaults
   BUILDTOOLCWD=module
 
   # shellcheck disable=SC2034
-  CHANGED_MODULES=""
-
-  # shellcheck disable=SC2034
   CHANGED_UNION_MODULES=""
-  USER_MODULE_LIST=""
-  CHANGED_FILES=""
   REEXECED=false
   RESETREPO=false
   ISSUE=""
@@ -318,7 +316,7 @@ function prepopulate_footer
 ## @replaceable  no
 function finish_footer_table
 {
-  add_footer_table "modules" "C: ${CHANGED_MODULES} U: ${CHANGED_UNION_MODULES}"
+  add_footer_table "modules" "C: ${CHANGED_MODULES[*]} U: ${CHANGED_UNION_MODULES}"
 }
 
 ## @description  Put the final elapsed time at the bottom of the table.
@@ -570,16 +568,16 @@ function compute_unidiff
   # finally rewriting the line so that it is in
   # './filename:diff line:content' format
 
-  for fn in ${CHANGED_FILES}; do
+  for fn in "${CHANGED_FILES[@]}"; do
     filen=${fn##./}
 
     if [[ -f "${filen}" ]]; then
-      ${GIT} diff ${filen} \
+      ${GIT} diff "${filen}" \
         | tail -n +6 \
         | ${GREP} -n '^+' \
         | ${GREP} -vE '^[0-9]*:\+\+\+' \
         | ${SED} -e 's,^\([0-9]*:\)\+,\1,g' \
-          -e s,^,./${filen}:,g \
+          -e "s,^,./${filen}:,g" \
               >>  "${tmpfile}"
     fi
   done
@@ -810,9 +808,8 @@ function parse_args
         BUGLINECOMMENTS=${BUGLINECOMMENTS//,/ }
       ;;
       --modulelist=*)
-        USER_MODULE_LIST=${i#*=}
-        USER_MODULE_LIST=${USER_MODULE_LIST//,/ }
-        yetus_debug "Manually forcing modules ${USER_MODULE_LIST}"
+        yetus_comma_to_array USER_MODULE_LIST "${i#*=}"
+        yetus_debug "Manually forcing modules ${USER_MODULE_LIST[*]}"
       ;;
       --multijdkdirs=*)
         JDK_DIR_LIST=${i#*=}
@@ -1007,14 +1004,19 @@ function find_buildfile_dir
 ## @audience     private
 ## @stability    stable
 ## @replaceable  no
-## @return       None; sets ${CHANGED_FILES}
+## @return       None; sets ${CHANGED_FILES[@]}
 function find_changed_files
 {
+  declare line
+
   # get a list of all of the files that have been changed,
   # except for /dev/null (which would be present for new files).
   # Additionally, remove any a/ b/ patterns at the front of the patch filenames.
   # shellcheck disable=SC2016
-  CHANGED_FILES=$(${AWK} 'function p(s){sub("^[ab]/","",s); if(s!~"^/dev/null"){print s}}
+  while read -r line; do
+    CHANGED_FILES=("${CHANGED_FILES[@]}" "${line}")
+  done < <(
+    ${AWK} 'function p(s){sub("^[ab]/","",s); if(s!~"^/dev/null"){print s}}
     /^diff --git /   { p($3); p($4) }
     /^(\+\+\+|---) / { p($2) }' "${PATCH_DIR}/patch" | sort -u)
 }
@@ -1060,19 +1062,19 @@ function module_skipdir
 ## @stability    stable
 ## @replaceable  no
 ## @param        repostatus
-## @return       None; sets ${CHANGED_MODULES}
+## @return       None; sets ${CHANGED_MODULES[@]}
 function find_changed_modules
 {
-  local repostatus=$1
-  local i
-  local changed_dirs
-  local builddirs
-  local builddir
-  local module
-  local prev_builddir
-  local i=1
-  local dir
-  local buildfile
+  declare repostatus=$1
+  declare i
+  declare builddir
+  declare module
+  declare prev_builddir
+  declare i=1
+  declare dir
+  declare dirt
+  declare buildfile
+  declare -a tmpmods
 
   buildfile=$("${BUILDTOOL}_buildfile")
 
@@ -1082,55 +1084,51 @@ function find_changed_modules
     cleanup_and_exit 1
   fi
 
-  changed_dirs=$(for i in ${CHANGED_FILES}; do dirname "${i}"; done | sort -u)
-
   #  Empty string indicates the build system wants to disable module detection
   if [[ -z ${buildfile} ]]; then
-    builddirs="."
+    tmpmods=(".")
   else
     # Now find all the modules that were changed
-    for i in ${changed_dirs}; do
+    for i in "${CHANGED_FILES[@]}"; do
+      dirt=$(dirname "${i}")
 
-      module_skipdir "${i}"
+      module_skipdir "${dirt}"
       if [[ $? != 0 ]]; then
         continue
       fi
 
-      builddir=$(find_buildfile_dir "${buildfile}" "${i}")
+      builddir=$(find_buildfile_dir "${buildfile}" "${dirt}")
       if [[ -z ${builddir} ]]; then
         yetus_error "ERROR: ${buildfile} is not found. Make sure the target is a ${BUILDTOOL}-based project."
         bugsystem_finalreport 1
         cleanup_and_exit 1
       fi
-      builddirs="${builddirs} ${builddir}"
+      tmpmods=("${tmpmods[@]}" "${builddir}")
     done
   fi
 
-  #shellcheck disable=SC2086,SC2034
-  CHANGED_MODULES=$(echo ${builddirs} ${USER_MODULE_LIST} | tr ' ' '\n' | sort -u)
-  #shellcheck disable=SC2086,SC2034
-  CHANGED_MODULES=$(echo ${CHANGED_MODULES} ${USER_MODULE_LIST} | tr ' ' '\n' | sort -u)
+  tmpmods=("${tmpmods[@]}" "${USER_MODULE_LIST[@]}")
 
-  # turn it back into a list so that anyone printing doesn't
-  # generate multiline output
-  #shellcheck disable=SC2086,SC2116
-  CHANGED_MODULES=$(echo ${CHANGED_MODULES})
+  CHANGED_MODULES=($(printf "%s\n" "${tmpmods[@]}" | sort -u))
 
-  yetus_debug "Locate the union of ${CHANGED_MODULES}"
-  # shellcheck disable=SC2086
-  count=$(echo ${CHANGED_MODULES} | wc -w)
+  yetus_debug "Locate the union of ${CHANGED_MODULES[*]}"
+  count=${#CHANGED_MODULES[@]}
   if [[ ${count} -lt 2 ]]; then
-    yetus_debug "Only one entry, so keeping it ${CHANGED_MODULES}"
+    yetus_debug "Only one entry, so keeping it ${CHANGED_MODULES[0]}"
     # shellcheck disable=SC2034
-    CHANGED_UNION_MODULES=${CHANGED_MODULES}
-
+    CHANGED_UNION_MODULES="${CHANGED_MODULES[0]}"
   else
-
     i=1
     while [[ ${i} -lt 100 ]]
     do
-      module=$(echo "${CHANGED_MODULES}" | tr ' ' '\n' | cut -f1-${i} -d/ | uniq)
-      count=$(echo "${module}" | wc -w)
+      tmpmods=()
+      for j in "${CHANGED_MODULES[@]}"; do
+        tmpmods=("${tmpmods[@]}" $(echo "${j}" | cut -f1-${i} -d/))
+      done
+      tmpmods=($(printf "%s\n" "${tmpmods[@]}" | sort -u))
+
+      module=${tmpmods[0]}
+      count=${#tmpmods[@]}
       if [[ ${count} -eq 1
         && -f ${module}/${buildfile} ]]; then
         prev_builddir=${module}
@@ -1389,7 +1387,7 @@ function determine_needed_tests
   local i
   local plugin
 
-  for i in ${CHANGED_FILES}; do
+  for i in "${CHANGED_FILES[@]}"; do
     yetus_debug "Determining needed tests for ${i}"
     personality_file_tests "${i}"
 
@@ -1575,7 +1573,7 @@ function check_reexec
       "${DOCKERFILE}"; do
     tpdir=$(relative_dir "${testdir}")
     if [[ $? == 0
-        && ${CHANGED_FILES} =~ ${tpdir} ]]; then
+        && "${CHANGED_FILES[*]}" =~ ${tpdir} ]]; then
       copy=true
     fi
   done