##// END OF EJS Templates
mercurial.el: speed up mode line updates.
Bryan O'Sullivan -
r3002:65efeb7b default
parent child Browse files
Show More
@@ -502,6 +502,43 b' directory names from the file system. W'
502 (or default "tip")))
502 (or default "tip")))
503 rev))))
503 rev))))
504
504
505 (defun hg-parents-for-mode-line (root)
506 "Format the parents of the working directory for the mode line."
507 (let ((parents (split-string (hg-chomp
508 (hg-run0 "--cwd" root "parents" "--template"
509 "{rev}\n")) "\n")))
510 (mapconcat 'identity parents "+")))
511
512 (defun hg-buffers-visiting-repo (&optional path)
513 "Return a list of buffers visiting the repository containing PATH."
514 (let ((root-name (hg-root (or path (buffer-file-name))))
515 bufs)
516 (save-excursion
517 (dolist (buf (buffer-list) bufs)
518 (set-buffer buf)
519 (let ((name (buffer-file-name)))
520 (when (and hg-status name (equal (hg-root name) root-name))
521 (setq bufs (cons buf bufs))))))))
522
523 (defun hg-update-mode-lines (path)
524 "Update the mode lines of all buffers visiting the same repository as PATH."
525 (let* ((root (hg-root path))
526 (parents (hg-parents-for-mode-line root)))
527 (save-excursion
528 (dolist (info (hg-path-status
529 root
530 (mapcar
531 (function
532 (lambda (buf)
533 (substring (buffer-file-name buf) (length root))))
534 (hg-buffers-visiting-repo root))))
535 (let* ((name (car info))
536 (status (cdr info))
537 (buf (find-buffer-visiting (concat root name))))
538 (when buf
539 (set-buffer buf)
540 (hg-mode-line-internal status parents)))))))
541
505 (defmacro hg-do-across-repo (path &rest body)
542 (defmacro hg-do-across-repo (path &rest body)
506 (let ((root-name (gensym "root-"))
543 (let ((root-name (gensym "root-"))
507 (buf-name (gensym "buf-")))
544 (buf-name (gensym "buf-")))
@@ -554,10 +591,10 b' current frame."'
554 (cdr state)
591 (cdr state)
555 'normal)))))
592 'normal)))))
556
593
557 (defun hg-status (&rest paths)
594 (defun hg-path-status (root paths)
558 "Return status of PATHS as an alist.
595 "Return status of PATHS in repo ROOT as an alist.
559 Each entry is a pair (FILE-NAME . STATUS)."
596 Each entry is a pair (FILE-NAME . STATUS)."
560 (let ((s (apply 'hg-run "status" "-marduc" paths))
597 (let ((s (apply 'hg-run "--cwd" root "status" "-marduc" paths))
561 result)
598 result)
562 (dolist (entry (split-string (hg-chomp (cdr s)) "\n") (nreverse result))
599 (dolist (entry (split-string (hg-chomp (cdr s)) "\n") (nreverse result))
563 (let ((state (cdr (assoc (substring entry 0 2)
600 (let ((state (cdr (assoc (substring entry 0 2)
@@ -569,7 +606,7 b' Each entry is a pair (FILE-NAME . STATUS'
569 ("I " . ignored)
606 ("I " . ignored)
570 ("? " . nil)))))
607 ("? " . nil)))))
571 (name (substring entry 2)))
608 (name (substring entry 2)))
572 (setq result (cons (cons name state) result)))))))
609 (setq result (cons (cons name state) result))))))
573
610
574 (defmacro hg-view-output (args &rest body)
611 (defmacro hg-view-output (args &rest body)
575 "Execute BODY in a clean buffer, then quickly display that buffer.
612 "Execute BODY in a clean buffer, then quickly display that buffer.
@@ -646,25 +683,28 b' Always returns a valid, hopefully sane, '
646
683
647 ;;; Hooks.
684 ;;; Hooks.
648
685
686 (defun hg-mode-line-internal (status parents)
687 (setq hg-status status
688 hg-mode (and status (concat " Hg:"
689 parents
690 (cdr (assq status
691 '((normal . "")
692 (removed . "r")
693 (added . "a")
694 (deleted . "!")
695 (modified . "m"))))))))
696
649 (defun hg-mode-line (&optional force)
697 (defun hg-mode-line (&optional force)
650 "Update the modeline with the current status of a file.
698 "Update the modeline with the current status of a file.
651 An update occurs if optional argument FORCE is non-nil,
699 An update occurs if optional argument FORCE is non-nil,
652 hg-update-modeline is non-nil, or we have not yet checked the state of
700 hg-update-modeline is non-nil, or we have not yet checked the state of
653 the file."
701 the file."
654 (when (and (hg-root) (or force hg-update-modeline (not hg-mode)))
702 (let ((root (hg-root)))
655 (let ((status (hg-file-status buffer-file-name))
703 (when (and root (or force hg-update-modeline (not hg-mode)))
656 (parents
704 (let ((status (hg-file-status buffer-file-name))
657 (split-string (hg-chomp
705 (parents (hg-parents-for-mode-line root)))
658 (hg-run0 "parents" "--template" "{rev}\n")) "\n")))
706 (hg-mode-line-internal status parents)
659 (setq hg-status status
707 status))))
660 hg-mode (and status (concat " Hg:"
661 (mapconcat 'identity parents "+")
662 (cdr (assq status
663 '((normal . "")
664 (removed . "r")
665 (added . "a")
666 (modified . "m")))))))
667 status)))
668
708
669 (defun hg-mode (&optional toggle)
709 (defun hg-mode (&optional toggle)
670 "Minor mode for Mercurial distributed SCM integration.
710 "Minor mode for Mercurial distributed SCM integration.
@@ -844,8 +884,7 b' hg-commit-allow-empty-file-list is nil, '
844 (let ((buf hg-prev-buffer))
884 (let ((buf hg-prev-buffer))
845 (kill-buffer nil)
885 (kill-buffer nil)
846 (switch-to-buffer buf))
886 (switch-to-buffer buf))
847 (hg-do-across-repo root
887 (hg-update-mode-lines root))))
848 (hg-mode-line)))))
849
888
850 (defun hg-commit-mode ()
889 (defun hg-commit-mode ()
851 "Mode for describing a commit of changes to a Mercurial repository.
890 "Mode for describing a commit of changes to a Mercurial repository.
General Comments 0
You need to be logged in to leave comments. Login now