From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Augusto Stoffel Newsgroups: gmane.emacs.bugs Subject: bug#57884: [PATCH] Flymake backend using the shellcheck program Date: Sat, 24 Sep 2022 09:05:43 +0200 Message-ID: <87r101meuw.fsf@gmail.com> References: <87a66yaqwc.fsf@gmail.com> <83bkre0w4m.fsf@gnu.org> <871qs9c3er.fsf@gmail.com> <87zgewdhhd.fsf@posteo.net> <87fsgoyi0l.fsf@gmail.com> <87sfko4zjq.fsf@posteo.net> <87edw8n71p.fsf@gmail.com> <8735co4wxx.fsf@posteo.net> <878rmgcw2e.fsf@gmail.com> <87h7148mba.fsf@posteo.net> <87sfko755f.fsf@posteo.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="39031"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) Cc: Eli Zaretskii , 57884@debbugs.gnu.org, Stefan Kangas To: Philip Kaludercic Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Sep 24 09:06:32 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1obzFA-0009wt-Hh for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 24 Sep 2022 09:06:32 +0200 Original-Received: from localhost ([::1]:59468 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1obzF9-0007kY-7W for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 24 Sep 2022 03:06:31 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53946) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1obzEg-0007jZ-OG for bug-gnu-emacs@gnu.org; Sat, 24 Sep 2022 03:06:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:43062) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1obzEg-0004DA-GR for bug-gnu-emacs@gnu.org; Sat, 24 Sep 2022 03:06:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1obzEf-0006K3-MU for bug-gnu-emacs@gnu.org; Sat, 24 Sep 2022 03:06:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Augusto Stoffel Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 24 Sep 2022 07:06:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 57884 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 57884-submit@debbugs.gnu.org id=B57884.166400315524291 (code B ref 57884); Sat, 24 Sep 2022 07:06:01 +0000 Original-Received: (at 57884) by debbugs.gnu.org; 24 Sep 2022 07:05:55 +0000 Original-Received: from localhost ([127.0.0.1]:42140 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1obzEY-0006Jh-HZ for submit@debbugs.gnu.org; Sat, 24 Sep 2022 03:05:54 -0400 Original-Received: from mail-ed1-f47.google.com ([209.85.208.47]:43621) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1obzEW-0006JR-Jv for 57884@debbugs.gnu.org; Sat, 24 Sep 2022 03:05:53 -0400 Original-Received: by mail-ed1-f47.google.com with SMTP id y8so2761703edc.10 for <57884@debbugs.gnu.org>; Sat, 24 Sep 2022 00:05:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date; bh=ggoA1dPsmwRydaawS7xoCF5PylKKU+ClhplZk+zRmeI=; b=CyDXPetU2acpqVEVZ4JkPafJ9Y9nFSwqzx4djquR/QbFXH2gh7DKP/CS4miY+KRZyj pcLQmafHAQeKQf8KCATROOVDY954LmlinAKxr++pFjdqLA3iUTzIyRLnLj39WemUqgIL oP6CXSIFJrrM1TJooLuOqVZtbHiqWqZ5qKDofsqqqWVpFwO9vjN/Ue06pgi9bK259l0p NhFFNtpEezEedq2w8dkkh0rmTfz33HMSoyhSUMTxUOOYMBKnV8XKJh1tqs3EPS1JjPIS xGAaOJ8lRh1Lylq1GmpZs+aGMI8/xcSmf+4j3iu10T4OSsuAvbzQgMQoITjA+Vcok9up iLng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date; bh=ggoA1dPsmwRydaawS7xoCF5PylKKU+ClhplZk+zRmeI=; b=OpfFiqEMQNEexv2CCKtKxtm/wHdnm5g42pM/UqWnwTGf7G+ltVq8MRwJJgRwtdFOFA ctNVdzvOGp8AjZhZTmid2hnHe9o2+CeSZIL14CgZ+3OpF1awzAnZFE2rfEo3jG3h0lAo ElVAWRyrgzdpPWogEqkkb7dAuuVc3/XQ8yNt6nZkNl6avbOC+2oeW8jssCqLiETyxN7x /k3QCGFF+VRcJp1gmVUFettsdWqPlWP0DLJXH8LHgXJ4VkR5srZma4tCSZCfwbIh1M/o E8V6L/URl2RwG1TITKk9opcCEP3c/5LexrtMPZSJibxUK3tukWaT2yzF8iVaeaKvv3M8 DI1g== X-Gm-Message-State: ACrzQf1SyiE/Ex4QFrHCzuVIqc60c4R/m4gnQnuUckyMMM3e2Jv5dzHX SuncpaI8aYt3KPcbvO6UIDo= X-Google-Smtp-Source: AMsMyM7zTvHnTxbUoX7DT4qCIxjN1wyLLL5Fz9UMmWctxnbTOrOhTTTtYbGbAtFyNQETjEoa7Erw3w== X-Received: by 2002:a05:6402:f0f:b0:451:1ecd:a61f with SMTP id i15-20020a0564020f0f00b004511ecda61fmr12067986eda.125.1664003146769; Sat, 24 Sep 2022 00:05:46 -0700 (PDT) Original-Received: from ars3 ([2a02:8109:8ac0:56d0::8510]) by smtp.gmail.com with ESMTPSA id ee35-20020a056402292300b004570cbdb38csm111823edb.96.2022.09.24.00.05.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 24 Sep 2022 00:05:44 -0700 (PDT) In-Reply-To: <87sfko755f.fsf@posteo.net> (Philip Kaludercic's message of "Sun, 18 Sep 2022 21:18:36 +0000") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:243507 Archived-At: --=-=-= Content-Type: text/plain On Sun, 18 Sep 2022 at 21:18, Philip Kaludercic wrote: > I just tried it out and it behaves the way you advertised it. Could someone merge this patch then, so it gets some testing before Emacs 29 is cut? I've attached the patch again for your reference. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-New-Flymake-backend-using-the-shellcheck-program.patch >From 49fbfaf98cb6d11b877eaa4a72b116aa61646d75 Mon Sep 17 00:00:00 2001 From: Augusto Stoffel Date: Sat, 17 Sep 2022 18:30:04 +0200 Subject: [PATCH] New Flymake backend using the shellcheck program See bug#57884. * lisp/progmodes/sh-script.el: Require let-alist and subr-x when compiling. (sh--json-read): Helper function to deal with possible absence of json-parse-buffer. (sh-shellcheck-program, sh--shellcheck-process, sh-shellcheck-flymake): Variables and function defining a Flymake backend. (sh-mode): Add it to 'flymake-diagnostic-functions'. --- etc/NEWS | 4 ++ lisp/progmodes/sh-script.el | 90 ++++++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index a6a8883593..5b2ed16063 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1320,6 +1320,10 @@ This controls how statements like the following are indented: foo && bar +*** New Flymake backend using the ShellCheck program +It is enabled by default, but requires that the external "shellcheck" +command is installed. + ** Cperl Mode --- diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 517fbbd8e7..558b62b20a 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -31,6 +31,9 @@ ;; available for filenames, variables known from the script, the shell and ;; the environment as well as commands. +;; A Flymake backend using the "shellcheck" program is provided. See +;; https://www.shellcheck.net/ for installation instructions. + ;;; Known Bugs: ;; - In Bourne the keyword `in' is not anchored to case, for, select ... @@ -141,7 +144,9 @@ (eval-when-compile (require 'skeleton) (require 'cl-lib) - (require 'comint)) + (require 'comint) + (require 'let-alist) + (require 'subr-x)) (require 'executable) (autoload 'comint-completion-at-point "comint") @@ -1580,6 +1585,7 @@ sh-mode ((equal (file-name-nondirectory buffer-file-name) ".profile") "sh") (t sh-shell-file)) nil nil) + (add-hook 'flymake-diagnostic-functions #'sh-shellcheck-flymake nil t) (add-hook 'hack-local-variables-hook #'sh-after-hack-local-variables nil t)) @@ -3103,6 +3109,88 @@ sh-delete-backslash (delete-region (1+ (point)) (progn (skip-chars-backward " \t") (point))))))) +;;; Flymake backend + +(defcustom sh-shellcheck-program "shellcheck" + "Name of the shellcheck executable." + :type 'string + :version "29.1") + +(defcustom sh-shellcheck-arguments nil + "Additional arguments to the shellcheck program." + :type '(repeat string) + :version "29.1") + +(defvar-local sh--shellcheck-process nil) + +(defalias 'sh--json-read + (if (fboundp 'json-parse-buffer) + (lambda () (json-parse-buffer :object-type 'alist)) + (require 'json) + 'json-read)) + +(defun sh-shellcheck-flymake (report-fn &rest _args) + "Flymake backend using the shellcheck program. +Takes a Flymake callback REPORT-FN as argument, as expected of a +member of `flymake-diagnostic-functions'." + (when (process-live-p sh--shellcheck-process) + (kill-process sh--shellcheck-process)) + (let* ((source (current-buffer)) + (dialect (named-let recur ((s sh-shell)) + (pcase s + ((or 'bash 'dash 'sh) (symbol-name s)) + ('ksh88 "ksh") + ((guard s) + (recur (alist-get s sh-ancestor-alist)))))) + (sentinel + (lambda (proc _event) + (when (memq (process-status proc) '(exit signal)) + (unwind-protect + (if (with-current-buffer source + (not (eq proc sh--shellcheck-process))) + (flymake-log :warning "Canceling obsolete check %s" proc) + (with-current-buffer (process-buffer proc) + (goto-char (point-min)) + (thread-last + (sh--json-read) + (alist-get 'comments) + (seq-filter + (lambda (item) + (let-alist item (string= .file "-")))) + (mapcar + (lambda (item) + (let-alist item + (flymake-make-diagnostic + source + (cons .line .column) + (unless (and (eq .line .endLine) + (eq .column .endColumn)) + (cons .endLine .endColumn)) + (pcase .level + ("error" :error) + ("warning" :warning) + (_ :note)) + (format "SC%s: %s" .code .message))))) + (funcall report-fn)))) + (kill-buffer (process-buffer proc))))))) + (unless dialect + (error "`sh-shellcheck-flymake' is not suitable for shell type `%s'" + sh-shell)) + (setq sh--shellcheck-process + (make-process + :name "shellcheck" :noquery t :connection-type 'pipe + :buffer (generate-new-buffer " *flymake-shellcheck*") + :command `(,sh-shellcheck-program + "--format=json1" + "-s" ,dialect + ,@sh-shellcheck-arguments + "-") + :sentinel sentinel)) + (save-restriction + (widen) + (process-send-region sh--shellcheck-process (point-min) (point-max)) + (process-send-eof sh--shellcheck-process)))) + (provide 'sh-script) ;;; sh-script.el ends here -- 2.37.3 --=-=-= Content-Type: text/plain Thanks! --=-=-=--