From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: diff mode weirdness Date: Fri, 12 Sep 2008 21:53:59 -0400 Message-ID: References: <4my71xt92o.fsf@gmail.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1221270858 15353 80.91.229.12 (13 Sep 2008 01:54:18 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 13 Sep 2008 01:54:18 +0000 (UTC) Cc: emacs-devel@gnu.org To: Peter Lee Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Sep 13 03:55:14 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KeKLx-0000PY-NW for ged-emacs-devel@m.gmane.org; Sat, 13 Sep 2008 03:55:14 +0200 Original-Received: from localhost ([127.0.0.1]:44256 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KeKKx-0001kk-6N for ged-emacs-devel@m.gmane.org; Fri, 12 Sep 2008 21:54:11 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KeKKt-0001kf-Dx for emacs-devel@gnu.org; Fri, 12 Sep 2008 21:54:07 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KeKKq-0001kK-LZ for emacs-devel@gnu.org; Fri, 12 Sep 2008 21:54:06 -0400 Original-Received: from [199.232.76.173] (port=47204 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KeKKq-0001k0-Fm for emacs-devel@gnu.org; Fri, 12 Sep 2008 21:54:04 -0400 Original-Received: from ironport2-out.pppoe.ca ([206.248.154.182]:61386 helo=ironport2-out.teksavvy.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KeKKq-000375-8V for emacs-devel@gnu.org; Fri, 12 Sep 2008 21:54:04 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsoEAKC6ykhFxIqP/2dsb2JhbACBY7QvgWSBBg X-IronPort-AV: E=Sophos;i="4.32,392,1217822400"; d="scan'208";a="26758004" Original-Received: from 69-196-138-143.dsl.teksavvy.com (HELO ceviche.home) ([69.196.138.143]) by ironport2-out.teksavvy.com with ESMTP; 12 Sep 2008 21:53:59 -0400 Original-Received: by ceviche.home (Postfix, from userid 20848) id 98259B40CD; Fri, 12 Sep 2008 21:53:59 -0400 (EDT) In-Reply-To: <4my71xt92o.fsf@gmail.com> (Peter Lee's message of "Fri, 12 Sep 2008 15:15:11 -0500") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux) X-detected-kernel: by monty-python.gnu.org: Genre and OS details not recognized. X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:103863 Archived-At: > copy between the snips and save as /tmp/test.diff > Then open the file... > The modeline will continuously prompt for: > Use file Version: /tmp/test Does the patch below fix the problem for you? Stefan --- diff-mode.el.~1.150.~ 2008-08-13 17:49:14.000000000 -0400 +++ diff-mode.el 2008-09-12 21:52:53.000000000 -0400 @@ -723,7 +723,7 @@ (fs (diff-hunk-file-names current-prefix-arg))) (unless fs (error "No file name to look for")) (list old (read-file-name (format "File for %s: " (car fs)) - nil (diff-find-file-name old) t)))) + nil (diff-find-file-name old 'noprompt) t)))) (let ((fs (diff-hunk-file-names old))) (unless fs (error "No file name to look for")) (push (cons fs name) diff-remembered-files-alist))) @@ -756,11 +756,10 @@ (list (if old (match-string 2) (match-string 4)) (if old (match-string 4) (match-string 2))))))))) -(defun diff-find-file-name (&optional old batch prefix) +(defun diff-find-file-name (&optional old noprompt prefix) "Return the file corresponding to the current patch. Non-nil OLD means that we want the old file. -Non-nil BATCH means to prefer returning an incorrect answer than to prompt -the user. +Non-nil NOPROMPT means to prefer returning nil than to prompt the user. PREFIX is only used internally: don't use it." (unless (equal diff-remembered-defdir default-directory) ;; Flush diff-remembered-files-alist if the default-directory is changed. @@ -801,16 +800,15 @@ (boundp 'cvs-pcl-cvs-dirchange-re) (save-excursion (re-search-backward cvs-pcl-cvs-dirchange-re nil t)) - (diff-find-file-name old batch (match-string 1))) - ;; Invent something, if necessary. - (when batch - (or (car fs) default-directory)) + (diff-find-file-name old noprompt (match-string 1))) ;; if all else fails, ask the user - (let ((file (read-file-name (format "Use file %s: " (or (first fs) "")) + (unless noprompt + (let ((file (read-file-name (format "Use file %s: " + (or (first fs) "")) nil (first fs) t (first fs)))) (set (make-local-variable 'diff-remembered-files-alist) (cons (cons fs file) diff-remembered-files-alist)) - file))))) + file)))))) (defun diff-ediff-patch () @@ -1286,7 +1284,7 @@ (set (make-local-variable 'add-log-current-defun-function) 'diff-current-defun) (set (make-local-variable 'add-log-buffer-file-name-function) - 'diff-find-file-name)) + (lambda () (diff-find-file-name nil 'noprompt)))) ;;;###autoload (define-minor-mode diff-minor-mode @@ -1547,7 +1545,7 @@ (defsubst diff-xor (a b) (if a (if (not b) a) b)) -(defun diff-find-source-location (&optional other-file reverse) +(defun diff-find-source-location (&optional other-file reverse noprompt) "Find out (BUF LINE-OFFSET POS SRC DST SWITCHED). BUF is the buffer corresponding to the source file. LINE-OFFSET is the offset between the expected and actual positions @@ -1555,7 +1553,8 @@ POS is a pair (BEG . END) indicating the position of the text in the buffer. SRC and DST are the two variants of text as returned by `diff-hunk-text'. SRC is the variant that was found in the buffer. -SWITCHED is non-nil if the patch is already applied." +SWITCHED is non-nil if the patch is already applied. +NOPROMPT, if non-nil, means not to prompt the user." (save-excursion (let* ((other (diff-xor other-file diff-jump-to-old-file)) (char-offset (- (point) (progn (diff-beginning-of-hunk 'try-harder) @@ -1565,8 +1564,8 @@ ;; (e.g. because an empty line truncates the hunk mid-course), ;; leading to potentially nasty surprises for the user. (_ (diff-sanity-check-hunk)) - (hunk (buffer-substring (point) - (save-excursion (diff-end-of-hunk) (point)))) + (hunk (buffer-substring + (point) (save-excursion (diff-end-of-hunk) (point)))) (old (diff-hunk-text hunk reverse char-offset)) (new (diff-hunk-text hunk (not reverse) char-offset)) ;; Find the location specification. @@ -1578,7 +1577,8 @@ diff-context-mid-hunk-header-re nil t) (error "Can't find the hunk separator")) (match-string 1))))) - (file (or (diff-find-file-name other) (error "Can't find the file"))) + (file (or (diff-find-file-name other noprompt) + (error "Can't find the file"))) (buf (find-file-noselect file))) ;; Update the user preference if he so wished. (when (> (prefix-numeric-value other-file) 8) @@ -1718,14 +1718,18 @@ (when (looking-at diff-hunk-header-re) (forward-line 1) (re-search-forward "^[^ ]" nil t)) - (destructuring-bind (buf line-offset pos src dst &optional switched) - (diff-find-source-location) + (destructuring-bind (&optional buf line-offset pos src dst switched) + ;; Use `noprompt' since this is used in which-func-mode and such. + (ignore-errors ;Signals errors in place of prompting. + (diff-find-source-location nil nil 'noprompt)) + (when buf (beginning-of-line) (or (when (memq (char-after) '(?< ?-)) ;; Cursor is pointing at removed text. This could be a removed ;; function, in which case, going to the source buffer will ;; not help since the function is now removed. Instead, - ;; try to figure out the function name just from the code-fragment. + ;; try to figure out the function name just from the + ;; code-fragment. (let ((old (if switched dst src))) (with-temp-buffer (insert (car old)) @@ -1734,7 +1738,7 @@ (add-log-current-defun)))) (with-current-buffer buf (goto-char (+ (car pos) (cdr src))) - (add-log-current-defun)))))) + (add-log-current-defun))))))) (defun diff-ignore-whitespace-hunk () "Re-diff the current hunk, ignoring whitespace differences."