aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Hållberg <gustav@gmail.com>2010-04-25 23:18:20 +0200
committerGustav Hållberg <gustav@gmail.com>2010-04-30 00:22:20 +0200
commit455c9f7e04b11bce7065a8e49aadee16d943719a (patch)
tree4ea65bdcd6bb077bf3c8d98b2934fc6ff544c552
parente9a9f3fa7941edc80d356055f7b8d6f5f711c209 (diff)
downloadstgit-455c9f7e04b11bce7065a8e49aadee16d943719a.tar.gz
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 <gustav@gmail.com>
-rw-r--r--contrib/stgit.el46
1 files changed, 40 insertions, 6 deletions
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."