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)))