From: Gustav HÃ¥llberg Date: Sun, 25 Apr 2010 21:18:20 +0000 (+0200) Subject: stgit.el: Delay automatic refresh of stgit buffers a bit X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/commitdiff_plain/455c9f7e04b11bce7065a8e49aadee16d943719a stgit.el: Delay automatic refresh of stgit buffers a bit This prevents multiple consecutive refreshes when several refresh-causing operations are done after each other, which happens when one does recursive deletes. Signed-off-by: Gustav HÃ¥llberg --- diff --git a/contrib/stgit.el b/contrib/stgit.el index 7f5226b..41b457c 100644 --- a/contrib/stgit.el +++ b/contrib/stgit.el @@ -1305,11 +1305,47 @@ refresh the stgit buffers as the git status of files change." (git git-add-file git-checkout git-revert-file git-remove-file) (dired dired-delete-file)))) +(defvar stgit-pending-refresh-buffers nil + "Alist of (cons `buffer' `refresh-index') of buffers that need +to be refreshed. `refresh-index' is non-nil if both work tree +and index need to be refreshed.") + +(defun stgit-run-pending-refreshs () + "Run all pending stgit buffer updates as posted by `stgit-post-refresh'." + (let ((buffers stgit-pending-refresh-buffers) + (stgit-inhibit-messages t)) + (setq stgit-pending-refresh-buffers nil) + (while buffers + (let* ((elem (car buffers)) + (buffer (car elem)) + (refresh-index (cdr elem))) + (when (buffer-name buffer) + (with-current-buffer buffer + (stgit-refresh-worktree) + (when refresh-index (stgit-refresh-index))))) + (setq buffers (cdr buffers))))) + +(defun stgit-post-refresh (buffer refresh-index) + "Update worktree status in BUFFER when Emacs becomes idle. If +REFRESH-INDEX is non-nil, also update the index." + (unless stgit-pending-refresh-buffers + (run-with-idle-timer 0.1 nil 'stgit-run-pending-refreshs)) + (let ((elem (assq buffer stgit-pending-refresh-buffers))) + (if elem + ;; if buffer is already present, set its refresh-index flag if + ;; necessary + (when refresh-index + (setcdr elem t)) + ;; new entry + (setq stgit-pending-refresh-buffers + (cons (cons buffer refresh-index) + stgit-pending-refresh-buffers))))) + (defun stgit-update-stgit-for-buffer (&optional refresh-index) - "Refresh worktree status in any `stgit-mode' buffer that shows -the status of the current buffer. + "When Emacs becomes idle, refresh worktree status in any +`stgit-mode' buffer that shows the status of the current buffer. -If REFRESH-INDEX is not-nil, also update the index." +If REFRESH-INDEX is non-nil, also update the index." (let* ((dir (cond ((derived-mode-p 'stgit-status-mode 'dired-mode) default-directory) (buffer-file-name @@ -1319,9 +1355,7 @@ If REFRESH-INDEX is not-nil, also update the index." (error nil)))) (buffer (and gitdir (stgit-find-buffer gitdir)))) (when buffer - (with-current-buffer buffer - (stgit-refresh-worktree) - (when refresh-index (stgit-refresh-index)))))) + (stgit-post-refresh buffer refresh-index)))) (defun stgit-add-mark (patchsym) "Mark the patch PATCHSYM."