branch: elpa/magit
commit d6a9ff74e49e433bcd34562f8a55ef871043905f
Author: Jonas Bernoulli <[email protected]>
Commit: Jonas Bernoulli <[email protected]>

    magit--get-blob-buffer: New function
---
 lisp/magit-base.el  | 10 ++++++++++
 lisp/magit-diff.el  |  2 +-
 lisp/magit-ediff.el |  3 +++
 lisp/magit-files.el | 32 ++++++++++++++++++++++++--------
 4 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/lisp/magit-base.el b/lisp/magit-base.el
index 781e1d1fa0..b61908b839 100644
--- a/lisp/magit-base.el
+++ b/lisp/magit-base.el
@@ -1187,6 +1187,16 @@ Like `message', except that `message-log-max' is bound 
to nil."
       (push char quoted))
     (concat (nreverse quoted))))
 
+(defun magit--find-buffer (&rest plist)
+  "Like `find-buffer' but take multiple VARIABLE-VALUE pairs."
+  (seq-find (lambda (buf)
+              (while (and plist
+                          (equal (buffer-local-value (car plist) buf)
+                                 (cadr plist)))
+                (setq plist (cddr plist)))
+              (not plist))
+            (buffer-list)))
+
 ;;; _
 (provide 'magit-base)
 ;; Local Variables:
diff --git a/lisp/magit-diff.el b/lisp/magit-diff.el
index 543cd6240c..51e3042de3 100644
--- a/lisp/magit-diff.el
+++ b/lisp/magit-diff.el
@@ -41,7 +41,7 @@
 (declare-function magit-stash-show "magit-stash" (stash &optional args files))
 ;; For `magit-diff-visit-file'
 (declare-function magit-find-file-noselect "magit-files"
-                  (rev file &optional no-restore-position))
+                  (rev file &optional no-restore-position volatile))
 (declare-function magit-status-setup-buffer "magit-status" (&optional 
directory))
 ;; For `magit-diff-wash-diff'
 (defvar magit-log-heading-re)
diff --git a/lisp/magit-ediff.el b/lisp/magit-ediff.el
index 8259d960aa..b4d4bd41ca 100644
--- a/lisp/magit-ediff.el
+++ b/lisp/magit-ediff.el
@@ -570,6 +570,9 @@ stash that were staged."
           (magit-ediff--find-file    revC fileC)))
       (magit-ediff-compare revA revC fileA fileC))))
 
+(defun magit-get-revision-buffer (rev file)
+  (get-buffer (magit--blob-buffer-name rev file)))
+
 (defun magit-ediff--find-file (rev file)
   (magit-find-file-noselect rev file t))
 
diff --git a/lisp/magit-files.el b/lisp/magit-files.el
index 2aee729d4b..302eaca012 100644
--- a/lisp/magit-files.el
+++ b/lisp/magit-files.el
@@ -42,6 +42,8 @@
 (defvar magit-find-blob-hook nil)
 (add-hook 'magit-find-blob-hook #'magit-blob-mode)
 
+(defvar-local magit-buffer--volatile nil)
+
 ;;;###autoload
 (defun magit-find-file (rev file)
   "View FILE from REV.
@@ -84,7 +86,7 @@ the line and column corresponding to that location."
           (magit-read-file-from-rev (if (member rev pseudo-revs) "HEAD" rev)
                                     prompt))))
 
-(defun magit-find-file-noselect (rev file &optional no-restore-position)
+(defun magit-find-file-noselect (rev file &optional no-restore-position 
volatile)
   "Read FILE from REV into a buffer and return the buffer.
 REV is a revision or one of \"{worktree}\" or \"{index}\"."
   (let* ((rev (pcase rev
@@ -112,7 +114,7 @@ REV is a revision or one of \"{worktree}\" or \"{index}\"."
              (unless (file-in-directory-p file topdir)
                (error "%s is not inside Git repository %s" file topdir))
              (with-current-buffer
-                 (magit-get-revision-buffer-create rev file-relative)
+                 (magit--get-blob-buffer rev file-relative volatile)
                (setq magit-buffer-revision rev)
                (setq magit-buffer-file-name file)
                (setq default-directory
@@ -128,12 +130,26 @@ REV is a revision or one of \"{worktree}\" or 
\"{index}\"."
           (apply #'magit-find-file--restore-position pos))))
     buffer))
 
-(defun magit-get-revision-buffer-create (rev file)
-  (magit-get-revision-buffer rev file t))
-
-(defun magit-get-revision-buffer (rev file &optional create)
-  (funcall (if create #'get-buffer-create #'get-buffer)
-           (format "%s.~%s~" file (subst-char-in-string ?/ ?_ rev))))
+(defun magit--get-blob-buffer (rev file &optional volatile)
+  ;; REV is assummed to be abbreviated and FILE to be relative.
+  (cond-let
+    ([buf (magit--find-buffer 'magit-buffer-revision rev
+                              'magit-buffer-file-name file)]
+     (with-current-buffer buf
+       (when (and (not volatile) magit-buffer--volatile)
+         (setq magit-buffer--volatile nil)
+         (rename-buffer (magit--blob-buffer-name rev file))))
+     buf)
+    ([buf (get-buffer-create (magit--blob-buffer-name rev file volatile))]
+     (with-current-buffer buf
+       (setq magit-buffer--volatile volatile))
+     buf)))
+
+(defun magit--blob-buffer-name (rev file &optional volatile)
+  (format "%s%s.~%s~"
+          (if volatile " " "")
+          file
+          (subst-char-in-string ?/ ?_ rev)))
 
 (defun magit--revert-blob-buffer (_ignore-auto _noconfirm)
   (let ((pos (magit-find-file--position)))

Reply via email to