[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/git-commit 623d335b4d 5/7: Memorize gitdir and topdir for
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/git-commit 623d335b4d 5/7: Memorize gitdir and topdir for each Magit buffer |
Date: |
Fri, 17 Mar 2023 19:59:48 -0400 (EDT) |
branch: elpa/git-commit
commit 623d335b4dddc64f205748862520ed41661a7a80
Author: Jonas Bernoulli <jonas@bernoul.li>
Commit: Jonas Bernoulli <jonas@bernoul.li>
Memorize gitdir and topdir for each Magit buffer
---
lisp/magit-extras.el | 5 ++---
lisp/magit-git.el | 42 ++++++++++++++++++++++++++++++++----------
lisp/magit-mode.el | 4 ++++
3 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/lisp/magit-extras.el b/lisp/magit-extras.el
index 8cbd0ca3f1..880ef39cdb 100644
--- a/lisp/magit-extras.el
+++ b/lisp/magit-extras.el
@@ -883,7 +883,7 @@ The buffer is displayed using `magit-display-buffer', which
see."
(switch-to-buffer-other-frame buffer))
(defun magit--read-repository-buffer (prompt)
- (if-let ((topdir (magit-rev-parse-safe "--show-toplevel")))
+ (if-let ((topdir (magit-toplevel)))
(read-buffer
prompt (magit-get-mode-buffer 'magit-status-mode) t
(pcase-lambda (`(,_ . ,buf))
@@ -896,8 +896,7 @@ The buffer is displayed using `magit-display-buffer', which
see."
(and buffer-file-name
(string-match-p git-commit-filename-regexp
buffer-file-name)))
- (equal (magit-rev-parse-safe "--show-toplevel")
- topdir))))))
+ (equal magit-buffer-topdir topdir))))))
(user-error "Not inside a Git repository")))
;;; Miscellaneous
diff --git a/lisp/magit-git.el b/lisp/magit-git.el
index be4ba75955..2ef8602635 100644
--- a/lisp/magit-git.el
+++ b/lisp/magit-git.el
@@ -41,6 +41,8 @@
(declare-function magit-get-mode-buffer "magit-mode"
(mode &optional value frame))
(declare-function magit-refresh "magit-mode" ())
+(defvar magit-buffer-gitdir)
+(defvar magit-buffer-topdir)
(defvar magit-buffer-diff-args)
(defvar magit-buffer-file-name)
(defvar magit-buffer-log-args)
@@ -821,19 +823,29 @@ Also see `magit-git-config-p'."
(defun magit-gitdir (&optional directory)
"Return the absolute and resolved path of the .git directory.
-If the `GIT_DIR' environment variable is define then return that.
+As a special-case, if the `GIT_DIR' environment variable is set,
+return its value. It is usually a bad idea to set this variable
+when using Magit.
+
+Otherwise if `magit-buffer-gitdir' is set, return that. The
+value of this buffer-local variable is set to the value returned
+by this function, when a Magit buffer is first created. So this
+effectively memorizes the value returned by this function.
+
Otherwise return the .git directory for DIRECTORY, or if that is
nil, then for `default-directory' instead. If the directory is
not located inside a Git repository, then return nil."
- (let ((default-directory (or directory default-directory)))
- (magit--with-refresh-cache (list default-directory 'magit-gitdir)
- (magit--with-safe-default-directory nil
- (and-let*
- ((dir (magit-rev-parse-safe "--git-dir"))
- (dir (file-name-as-directory (magit-expand-git-file-name dir))))
- (if (file-remote-p dir)
- dir
- (concat (file-remote-p default-directory) dir)))))))
+ (or (getenv "GIT_DIR")
+ magit-buffer-gitdir
+ (let ((default-directory (or directory default-directory)))
+ (magit--with-refresh-cache (list default-directory 'magit-gitdir)
+ (magit--with-safe-default-directory nil
+ (and-let* ((dir (magit-rev-parse-safe "--git-dir"))
+ (dir (file-name-as-directory
+ (magit-expand-git-file-name dir))))
+ (if (file-remote-p dir)
+ dir
+ (concat (file-remote-p default-directory) dir))))))))
(defvar magit--separated-gitdirs nil)
@@ -862,6 +874,10 @@ tree. As a special case, from within a bare repository
return
the control directory instead. When called outside a repository
then return nil.
+When `magit-buffer-toplevel' is non-nil, then return its value,
+unless DIRECTORY is non-nil, or `default-directory' was let-bound
+to another directory, while another buffer was current.
+
When optional DIRECTORY is non-nil then return the toplevel for
that directory instead of the one for `default-directory'.
@@ -873,6 +889,12 @@ the gitdir or from the toplevel of a gitdir, which itself
is not
located within the working tree, then it is not possible to avoid
returning the truename."
(or
+ (and magit-buffer-topdir
+ (not directory)
+ (equal (expand-file-name default-directory)
+ (expand-file-name
+ (buffer-local-value 'default-directory (current-buffer))))
+ magit-buffer-topdir)
(magit--with-refresh-cache
(cons (or directory default-directory) 'magit-toplevel)
(magit--with-safe-default-directory directory
diff --git a/lisp/magit-mode.el b/lisp/magit-mode.el
index c6ec10914c..28293c4b5f 100644
--- a/lisp/magit-mode.el
+++ b/lisp/magit-mode.el
@@ -526,6 +526,8 @@ Magit is documented in info node `(magit)'."
;;; Local Variables
+(defvar-local magit-buffer-gitdir nil)
+(defvar-local magit-buffer-topdir nil)
(defvar-local magit-buffer-arguments nil)
(defvar-local magit-buffer-diff-args nil)
(defvar-local magit-buffer-diff-files nil)
@@ -593,6 +595,8 @@ The buffer's major-mode should derive from
`magit-section-mode'."
(setq magit-previous-section section)
(funcall mode)
(magit-xref-setup #'magit-setup-buffer-internal bindings)
+ (setq magit-buffer-gitdir (magit-gitdir))
+ (setq magit-buffer-topdir (magit-toplevel))
(pcase-dolist (`(,var ,val) bindings)
(set (make-local-variable var) val))
(when created
- [nongnu] elpa/git-commit updated (eb66aed3b4 -> 564a5ceeb0), ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit e23846ec2d 1/7: magit-save-repository-buffers: Cosmetics, ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit 8606488578 2/7: magit-save-repository-buffers: Rev-parse only once per directory, ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit e94b6ebfdb 6/7: Record diff-type in magit-diff-mode buffers, ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit 564a5ceeb0 7/7: magit-git-debug: Fix key binding in docstring, ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit c5c8f79167 4/7: magit-toplevel: Cosmetics, ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit ff4710afa6 3/7: Deprecate magit-git-dir to avoid needlessly repeating work, ELPA Syncer, 2023/03/17
- [nongnu] elpa/git-commit 623d335b4d 5/7: Memorize gitdir and topdir for each Magit buffer,
ELPA Syncer <=