diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index ee21b7d42..3b9e6ff91 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -41,28 +41,37 @@ ;; -;; Commands +;;; Auto-revert -(defun +magit--refresh-vc-in-buffer (buffer) +(defvar-local +magit--stale-p nil) + +(defun +magit--revert-buffer (buffer) (with-current-buffer buffer - (when (and vc-mode (fboundp 'vc-refresh-state)) - (vc-refresh-state)) - (when (and (bound-and-true-p git-gutter-mode) - (fboundp '+version-control|update-git-gutter)) - (+version-control|update-git-gutter)) - (setq +magit--vc-is-stale-p nil))) + (setq +magit--stale-p nil) + (revert-buffer t (not (buffer-modified-p))))) ;;;###autoload -(defvar-local +magit--vc-is-stale-p nil) +(defun +magit-mark-stale-buffers-h () + "Revert all visible buffers and mark buried buffers as stale. + +Stale buffers are reverted when they are switched to, assuming they haven't been +modified." + (dolist (buffer (buffer-list)) + (when (buffer-live-p buffer) + (if (get-buffer-window buffer) + (+magit--revert-buffer buffer) + (with-current-buffer buffer + (setq +magit--stale-p t)))))) ;;;###autoload -(defun +magit-refresh-vc-state-maybe-h () +(defun +magit-revert-buffer-maybe-h () "Update `vc' and `git-gutter' if out of date." - (when +magit--vc-is-stale-p - (+magit--refresh-vc-in-buffer (current-buffer)))) + (when +magit--stale-p + (+magit--revert-buffer (current-buffer)))) -;;;###autoload -(add-hook 'doom-switch-buffer-hook #'+magit-refresh-vc-state-maybe-h) + +;; +;;; Commands ;;;###autoload (defun +magit/quit (&optional kill-buffer) @@ -76,12 +85,7 @@ control in buffers." (eq major-mode 'magit-status-mode))) (window-list))) (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) - (dolist (buffer (buffer-list)) - (when (buffer-live-p buffer) - (if (get-buffer-window buffer) - (+magit--refresh-vc-in-buffer buffer) - (with-current-buffer buffer - (setq +magit--vc-is-stale-p t))))))) + (+magit-mark-stale-buffers-h))) (defun +magit--kill-buffer (buf) "TODO" diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 65d19abed..8205a4aa3 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -7,7 +7,7 @@ :commands magit-file-delete :defer-incrementally (dash f s with-editor git-commit package eieio lv transient) :init - (setq magit-auto-revert-mode nil) ; we do this ourselves + (setq magit-auto-revert-mode nil) ; we do this ourselves further down ;; Must be set early to prevent ~/.emacs.d/transient from being created (setq transient-levels-file (concat doom-etc-dir "transient/levels") transient-values-file (concat doom-etc-dir "transient/values") @@ -21,10 +21,16 @@ ;; formatters. Trust us to know what we're doing. magit-save-repository-buffers nil) - (defadvice! +magit-invalidate-projectile-cache-a (&rest _args) - ;; We ignore the args to `magit-checkout'. + (defadvice! +magit-revert-repo-buffers-deferred-a (&rest _) :after '(magit-checkout magit-branch-and-checkout) - (projectile-invalidate-cache nil)) + ;; Since the project likely now contains new files, best we undo the + ;; projectile cache so it can be regenerated later. + (projectile-invalidate-cache nil) + ;; Use a more efficient strategy to auto-revert buffers whose git state has + ;; changed: refresh the visible buffers immediately... + (+magit-mark-stale-buffers-h)) + ;; ...then refresh the rest only when we switch to them, not all at once. + (add-hook 'doom-switch-buffer-hook #'+magit-revert-buffer-maybe-h) ;; The default location for git-credential-cache is in ;; ~/.cache/git/credential. However, if ~/.git-credential-cache/ exists, then @@ -63,7 +69,8 @@ (and (derived-mode-p 'magit-mode) (not (eq major-mode 'magit-process-mode)))))) - ;; properly kill leftover magit buffers on quit + ;; Clean up after magit by killing leftover magit buffers and reverting + ;; affected buffers (or at least marking them as need-to-be-reverted). (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) ;; Close transient with ESC