emacs-elpa-diffs
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]