YETUS-35. add support for jshint Signed-off-by: Allen Wittenauer <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/yetus/repo Commit: http://git-wip-us.apache.org/repos/asf/yetus/commit/dcc2e5b3 Tree: http://git-wip-us.apache.org/repos/asf/yetus/tree/dcc2e5b3 Diff: http://git-wip-us.apache.org/repos/asf/yetus/diff/dcc2e5b3 Branch: refs/heads/master Commit: dcc2e5b3251c04a39fe7bf7911cc5e0c98ca71fb Parents: 8a502dc Author: Allen Wittenauer <[email protected]> Authored: Sun Oct 7 10:43:19 2018 -0700 Committer: Allen Wittenauer <[email protected]> Committed: Sun Dec 9 22:26:00 2018 -0800 ---------------------------------------------------------------------- .jshintignore | 17 ++ .../src/main/shell/test-patch-docker/Dockerfile | 12 ++ precommit/src/main/shell/test-patch.d/jshint.sh | 207 +++++++++++++++++++ 3 files changed, 236 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/yetus/blob/dcc2e5b3/.jshintignore ---------------------------------------------------------------------- diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 0000000..1d524fc --- /dev/null +++ b/.jshintignore @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +asf-site-src/source/assets/js/bootstrap.js +asf-site-src/source/assets/js/bootstrap.min.js +asf-site-src/source/assets/js/jquery-2.1.4.min.js http://git-wip-us.apache.org/repos/asf/yetus/blob/dcc2e5b3/precommit/src/main/shell/test-patch-docker/Dockerfile ---------------------------------------------------------------------- diff --git a/precommit/src/main/shell/test-patch-docker/Dockerfile b/precommit/src/main/shell/test-patch-docker/Dockerfile index 501e0c6..161c42d 100644 --- a/precommit/src/main/shell/test-patch-docker/Dockerfile +++ b/precommit/src/main/shell/test-patch-docker/Dockerfile @@ -167,6 +167,18 @@ RUN curl -L -s -S \ shasum -a 512 /bin/hadolint | \ awk '$1!="f42e69dddfd2e4ce69848cc67b0800be9ae7ac729360fb9aa7250ee84499e635dc524a470766570d7fa2bd57c58529c4dbbefea80f583e5640b651d4a3b10f63" {exit(1)}' +### +# Install npm and JSHint +### +# hadolint ignore=DL3008,DL3016 +RUN apt-get -q update \ + && apt-get -q install --no-install-recommends -y nodejs npm \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* && \ + ln -s /usr/bin/nodejs /usr/bin/node && \ + npm install -g npm@latest && \ + npm install -g jshint + #### # YETUS CUT HERE # Anthing after the above line is ignored by Yetus, so could http://git-wip-us.apache.org/repos/asf/yetus/blob/dcc2e5b3/precommit/src/main/shell/test-patch.d/jshint.sh ---------------------------------------------------------------------- diff --git a/precommit/src/main/shell/test-patch.d/jshint.sh b/precommit/src/main/shell/test-patch.d/jshint.sh new file mode 100755 index 0000000..0fcf0de --- /dev/null +++ b/precommit/src/main/shell/test-patch.d/jshint.sh @@ -0,0 +1,207 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# no public APIs here +# SHELLDOC-IGNORE + +add_test_type jshint + +JSHINT_TIMER=0 +JSHINT=${JSHINT:-$(command -v jshint 2>/dev/null)} + +function jshint_usage +{ + yetus_add_option "--jshint-cmd=<cmd>" "The 'jshint' command to use (default: ${JSHINT})" +} + +## @description parse maven build tool args +## @replaceable yes +## @audience public +## @stability stable +function jshint_parse_args +{ + declare i + + for i in "$@"; do + case ${i} in + --jshint-cmd=*) + JSHINT=${i#*=} + ;; + esac + done +} + +function jshint_filefilter +{ + declare filename=$1 + + if [[ ${filename} =~ \.js$ ]] || + [[ ${filename} =~ .jshintignore ]] || + [[ ${filename} =~ .jshintrc ]]; then + add_test jshint + fi +} + +function jshint_precheck +{ + if ! verify_command "jshint" "${JSHINT}"; then + add_vote_table 0 jshint "jshint was not available." + delete_test jshint + fi + + cat > "${PATCH_DIR}/jshintreporter.js" << EOF +"use strict"; + +module.exports = { + reporter: function (res) { + var len = res.length; + var str = ""; + + res.forEach(function (r) { + var file = r.file; + var err = r.error; + + str += file + ":" + + err.line + ":" + + err.character + ":" + + err.code + ":" + + err.reason + "\\n"; + }); + + if (str) { + process.stdout.write(str + "\\n" + len + " error" + + ((len === 1) ? "" : "s") + "\\n"); + } + } +}; +EOF +} + +function jshint_logic +{ + declare repostatus=$1 + declare -i count + + pushd "${BASEDIR}" >/dev/null || return 1 + "${JSHINT}" \ + --extract=auto \ + --reporter="${PATCH_DIR}/jshintreporter.js" \ + . \ + > "${PATCH_DIR}/${repostatus}-jshint-result.full.txt" + + # strip the last two lines + #shellcheck disable=SC2016 + count=$(wc -l "${PATCH_DIR}/${repostatus}-jshint-result.full.txt" | "${AWK}" '{print $1}') + ((count=count-2)) + if [[ "${count}" -gt 0 ]]; then + head "-${count}" "${PATCH_DIR}/${repostatus}-jshint-result.full.txt"\ + > "${PATCH_DIR}/${repostatus}-jshint-result.txt" + else + touch "${PATCH_DIR}/${repostatus}-jshint-result.txt" + fi + popd > /dev/null || return 1 +} + +function jshint_preapply +{ + if ! verify_needed_test jshint; then + return 0 + fi + + big_console_header "jshint plugin: ${PATCH_BRANCH}" + + start_clock + + jshint_logic branch + + # keep track of how much as elapsed for us already + JSHINT_TIMER=$(stop_clock) + return 0 +} + +## filename:line:character:code:error msg +function jshint_calcdiffs +{ + column_calcdiffs "$@" +} + +function jshint_postapply +{ + declare i + declare numPrepatch + declare numPostpatch + declare diffPostpatch + declare fixedpatch + declare statstring + + if ! verify_needed_test jshint; then + return 0 + fi + + big_console_header "jshint plugin: ${BUILDMODE}" + + start_clock + + # add our previous elapsed to our new timer + # by setting the clock back + offset_clock "${JSHINT_TIMER}" + + jshint_logic patch + + calcdiffs \ + "${PATCH_DIR}/branch-jshint-result.txt" \ + "${PATCH_DIR}/patch-jshint-result.txt" \ + jshint \ + > "${PATCH_DIR}/diff-patch-jshint.txt" + + # shellcheck disable=SC2016 + numPrepatch=$(wc -l "${PATCH_DIR}/branch-jshint-result.txt" | ${AWK} '{print $1}') + + # shellcheck disable=SC2016 + numPostpatch=$(wc -l "${PATCH_DIR}/patch-jshint-result.txt" | ${AWK} '{print $1}') + + # shellcheck disable=SC2016 + diffPostpatch=$(wc -l "${PATCH_DIR}/diff-patch-jshint.txt" | ${AWK} '{print $1}') + + + ((fixedpatch=numPrepatch-numPostpatch+diffPostpatch)) + + statstring=$(generic_calcdiff_status "${numPrepatch}" "${numPostpatch}" "${diffPostpatch}" ) + + if [[ ${diffPostpatch} -gt 0 ]] ; then + add_vote_table -1 jshint "${BUILDMODEMSG} ${statstring}" + add_footer_table jshint "@@BASE@@/diff-patch-jshint.txt" + bugsystem_linecomments "jshint" "${PATCH_DIR}/diff-patch-jshint.txt" + return 1 + elif [[ ${fixedpatch} -gt 0 ]]; then + add_vote_table +1 jshint "${BUILDMODEMSG} ${statstring}" + return 0 + fi + + add_vote_table +1 jshint "There were no new jshint issues." + return 0 +} + +function jshint_precompile +{ + declare repostatus=$1 + + if [[ "${repostatus}" = branch ]]; then + jshint_preapply + else + jshint_postapply + fi +}
