[polari] ci: Import run-eslint script from gnome-shell



commit 370718206b6e32b204df9d67b01b7106a4c7d259
Author: Florian Müllner <fmuellner gnome org>
Date:   Wed Aug 14 13:19:36 2019 +0200

    ci: Import run-eslint script from gnome-shell
    
    Since we dropped the legacy configuration, we run eslint directly
    instead of via a script. However gnome-shell's variant of the script
    also has special treatment of merge requests to only consider errors
    in changed lines.
    
    While we strive for zero errors, new errors can appear when we update
    eslint or change the configuration. Not blocking merge requests due
    to unrelated eslint errors is a good thing, run eslint through a
    modified version of the gnome-shell script.
    
    https://gitlab.gnome.org/GNOME/polari/merge_requests/130

 .gitlab-ci.yml           |  5 ++--
 .gitlab-ci/run-eslint.sh | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 3 deletions(-)
---
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1e40047..a2c1d0d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,7 +8,6 @@ stages:
 
 variables:
     BUNDLE: "polari-git.flatpak"
-    LINT_LOG: "eslint-report.txt"
 
 .only_default: &only_default
     only:
@@ -28,11 +27,11 @@ eslint:
     image: registry.gitlab.gnome.org/gnome/gjs:fedora.static-analysis
     stage: source_check
     script:
-        - eslint -o $LINT_LOG --no-color src || { cat $LINT_LOG; false; }
+        - ./.gitlab-ci/run-eslint.sh
     <<: *only_default
     artifacts:
         paths:
-            - ${LINT_LOG}
+            - reports
         when: on_failure
 
 flatpak:
diff --git a/.gitlab-ci/run-eslint.sh b/.gitlab-ci/run-eslint.sh
new file mode 100755
index 0000000..5d36162
--- /dev/null
+++ b/.gitlab-ci/run-eslint.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+
+OUTPUT_REGULAR=reports/lint-report.txt
+OUTPUT_MR=reports/lint-mr-report.txt
+
+SRCDIR=src
+
+LINE_CHANGES=changed-lines.txt
+
+is_empty() {
+  (! grep -q . $1)
+}
+
+run_eslint() {
+  # ensure output exists even if eslint doesn't report any errors
+  mkdir -p $(dirname $OUTPUT_REGULAR)
+  touch $OUTPUT_REGULAR
+
+  eslint -f unix -o $OUTPUT_REGULAR $SRCDIR
+}
+
+list_commit_range_additions() {
+  # Turn raw context-less git-diff into a list of
+  # filename:lineno pairs of new (+) lines
+  git diff -U0 "$@" -- js |
+  awk '
+    BEGIN { file=""; }
+    /^+++ b/ { file=substr($0,7); }
+    /^@@ / {
+        len = split($3,a,",")
+        start=a[1]
+        count=(len > 1) ? a[2] : 1
+
+        for (line=start; line<start+count; line++)
+            printf "%s/%s:%d:\n",ENVIRON["PWD"],file,line;
+    }'
+}
+
+copy_matched_lines() {
+  local source=$1
+  local matches=$2
+  local target=$3
+
+  echo -n > $target
+  for l in $(<$matches); do
+    grep $l $source >> $target
+  done
+}
+
+# Clean up old files from previous runs
+rm -f $OUTPUT_REGULAR $OUTPUT_MR $LINE_CHANGES
+
+if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
+  git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
+  branch_point=$(git merge-base HEAD FETCH_HEAD)
+  commit_range=$branch_point...$CI_COMMIT_SHA
+
+  list_commit_range_additions $commit_range > $LINE_CHANGES
+
+  # Don't bother with running lint when no JS changed
+  if is_empty $LINE_CHANGES; then
+    exit 0
+  fi
+fi
+
+echo Generating lint report
+run_eslint
+echo Done.
+
+# Just show the report and succeed when not testing a MR
+if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
+  cat $OUTPUT_REGULAR
+  exit 0
+fi
+
+copy_matched_lines $OUTPUT_REGULAR $LINE_CHANGES $OUTPUT_MR
+cat $OUTPUT_MR
+is_empty $OUTPUT_MR


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]