Function: vc-dir--count-outgoing

vc-dir--count-outgoing is a byte-compiled function defined in vc-dir.el.gz.

Signature

(vc-dir--count-outgoing BACKEND OVERLAY)

Documentation

Populate OVERLAY with count of outgoing revisions for backend BACKEND.

See vc-dir-async-header-values for an explanation of how this function uses OVERLAY.

Source Code

;; Defined in /usr/src/emacs/lisp/vc/vc-dir.el.gz
(defun vc-dir--count-outgoing (backend overlay)
  "Populate OVERLAY with count of outgoing revisions for backend BACKEND.
See `vc-dir-async-header-values' for an explanation of how this function
uses OVERLAY."
  (cl-flet ((set-overlay-text (text)
              (with-current-buffer (overlay-buffer overlay)
                (save-excursion
                  (let ((inhibit-read-only t)
                        (start (overlay-start overlay)))
                    (delete-region start (overlay-end overlay))
                    (goto-char start)
                    (insert text)
                    (move-overlay overlay start (point)))))))
    (set-overlay-text (propertize "[counting ...]"
                                  'face 'vc-dir-header-value))
    ;; `vc-incoming-outgoing-internal' invokes external processes
    ;; synchronously before we can get to the `vc-run-delayed', so
    ;; postpone running it a little.
    (overlay-put
     overlay 'timer
     (run-with-idle-timer
      0.2 nil
      (lambda ()
        (let* ((default-directory
                (buffer-local-value 'default-directory
				    (overlay-buffer overlay)))
	       (display-buffer-overriding-action
                '(display-buffer-no-window (allow-no-window . t)))
               (unknown (propertize "<<unknown>>" 'face 'vc-dir-header-value))
               (buf (generate-new-buffer " *temp*" t))
               proc)
          (without-local-variable-queries
            (with-current-buffer buf
              (condition-case _
                  (progn
                    (vc-incoming-outgoing-internal backend nil
                                                   (current-buffer)
                                                   '(log-outgoing short))
                    (setq proc (get-buffer-process (current-buffer)))
                    (set-process-query-on-exit-flag proc nil)
                    (overlay-put overlay 'proc proc)
                    (vc-run-delayed
                      (unwind-protect
                          (set-overlay-text
                           (if (or (not (eq (process-status proc) 'exit))
                                   (plusp (process-exit-status proc)))
                               unknown
                             (goto-char (point-min))
                             (let ((count (how-many log-view-message-re)))
                               (if (zerop count)
                                   (propertize "No unpushed revisions"
                                               'face 'vc-dir-header-value)
                                 (propertize
                                  (format (ngettext "%d unpushed revision"
                                                    "%d unpushed revisions"
                                                    count)
                                          count)
                                  'face 'vc-dir-header-urgent-value
                                  'mouse-face 'highlight
                                  'keymap vc-dir-outgoing-revisions-map
                                  'help-echo "\\<vc-dir-outgoing-revisions-map>\
\\[vc-root-log-outgoing]: List outgoing revisions")))))
                        (kill-buffer))))
                (error (kill-buffer buf)
                       (set-overlay-text unknown)))))))))))