Mercurial > hg > xemacs-beta
changeset 2356:0b060ef35789
[xemacs-hg @ 2004-10-28 11:31:09 by stephent]
fix and tests for call-process-region bug
<87fz3z2ic0.fsf_-_@tleepslib.sk.tsukuba.ac.jp>
author | stephent |
---|---|
date | Thu, 28 Oct 2004 11:31:23 +0000 |
parents | 61aaa5e258b0 |
children | 857dddec7da0 |
files | lisp/ChangeLog lisp/code-process.el tests/ChangeLog tests/automated/os-tests.el |
diffstat | 4 files changed, 125 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Thu Oct 28 10:51:17 2004 +0000 +++ b/lisp/ChangeLog Thu Oct 28 11:31:23 2004 +0000 @@ -1,3 +1,8 @@ +2004-10-28 Stephen J. Turnbull <stephen@xemacs.org> + + * code-process.el (call-process-region): Fix region deletion bug. + Report by Katsumi Yamaoka <b9yvfcyuscf.fsf@jpl.org>. + 2004-10-22 Stephen J. Turnbull <stephen@xemacs.org> * XEmacs 21.5.18 "chestnut" is released.
--- a/lisp/code-process.el Thu Oct 28 10:51:17 2004 +0000 +++ b/lisp/code-process.el Thu Oct 28 11:31:23 2004 +0000 @@ -165,27 +165,27 @@ The read/write coding systems used for process I/O on the process are the same as for `call-process'." - ;; We used to delete the text before calling call-process; that was when - ;; a temporary file was used to pass the text to call-process. Now that - ;; we don't do that, we delete the text afterward; if it's being inserted - ;; in the same buffer, make sure we track the insertion, and don't get - ;; any of it in the deleted region. We keep marker s before the - ;; insertion and e afterward. Finally we delete the regions before - ;; and after the insertion. - (let ((s (and deletep (copy-marker (point)))) - (e (and deletep (copy-marker (point) t)))) - (let ((retval - (apply #'call-process program (list (current-buffer) start end) - buffer displayp args))) - ;; If start and end were the same originally, e will be beyond s now - (when (and deletep (> e s)) - ;; APA: Is it always correct to honor narrowing, which affects - ;; (point-min) and (point-max)? - ;; Delete region before insertion. - (delete-region (point-min) s) - ;; Delete region after insertion. - (delete-region e (point-max))) - retval))) + + ;; We can't delete the region before feeding it to `call-process', so we + ;; take care not to delete the insertion when we delete the region. START + ;; and END may not be markers; copy them. (point) will end up after the + ;; insertion. A copy of (point) tracks the beginning of the insertion. + + (let ((s (and deletep (copy-marker start))) ; Only YOU can + (e (and deletep (copy-marker end t))) ; prevent + (p (and deletep (copy-marker (point)))) ; excess consing! + (retval + (apply #'call-process program (list (current-buffer) start end) + buffer displayp args))) + (when deletep + (if (<= s p e) + ;; region was split by insertion + ;; the order checks are gilt lilies + (progn (when (< (point) e) (delete-region (point) e)) + (when (< s p) (delete-region s p))) + ;; insertion was outside of region + (delete-region s e))) + retval)) (defun start-process (name buffer program &rest program-args) "Start a program in a subprocess. Return the process object for it.
--- a/tests/ChangeLog Thu Oct 28 10:51:17 2004 +0000 +++ b/tests/ChangeLog Thu Oct 28 11:31:23 2004 +0000 @@ -1,11 +1,17 @@ +2004-10-28 Stephen J. Turnbull <stephen@xemacs.org> + + * automated/os-tests.el: New file. Add tests for bug reported by + Katsumi Yamaoka 2004-10-26 <b9yvfcyuscf.fsf@jpl.org>. Test + suggested by Katsumi Yamaoka <b9yoeipvwn0.fsf@jpl.org>. + 2004-10-22 Stephen J. Turnbull <stephen@xemacs.org> * XEmacs 21.5.18 "chestnut" is released. 2004-10-07 Stephen J. Turnbull <stephen@xemacs.org> - * automated/regexp-tests.el: Add tests for bug identified by - Steve Youngs 2004-09-30 <microsoft-free.87ekkjhj7t.fsf@youngs.au.com> + * automated/regexp-tests.el: Add tests for bug identified by Steve + Youngs 2004-09-30 <microsoft-free.87ekkjhj7t.fsf@youngs.au.com>. 2004-09-08 Stephen J. Turnbull <stephen@xemacs.org>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/automated/os-tests.el Thu Oct 28 11:31:23 2004 +0000 @@ -0,0 +1,91 @@ +;;; os-tests.el --- test support for OS interaction + +;; Copyright (C) 2004 Free Software Foundation + +;; Author: Stephen J. Turnbull <stephen@xemacs.org> +;; Maintainer: Stephen J. Turnbull <stephen@xemacs.org> +;; Created: 2004 October 28 +;; Keywords: tests, process support + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: Not in FSF. + +;;; Commentary: + +;; Test OS support. Processes, environment variables, etc. +;; See test-harness.el for instructions on how to run these tests. + +;; call-process-region bug reported by Katsumi Yamaoka on 2004-10-26 +;; in <b9yvfcyuscf.fsf@jpl.org>, who suggested the basic test scheme +;; in <b9yoeipvwn0.fsf@jpl.org>. + +;; tac works by lines, unfortunately +(let* ((original-string "a\nb\nc\nd\n") + (tac-cases (if (executable-find "tac") + '((1 . "c\nb\na\nd\n") + (3 . "a\nc\nb\nd\n") + (5 . "a\nc\nb\nd\n") + (7 . "a\nc\nb\nd\n") + (9 . "a\nd\nc\nb\n")) + nil)) + (cat-cases (if (executable-find "cat") + '((1 . "b\nc\na\nd\n") + (3 . "a\nb\nc\nd\n") + (5 . "a\nb\nc\nd\n") + (7 . "a\nb\nc\nd\n") + (9 . "a\nd\nb\nc\n")) + nil)) + cases case) + (with-temp-buffer + (Skip-Test-Unless tac-cases + "tac executable not found" + "Tests of call-process-region with region deleted after inserting +tac process output." + (setq cases tac-cases) + (while cases + (setq case (car cases) + cases (cdr cases)) + (flet ((do-test (pos result) + (erase-buffer) + (insert original-string) + (goto-char pos) + (call-process-region 3 7 "tac" t t) + (goto-char (point-min)) + (Assert (looking-at result)))) + (do-test (car case) (cdr case))))) + ;; if you're in that much of a hurry you can blow cat off + ;; if you've done tac, but I'm not going to bother + (Skip-Test-Unless cat-cases + "cat executable not found" + "Tests of call-process-region with region deleted after inserting +cat process output." + (setq cases cat-cases) + (while cases + (setq case (car cases) + cases (cdr cases)) + (flet ((do-test (pos result) + (erase-buffer) + (insert original-string) + (goto-char pos) + (call-process-region 3 7 "cat" t t) + (goto-char (point-min)) + (Assert (looking-at result)))) + (do-test (car case) (cdr case))))))) + +;;; end of os-tests.el