From 9916410fa8bc765677e2d09384599aa85945967d Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Tue, 25 Dec 2018 18:23:01 +0200 Subject: [PATCH] Prepend 'rubocop' with 'bundle exec' when appropriate --- etc/NEWS | 2 ++ lisp/progmodes/ruby-mode.el | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index 34151d8caad..e427e84780d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -511,6 +511,8 @@ This enables more efficient backends. See the docstring of *** The Rubocop Flymake diagnostic function will only run Lint cops if it can't find the config file. +*** Rubocop is called with 'bundle exec' if Gemfile mentions it. + ** Package *** New function 'package-get-version' lets packages query their own version. diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index 351dac2f852..d0ae9b4644f 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -2323,6 +2323,7 @@ If there is no Rubocop config file, Rubocop will be passed a flag (let ((command (list "rubocop" "--stdin" buffer-file-name "--format" "emacs" "--cache" "false" ; Work around a bug in old version. "--display-cop-names")) + (default-directory default-directory) config-dir) (when buffer-file-name (setq config-dir (locate-dominating-file buffer-file-name @@ -2331,7 +2332,12 @@ If there is no Rubocop config file, Rubocop will be passed a flag (setq command (append command '("--lint"))) (setq command (append command (list "--config" (expand-file-name ruby-rubocop-config - config-dir))))) + config-dir)))) + (when (ruby-flymake-rubocop--use-bundler-p config-dir) + (setq command (append '("bundle" "exec") command)) + ;; In case of a project with multiple nested subprojects, + ;; each one with a Gemfile. + (setq default-directory config-dir))) (ruby-flymake--helper "rubocop-flymake" @@ -2369,6 +2375,13 @@ If there is no Rubocop config file, Rubocop will be passed a flag into diags finally (funcall report-fn diags))))))) +(defun ruby-flymake-rubocop--use-bundler-p (dir) + (let ((file (expand-file-name "Gemfile" dir))) + (and (file-exists-p file) + (with-temp-buffer + (insert-file-contents file) + (re-search-forward "^ *gem ['\"]rubocop['\"]" nil t))))) + (defun ruby-flymake-auto (report-fn &rest args) (apply (if (and ruby-flymake-use-rubocop-if-available -- 2.39.5