From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#22679: 25.0.91; ibuffer-do-shell-command-pipe truncate output Date: Fri, 03 Feb 2017 13:25:25 +0900 Message-ID: <87poiz2956.fsf@calancha-pc> References: <7oa66k9es.fsf@fencepost.gnu.org> <87o9ytuig7.fsf@calancha-pc> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1486095980 14630 195.159.176.226 (3 Feb 2017 04:26:20 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 3 Feb 2017 04:26:20 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) Cc: Stefan Monnier , Tino Calancha To: 22679@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Feb 03 05:26:15 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cZVRu-0003aT-54 for geb-bug-gnu-emacs@m.gmane.org; Fri, 03 Feb 2017 05:26:14 +0100 Original-Received: from localhost ([::1]:60134 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZVRz-0004LV-Gb for geb-bug-gnu-emacs@m.gmane.org; Thu, 02 Feb 2017 23:26:19 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:53928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZVRn-0004J8-Be for bug-gnu-emacs@gnu.org; Thu, 02 Feb 2017 23:26:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cZVRi-0002iq-Bp for bug-gnu-emacs@gnu.org; Thu, 02 Feb 2017 23:26:07 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:56200) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cZVRi-0002ih-7l for bug-gnu-emacs@gnu.org; Thu, 02 Feb 2017 23:26:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1cZVRi-0006UX-2D for bug-gnu-emacs@gnu.org; Thu, 02 Feb 2017 23:26:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Tino Calancha Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 03 Feb 2017 04:26:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 22679 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 22679-submit@debbugs.gnu.org id=B22679.148609593924925 (code B ref 22679); Fri, 03 Feb 2017 04:26:02 +0000 Original-Received: (at 22679) by debbugs.gnu.org; 3 Feb 2017 04:25:39 +0000 Original-Received: from localhost ([127.0.0.1]:54399 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cZVRL-0006Tw-2y for submit@debbugs.gnu.org; Thu, 02 Feb 2017 23:25:39 -0500 Original-Received: from mail-pf0-f193.google.com ([209.85.192.193]:33155) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cZVRK-0006Tj-0e for 22679@debbugs.gnu.org; Thu, 02 Feb 2017 23:25:38 -0500 Original-Received: by mail-pf0-f193.google.com with SMTP id e4so677041pfg.0 for <22679@debbugs.gnu.org>; Thu, 02 Feb 2017 20:25:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=7q7Yn82sIDo92LNw8Tip7FykSA+/pdg8bhgbzVSexgU=; b=G2tTvNY/gtBUdKBZDShpW4GuEAdHzh66MWUEYG916OlWJDslF1OYDDVt4+ZZl/kX4w SkbX29yDxXCryZb+cMeG18n6Y0bDB2gckwyarbWyBDC5wMGsFtu101xaoBRhcS0avOPu Hi6u+TJp4NVXiJplWp4ZMjL4ZYjqvK1nL4VvMCMF+y0xrCjIdKtowm0c490pLj9HmnbS HJ30wPEMoUOtOgMAiYb7cZ9VvG4BB7gCJ6qkgJLlR7sSne+janHt5bFdReGtr8lRFFi5 Mf5dN+3CFQInMOFuFAlEhGb1zx+gZB0+zjL1b5GC0VeAk+wL+pLFhBYTht7p7g8JeafI SZTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=7q7Yn82sIDo92LNw8Tip7FykSA+/pdg8bhgbzVSexgU=; b=t62l9Y5ipf0X50N4vtUfSBUvEug0ib9RiPRk3tJERwaVoXSrWfKFcDpBWVGqgM371i ple9bO+OIb/i93hp2tj3aUB6YRtoNVZ16KI/rWKKBu1VIU0H1xuCS6YliQ/CQGrElCvl r3pg9bV3Lq4TdOoXX+0zQ5k2hHhM2osVvuYKdKro5FuzgPP11CfNHWtT/MaMl0Maddup mxkYJQb/x7eel9K9ZgXTmiZjKFEGt5wzHxbozUF99N4Z0nZU97uPPqw8jFGFV4y1IO2h WdSijzv6gdddfOEaQBti1CxEzpLgxWP4kWYAMOjSTU63k8PKQRh+VM2qOQrDBCDNfa9q /6Qg== X-Gm-Message-State: AIkVDXKxhgA+nk2e3+OheZ48ZUG6gh/UJ5TjpVcGo1lUoiPywMN18OTu+tQDHYUyiCHklg== X-Received: by 10.98.8.11 with SMTP id c11mr15384884pfd.135.1486095931804; Thu, 02 Feb 2017 20:25:31 -0800 (PST) Original-Received: from calancha-pc (104.81.147.124.dy.bbexcite.jp. [124.147.81.104]) by smtp.gmail.com with ESMTPSA id k78sm62293064pfb.93.2017.02.02.20.25.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 02 Feb 2017 20:25:31 -0800 (PST) In-Reply-To: <87o9ytuig7.fsf@calancha-pc> (Tino Calancha's message of "Fri, 27 Jan 2017 15:26:32 +0900") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 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.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:128905 Archived-At: Tino Calancha writes: >> Doesn't look simple enough, tho: you dropped the shell-quote-argument. > OK, i will use it. > The following patch is divided in two parts. > 1) First one fix this bug: avoid truncation of the output, i.e., the > output from all processed buffers is kept. > > 2) Erase *Shell Command Output* before `ibuffer-do-shell-command-pipe', > `ibuffer-do-shell-command-pipe-replace' and > `ibuffer-do-shell-command-file' > if shell-command-dont-erase-buffer is nil. I have updated 2): BEFORE form must be executed once, right before the operation; previous patch run it inside the loop. Following is the updated patch. I'd like to push it into master branch in a few days if there is no objections. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; >From f01155c426e83fd69ec0b9ecdd697bc973b78197 Mon Sep 17 00:00:00 2001 From: Tino Calancha Date: Fri, 3 Feb 2017 12:37:25 +0900 Subject: [PATCH 1/2] Ibuffer: Don't truncate shell command output * lisp/ibuf-ext.el (ibuffer-do-shell-command-pipe) (ibuffer-do-shell-command-pipe-replace) Use 'call-shell-region' (Bug#22679). (ibuffer-do-shell-command-file): Use call-process-shell-command. If FILE, the file that the buffer object is visiting, exists and the buffer is up-to-date, then use FILE instead of creating a temporary file (Bug#22679). --- lisp/ibuf-ext.el | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el index 058eaecb36..00cbf051d2 100644 --- a/lisp/ibuf-ext.el +++ b/lisp/ibuf-ext.el @@ -512,8 +512,10 @@ shell-command-pipe (:interactive "sPipe to shell command: " :opstring "Shell command executed on" :modifier-p nil) - (shell-command-on-region - (point-min) (point-max) command)) + (let ((out-buf (get-buffer-create "*Shell Command Output*"))) + (with-current-buffer out-buf (goto-char (point-max))) + (call-shell-region (point-min) (point-max) + command nil out-buf))) ;;;###autoload (autoload 'ibuffer-do-shell-command-pipe-replace "ibuf-ext") (define-ibuffer-op shell-command-pipe-replace (command) @@ -523,9 +525,8 @@ shell-command-pipe-replace :active-opstring "replace buffer contents in" :dangerous t :modifier-p t) - (with-current-buffer buf - (shell-command-on-region (point-min) (point-max) - command nil t))) + (call-shell-region (point-min) (point-max) + command 'delete buf)) ;;;###autoload (autoload 'ibuffer-do-shell-command-file "ibuf-ext") (define-ibuffer-op shell-command-file (command) @@ -533,16 +534,23 @@ shell-command-file (:interactive "sShell command on buffer's file: " :opstring "Shell command executed on" :modifier-p nil) - (shell-command (concat command " " - (shell-quote-argument - (or buffer-file-name - (let ((file - (make-temp-file - (substring - (buffer-name) 0 - (min 10 (length (buffer-name))))))) - (write-region nil nil file nil 0) - file)))))) + (let ((file (and (not (buffer-modified-p)) + buffer-file-name)) + (out-buf (get-buffer-create "*Shell Command Output*"))) + (unless (and file (file-exists-p file)) + (setq file + (make-temp-file + (substring + (buffer-name) 0 + (min 10 (length (buffer-name)))))) + (write-region nil nil file nil 0)) + (with-current-buffer out-buf (goto-char (point-max))) + (call-process-shell-command + (format "%s %s" + command + (shell-quote-argument file)) + nil out-buf nil))) + ;;;###autoload (autoload 'ibuffer-do-eval "ibuf-ext") (define-ibuffer-op eval (form) -- 2.11.0 >From 196c1dc5984c3b0f6842201ef86bc34b71d4a440 Mon Sep 17 00:00:00 2001 From: Tino Calancha Date: Fri, 3 Feb 2017 13:10:08 +0900 Subject: [PATCH 2/2] Ibuffer: Erase output buffer before shell commands * lisp/ibuf-macs.el (define-ibuffer-op): Add keyword arguments BEFORE and AFTER; they are forms to run before/after the operation. * lisp/ibuf-ext.el (ibuffer--maybe-erase-shell-cmd-output): New defun; if shell-command-dont-erase-buffer is nil, then erase shell command output buffer. (ibuffer-do-shell-command-pipe, ibuffer-do-shell-command-file): Use it. --- lisp/ibuf-ext.el | 10 +++++++++- lisp/ibuf-macs.el | 10 ++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el index 00cbf051d2..2a68f777d9 100644 --- a/lisp/ibuf-ext.el +++ b/lisp/ibuf-ext.el @@ -506,11 +506,19 @@ ibuffer-backward-filter-group (ibuffer-backward-filter-group 1)) (ibuffer-forward-line 0)) +(defun ibuffer--maybe-erase-shell-cmd-output () + (let ((buf (get-buffer "*Shell Command Output*"))) + (when (and (buffer-live-p buf) + (not shell-command-dont-erase-buffer) + (not (zerop (buffer-size buf)))) + (with-current-buffer buf (erase-buffer))))) + ;;;###autoload (autoload 'ibuffer-do-shell-command-pipe "ibuf-ext") (define-ibuffer-op shell-command-pipe (command) "Pipe the contents of each marked buffer to shell command COMMAND." (:interactive "sPipe to shell command: " :opstring "Shell command executed on" + :before (ibuffer--maybe-erase-shell-cmd-output) :modifier-p nil) (let ((out-buf (get-buffer-create "*Shell Command Output*"))) (with-current-buffer out-buf (goto-char (point-max))) @@ -533,6 +541,7 @@ shell-command-file "Run shell command COMMAND separately on files of marked buffers." (:interactive "sShell command on buffer's file: " :opstring "Shell command executed on" + :before (ibuffer--maybe-erase-shell-cmd-output) :modifier-p nil) (let ((file (and (not (buffer-modified-p)) buffer-file-name)) @@ -551,7 +560,6 @@ shell-command-file (shell-quote-argument file)) nil out-buf nil))) - ;;;###autoload (autoload 'ibuffer-do-eval "ibuf-ext") (define-ibuffer-op eval (form) "Evaluate FORM in each of the buffers. diff --git a/lisp/ibuf-macs.el b/lisp/ibuf-macs.el index 05e568efeb..8457599899 100644 --- a/lisp/ibuf-macs.el +++ b/lisp/ibuf-macs.el @@ -169,6 +169,8 @@ ibuffer-save-marks dangerous (opstring "operated on") (active-opstring "Operate on") + before + after complex) &rest body) "Generate a function which operates on a buffer. @@ -198,6 +200,8 @@ ibuffer-save-marks ACTIVE-OPSTRING is a string which will be displayed to the user in a confirmation message, in the form: \"Really ACTIVE-OPSTRING x buffers?\" +BEFORE is a form to evaluate before start the operation. +AFTER is a form to evaluate once the operation is complete. COMPLEX means this function is special; if COMPLEX is nil BODY evaluates once for each marked buffer, MBUF, with MBUF current and saving the point. If COMPLEX is non-nil, BODY evaluates @@ -206,7 +210,7 @@ ibuffer-save-marks marked buffer. BODY is evaluated with `buf' bound to the buffer object. -\(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING COMPLEX) &rest BODY)" +\(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" (declare (indent 2) (doc-string 3)) `(progn (defun ,(intern (concat (if (string-match "^ibuffer-do" (symbol-name op)) @@ -238,6 +242,7 @@ ibuffer-save-marks (if (eq modifier-p t) '((setq ibuffer-did-modification t)) ()) + (and after `(,after)) ; post-operation form. `((ibuffer-redisplay t) (message ,(concat "Operation finished; " opstring " %s buffers") count)))) (inner-body (if complex @@ -247,7 +252,8 @@ ibuffer-save-marks (save-excursion ,@body)) t))) - (body `(let ((count + (body `(let ((_before ,before) ; pre-operation form. + (count (,(pcase mark (:deletion 'ibuffer-map-deletion-lines) -- 2.11.0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; In GNU Emacs 26.0.50.1 (x86_64-pc-linux-gnu, GTK+ Version 3.22.6) of 2017-02-02 Repository revision: ce88155d83ba84e84321ed69a39c82f40117dd1f