From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: charles@aurox.ch (Charles A. Roelli) Newsgroups: gmane.emacs.bugs Subject: bug#21262: 25.0.50; Diff-mode gets confused about its narrowing if hunk source not found Date: Mon, 21 Aug 2017 21:49:50 +0200 Message-ID: References: <87lhdd5e52.fsf@secretsauce.net> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: blaine.gmane.org 1503345085 12260 195.159.176.226 (21 Aug 2017 19:51:25 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 21 Aug 2017 19:51:25 +0000 (UTC) Cc: 21262@debbugs.gnu.org To: Dima Kogan Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Aug 21 21:51:19 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 1djsj8-0002FP-5w for geb-bug-gnu-emacs@m.gmane.org; Mon, 21 Aug 2017 21:51:10 +0200 Original-Received: from localhost ([::1]:48761 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1djsjD-0007ty-0S for geb-bug-gnu-emacs@m.gmane.org; Mon, 21 Aug 2017 15:51:15 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:39845) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1djsj3-0007sw-Ce for bug-gnu-emacs@gnu.org; Mon, 21 Aug 2017 15:51:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1djsj0-0004kk-P6 for bug-gnu-emacs@gnu.org; Mon, 21 Aug 2017 15:51:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:39543) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1djsj0-0004kQ-Df for bug-gnu-emacs@gnu.org; Mon, 21 Aug 2017 15:51:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1djsiz-0000kh-WB for bug-gnu-emacs@gnu.org; Mon, 21 Aug 2017 15:51:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: charles@aurox.ch (Charles A. Roelli) Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 21 Aug 2017 19:51:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 21262 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 21262-submit@debbugs.gnu.org id=B21262.15033450252847 (code B ref 21262); Mon, 21 Aug 2017 19:51:01 +0000 Original-Received: (at 21262) by debbugs.gnu.org; 21 Aug 2017 19:50:25 +0000 Original-Received: from localhost ([127.0.0.1]:48224 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1djsiO-0000jq-TJ for submit@debbugs.gnu.org; Mon, 21 Aug 2017 15:50:25 -0400 Original-Received: from sinyavsky.aurox.ch ([37.35.109.145]:39366) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1djsiM-0000jc-JN for 21262@debbugs.gnu.org; Mon, 21 Aug 2017 15:50:23 -0400 Original-Received: from sinyavsky.aurox.ch (sinyavsky.aurox.ch [127.0.0.1]) by sinyavsky.aurox.ch (Postfix) with ESMTP id B927A22506 for <21262@debbugs.gnu.org>; Mon, 21 Aug 2017 19:44:25 +0000 (UTC) Authentication-Results: sinyavsky.aurox.ch (amavisd-new); dkim=pass (1024-bit key) reason="pass (just generated, assumed good)" header.d=aurox.ch DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=aurox.ch; h= content-type:content-type:mime-version:references:subject :subject:in-reply-to:to:from:from:message-id:date:date; s=dkim; t=1503344663; x=1504208664; bh=0b7zDHHZLGpEdXv+oFaowOLHKuPMPygf cPpzxnLkJ04=; b=rW1FNNCmRtNZo9a0bYVyoGxfYUvZqU2Y+DQBqIQ3xQ3ihHLm DlHzUPmT/8m0v7RUJJe5eYY+r6Cw+7DvgF0obUWpObJ/A6TjBt+MbFdb4aDuTdhJ SD1EAx9Gi7Sl6sUG7LajIuxJsNLsa07TQy7iTfTffotJLcuEI6FoBZ0/WpI= X-Virus-Scanned: Debian amavisd-new at test.virtualizor.com Original-Received: from sinyavsky.aurox.ch ([127.0.0.1]) by sinyavsky.aurox.ch (sinyavsky.aurox.ch [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id gFYP3Y1m7BPm for <21262@debbugs.gnu.org>; Mon, 21 Aug 2017 19:44:23 +0000 (UTC) Original-Received: from gray (125.85.192.178.dynamic.wline.res.cust.swisscom.ch [178.192.85.125]) by sinyavsky.aurox.ch (Postfix) with ESMTPSA id B565B224EB; Mon, 21 Aug 2017 19:44:22 +0000 (UTC) In-reply-to: <87lhdd5e52.fsf@secretsauce.net> (message from Dima Kogan on Fri, 14 Aug 2015 22:12:09 -0700) 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:136024 Archived-At: --=-=-= Content-Type: text/plain > From: Dima Kogan > Date: Fri, 14 Aug 2015 22:12:09 -0700 > > Hi. This bug has been there since at least emacs23 it seems like. To > reproduce: > > 1. emacs -Q > > 2. Open any patch file that has hunks from more than one file in it. For > instance, the attached patch file works, but it really doesn't matter > > 3. Narrow to just the second file's diffs. For instance: M-N M-N C-SPC > C-> C-x n n SPC (last SPC to confirm the narrowing) > > 4. Try to see the source of the hunk. Move the point to the guts of the > hunk, and M-enter. Emacs asks for the directory where the sources live. > In the process, it changes the narrowing to the wrong hunk. This is > wrong. The narrowing shouldn't change. > > 5. If we cancel with C-g, the wrong narrowing persists > > > > diff --git a/src/charset.c b/src/charset.c > index b19e344..eeebf17 100644 > --- a/src/charset.c > +++ b/src/charset.c > @@ -555,7 +555,7 @@ load_charset_map_from_vector (struct charset *charset, Lisp_Object vec, int cont > > if (len % 2 == 1) > { > - add_to_log ("Failure in loading charset map: %V", vec, Qnil); > + add_to_log ("Failure in loading charset map: %V", vec); > return; > } > > diff --git a/src/image.c b/src/image.c > index 066db74..313419b 100644 > --- a/src/image.c > +++ b/src/image.c > @@ -629,16 +629,19 @@ valid_image_p (Lisp_Object object) > } > > > -/* Log error message with format string FORMAT and argument ARG. > +/* Log error message with format string FORMAT and trailing arguments. > Signaling an error, e.g. when an image cannot be loaded, is not a > good idea because this would interrupt redisplay, and the error > message display would lead to another redisplay. This function > therefore simply displays a message. */ > > static void > -image_error (const char *format, Lisp_Object arg1, Lisp_Object arg2) > +image_error (const char *format, ...) > { > - add_to_log (format, arg1, arg2); > + va_list ap; > + va_start (ap, format); > + vadd_to_log (format, ap); > + va_end (ap); > } > > This still affects 26.0.50. The attached change fixes it -- but I know nothing of diff-mode, so better ideas are welcome. Note that the buffer will be widened while Emacs asks where to look for the sources, but it will return to the original narrowing after the user has selected a file or hit C-g. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=01-emacs-bug-21262-draft.patch diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index aa8d778..b470406 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -874,52 +874,54 @@ diff-find-file-name ;; Flush diff-remembered-files-alist if the default-directory is changed. (set (make-local-variable 'diff-remembered-defdir) default-directory) (set (make-local-variable 'diff-remembered-files-alist) nil)) - (save-excursion - (unless (looking-at diff-file-header-re) - (or (ignore-errors (diff-beginning-of-file)) - (re-search-forward diff-file-header-re nil t))) - (let ((fs (diff-hunk-file-names old))) - (if prefix (setq fs (mapcar (lambda (f) (concat prefix f)) fs))) - (or - ;; use any previously used preference - (cdr (assoc fs diff-remembered-files-alist)) - ;; try to be clever and use previous choices as an inspiration - (cl-dolist (rf diff-remembered-files-alist) - (let ((newfile (diff-merge-strings (caar rf) (car fs) (cdr rf)))) - (if (and newfile (file-exists-p newfile)) (cl-return newfile)))) - ;; look for each file in turn. If none found, try again but - ;; ignoring the first level of directory, ... - (cl-do* ((files fs (delq nil (mapcar 'diff-filename-drop-dir files))) - (file nil nil)) - ((or (null files) - (setq file (cl-do* ((files files (cdr files)) - (file (car files) (car files))) - ;; Use file-regular-p to avoid - ;; /dev/null, directories, etc. - ((or (null file) (file-regular-p file)) - file)))) - file)) - ;; .rej patches implicitly apply to - (and (string-match "\\.rej\\'" (or buffer-file-name "")) - (let ((file (substring buffer-file-name 0 (match-beginning 0)))) - (when (file-exists-p file) file))) - ;; If we haven't found the file, maybe it's because we haven't paid - ;; attention to the PCL-CVS hint. - (and (not prefix) - (boundp 'cvs-pcl-cvs-dirchange-re) - (save-excursion - (re-search-backward cvs-pcl-cvs-dirchange-re nil t)) - (diff-find-file-name old noprompt (match-string 1))) - ;; if all else fails, ask the user - (unless noprompt - (let ((file (expand-file-name (or (car fs) "")))) - (setq file - (read-file-name (format "Use file %s: " file) - (file-name-directory file) file t - (file-name-nondirectory file))) - (set (make-local-variable 'diff-remembered-files-alist) - (cons (cons fs file) diff-remembered-files-alist)) - file)))))) + (save-restriction + (widen) + (save-excursion + (unless (looking-at diff-file-header-re) + (or (ignore-errors (diff-beginning-of-file)) + (re-search-forward diff-file-header-re nil t))) + (let ((fs (diff-hunk-file-names old))) + (if prefix (setq fs (mapcar (lambda (f) (concat prefix f)) fs))) + (or + ;; use any previously used preference + (cdr (assoc fs diff-remembered-files-alist)) + ;; try to be clever and use previous choices as an inspiration + (cl-dolist (rf diff-remembered-files-alist) + (let ((newfile (diff-merge-strings (caar rf) (car fs) (cdr rf)))) + (if (and newfile (file-exists-p newfile)) (cl-return newfile)))) + ;; look for each file in turn. If none found, try again but + ;; ignoring the first level of directory, ... + (cl-do* ((files fs (delq nil (mapcar 'diff-filename-drop-dir files))) + (file nil nil)) + ((or (null files) + (setq file (cl-do* ((files files (cdr files)) + (file (car files) (car files))) + ;; Use file-regular-p to avoid + ;; /dev/null, directories, etc. + ((or (null file) (file-regular-p file)) + file)))) + file)) + ;; .rej patches implicitly apply to + (and (string-match "\\.rej\\'" (or buffer-file-name "")) + (let ((file (substring buffer-file-name 0 (match-beginning 0)))) + (when (file-exists-p file) file))) + ;; If we haven't found the file, maybe it's because we haven't paid + ;; attention to the PCL-CVS hint. + (and (not prefix) + (boundp 'cvs-pcl-cvs-dirchange-re) + (save-excursion + (re-search-backward cvs-pcl-cvs-dirchange-re nil t)) + (diff-find-file-name old noprompt (match-string 1))) + ;; if all else fails, ask the user + (unless noprompt + (let ((file (expand-file-name (or (car fs) "")))) + (setq file + (read-file-name (format "Use file %s: " file) + (file-name-directory file) file t + (file-name-nondirectory file))) + (set (make-local-variable 'diff-remembered-files-alist) + (cons (cons fs file) diff-remembered-files-alist)) + file))))))) (defun diff-ediff-patch () --=-=-=--