From: Dan Nicolaescu Date: Sat, 29 Mar 2008 05:34:52 +0000 (+0000) Subject: * vc.el (vc-status-menu-map, vc-status-mode-map): Bind vc-revert. X-Git-Tag: emacs-pretest-23.0.90~6798 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=115c0061772238c4118c271903336405d35416e7;p=emacs.git * vc.el (vc-status-menu-map, vc-status-mode-map): Bind vc-revert. (vc-status-refresh): Create a temporary buffer and call the `dir-status' backend function from that buffer. * vc-bzr.el (vc-bzr-dir-status): Don't create a buffer. (vc-bzr-after-dir-status): Don't kill the buffer. * vc-cvs.el (vc-cvs-dir-status): Don't create a buffer. (vc-cvs-after-dir-status): Don't kill the buffer. * vc-git.el (vc-git-dir-status): Don't create a buffer. (vc-git-after-dir-status-stage2): Don't kill the buffer. * vc-hg.el (vc-hg-dir-status): Don't create a buffer. (vc-hg-after-dir-status): Don't kill the buffer. * vc-svn.el (vc-svn-dir-status): Don't create a buffer. (vc-svn-after-dir-status): Don't kill the buffer. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 94c3ee908ca..c4ad170e5f0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -3,6 +3,25 @@ * vc-hooks.el (vc-menu-map-filter): Be more careful when finding the current backend. + * vc.el (vc-status-menu-map, vc-status-mode-map): Bind vc-revert. + (vc-status-refresh): Create a temporary buffer and call the + `dir-status' backend function from that buffer. + + * vc-bzr.el (vc-bzr-dir-status): Don't create a buffer. + (vc-bzr-after-dir-status): Don't kill the buffer. + + * vc-cvs.el (vc-cvs-dir-status): Don't create a buffer. + (vc-cvs-after-dir-status): Don't kill the buffer. + + * vc-git.el (vc-git-dir-status): Don't create a buffer. + (vc-git-after-dir-status-stage2): Don't kill the buffer. + + * vc-hg.el (vc-hg-dir-status): Don't create a buffer. + (vc-hg-after-dir-status): Don't kill the buffer. + + * vc-svn.el (vc-svn-dir-status): Don't create a buffer. + (vc-svn-after-dir-status): Don't kill the buffer. + 2008-03-29 Glenn Morris * calendar/calendar.el (diary-file, american-date-diary-pattern) diff --git a/lisp/vc-bzr.el b/lisp/vc-bzr.el index cda9c65c110..a875210d183 100644 --- a/lisp/vc-bzr.el +++ b/lisp/vc-bzr.el @@ -677,23 +677,16 @@ Optional argument LOCALP is always ignored." (setq translated (assoc status-str translation)) (push (cons file (cdr translated)) result) (forward-line)) - ;; Remove the temporary buffer. - (kill-buffer (current-buffer)) (funcall update-function result status-buffer))) ;; XXX Experimental function for the vc-dired replacement. ;; XXX This probably needs some further refinement and testing. (defun vc-bzr-dir-status (dir update-function status-buffer) "Return a list of conses (file . state) for DIR." - (with-current-buffer - (get-buffer-create - (expand-file-name " *VC-bzr* tmp status" dir)) - (erase-buffer) - ;; XXX: Is this the right command to use? - (vc-bzr-command "status" (current-buffer) 'async dir "-v" "-S") - (vc-exec-after - `(vc-bzr-after-dir-status (quote ,update-function) ,status-buffer)) - (current-buffer))) + ;; XXX: Is this the right command to use? + (vc-bzr-command "status" (current-buffer) 'async dir "-v" "-S") + (vc-exec-after + `(vc-bzr-after-dir-status (quote ,update-function) ,status-buffer))) ;;; Revision completion diff --git a/lisp/vc-cvs.el b/lisp/vc-cvs.el index 0d1a2be9164..0d76eb3902e 100644 --- a/lisp/vc-cvs.el +++ b/lisp/vc-cvs.el @@ -927,20 +927,14 @@ state." (push (cons file status) result)))))) (goto-char (point-max)) (widen)) - ;; Remove the temporary buffer. - (kill-buffer (current-buffer)) (funcall update-function result status-buffer))) ;; XXX Experimental function for the vc-dired replacement. (defun vc-cvs-dir-status (dir update-function status-buffer) "Create a list of conses (file . state) for DIR." - (with-current-buffer - (get-buffer-create (expand-file-name " *VC-cvs* tmp status" dir)) - (erase-buffer) - (vc-cvs-command (current-buffer) 'async dir "status") - (vc-exec-after - `(vc-cvs-after-dir-status (quote ,update-function) ,status-buffer)) - (current-buffer))) + (vc-cvs-command (current-buffer) 'async dir "status") + (vc-exec-after + `(vc-cvs-after-dir-status (quote ,update-function) ,status-buffer))) (defun vc-cvs-get-entries (dir) "Insert the CVS/Entries file from below DIR into the current buffer. diff --git a/lisp/vc-git.el b/lisp/vc-git.el index e4150f558ae..795f57c245d 100644 --- a/lisp/vc-git.el +++ b/lisp/vc-git.el @@ -215,9 +215,7 @@ (goto-char (point-min)) (while (re-search-forward "\\([^\0]*?\\)\0" nil t 1) (push (cons (match-string 1) 'unregistered) vc-git-status-result)) - (funcall update-function (nreverse vc-git-status-result) status-buffer) - ;; Remove the temporary buffer. - (kill-buffer (current-buffer))) + (funcall update-function (nreverse vc-git-status-result) status-buffer)) (defun vc-git-after-dir-status-stage1 (update-function status-buffer) (goto-char (point-min)) @@ -248,21 +246,16 @@ ;; Further things that would have to be fixed later: ;; - how to handle unregistered directories ;; - how to support vc-status on a subdir of the project tree - (with-current-buffer - (get-buffer-create - (expand-file-name " *VC-Git* tmp status" dir)) - (set (make-local-variable 'vc-git-status-result) nil) - (cd dir) - (erase-buffer) - (if (vc-git--empty-db-p) - (progn - (vc-git-command (current-buffer) 'async nil "ls-files" "-z" "-c") - (vc-exec-after - `(vc-git-after-dir-status-stage1-empty-db (quote ,update-function) ,status-buffer))) - (vc-git-command (current-buffer) 'async nil "diff-index" "-z" "HEAD") - (vc-exec-after - `(vc-git-after-dir-status-stage1 (quote ,update-function) ,status-buffer))) - (current-buffer))) + (set (make-local-variable 'vc-git-status-result) nil) + (if (vc-git--empty-db-p) + (progn + (vc-git-command (current-buffer) 'async nil "ls-files" "-z" "-c") + (vc-exec-after + `(vc-git-after-dir-status-stage1-empty-db + (quote ,update-function) ,status-buffer))) + (vc-git-command (current-buffer) 'async nil "diff-index" "-z" "HEAD") + (vc-exec-after + `(vc-git-after-dir-status-stage1 (quote ,update-function) ,status-buffer)))) (defun vc-git-status-extra-headers (dir) (let ((str (with-output-to-string diff --git a/lisp/vc-hg.el b/lisp/vc-hg.el index abf64a7f987..b3f95471fc0 100644 --- a/lisp/vc-hg.el +++ b/lisp/vc-hg.el @@ -498,21 +498,15 @@ REV is the revision to check out into WORKFILE." (when (and translated (not (eq (cdr translated) 'up-to-date))) (push (cons file (cdr translated)) result)) (forward-line)) - ;; Remove the temporary buffer. - (kill-buffer (current-buffer)) (funcall update-function result status-buffer))) ;; XXX Experimental function for the vc-dired replacement. (defun vc-hg-dir-status (dir update-function status-buffer) "Return a list of conses (file . state) for DIR." - (with-current-buffer - (get-buffer-create - (expand-file-name " *VC-hg* tmp status" dir)) - (erase-buffer) - (vc-hg-command (current-buffer) 'async dir "status") - (vc-exec-after - `(vc-hg-after-dir-status (quote ,update-function) ,status-buffer)) - (current-buffer))) + (erase-buffer) + (vc-hg-command (current-buffer) 'async dir "status") + (vc-exec-after + `(vc-hg-after-dir-status (quote ,update-function) ,status-buffer))) ;; XXX this adds another top level menu, instead figure out how to ;; replace the Log-View menu. diff --git a/lisp/vc-svn.el b/lisp/vc-svn.el index c50434c4630..5e65d342f34 100644 --- a/lisp/vc-svn.el +++ b/lisp/vc-svn.el @@ -175,19 +175,15 @@ If you want to force an empty list of arguments, use t." (filename (match-string 2))) (when state (setq result (cons (cons filename state) result))))) - (kill-buffer (current-buffer)) (funcall callback result buffer))) (defun vc-svn-dir-status (dir callback buffer) "Run 'svn status' for DIR and update BUFFER via CALLBACK. CALLBACK is called as (CALLBACK RESULT BUFFER), where RESULT is a list of conses (FILE . STATE) for directory DIR." - (with-current-buffer (get-buffer-create - (generate-new-buffer-name " *vc svn status*")) - (vc-svn-command (current-buffer) 'async nil "status") - (vc-exec-after - `(vc-svn-after-dir-status (quote ,callback) ,buffer)) - (current-buffer))) + (vc-svn-command (current-buffer) 'async nil "status") + (vc-exec-after + `(vc-svn-after-dir-status (quote ,callback) ,buffer))) (defun vc-svn-working-revision (file) "SVN-specific version of `vc-working-revision'." diff --git a/lisp/vc.el b/lisp/vc.el index 77924cbac21..43093568f3c 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -171,19 +171,16 @@ ;; ;; Produce RESULT: a list of conses of the form (file . vc-state) ;; for the files in DIR. If a command needs to be run to compute -;; this list, it should be run asynchronously. When RESULT is -;; computed, it should be passed back by doing: -;; (funcall UPDATE-FUNCTION RESULT STATUS-BUFFER) -;; Return the buffer used for the asynchronous call. This buffer -;; is used to kill the status update process on demand. -;; This function is used by vc-status, a replacement for vc-dired. +;; this list, it should be run asynchronously using (current-buffer) +;; as the buffer for the command. When RESULT is computed, it should +;; be passed back by doing: (funcall UPDATE-FUNCTION RESULT STATUS-BUFFER) +;; This function is used by `vc-status', a replacement for `vc-dired'. ;; vc-status is still under development, and is NOT feature ;; complete. As such, the requirements for this function might -;; change. -;; This is a replacement for dir-state. +;; change. This is a replacement for `dir-state'. ;; ;; - status-extra-headers (dir) -;; +;; ;; Return a string that will be added to the *vc-status* buffer header. ;; ;; * working-revision (file) @@ -2739,7 +2736,7 @@ With prefix arg READ-SWITCHES, specify a value to override '(menu-item "Hide up-to-date" vc-status-hide-up-to-date :help "Hide up-to-date items from display")) ;; VC commands. - (define-key map [separator-vc-commands] '("--")) + (define-key map [sepvccmd] '("--")) (define-key map [annotate] '(menu-item "Annotate" vc-annotate :help "Display the edit history of the current file using colors")) @@ -2750,14 +2747,17 @@ With prefix arg READ-SWITCHES, specify a value to override '(menu-item "Register" vc-status-register :help "Register file set into the version control system")) (define-key map [update] - '(menu-item "Update" vc-update + '(menu-item "Update to latest version" vc-update :help "Update the current fileset's files to their tip revisions")) + (define-key map [revert] + '(menu-item "Revert to base version" vc-revert + :help "Revert working copies of the selected fileset to their repository contents.")) (define-key map [log] '(menu-item "Show history" vc-print-log :help "List the change log of the current file set in a window")) ;; Movement. - (define-key map [separator-movement] '("--")) + (define-key map [sepmv] '("--")) (define-key map [next-line] '(menu-item "Next line" vc-status-next-line :help "Go to the next line" :keys "n")) @@ -2765,7 +2765,7 @@ With prefix arg READ-SWITCHES, specify a value to override '(menu-item "Previous line" vc-status-previous-line :help "Go to the previous line")) ;; Marking. - (define-key map [separator-marking] '("--")) + (define-key map [sepmrk] '("--")) (define-key map [unmark-all] '(menu-item "Unmark All" vc-status-unmark-all-files :help "Unmark all files that are in the same state as the current file\ @@ -2786,7 +2786,7 @@ With prefix arg READ-SWITCHES, specify a value to override '(menu-item "Mark" vc-status-mark :help "Mark the current file or all files in the region")) - (define-key map [separator-open] '("--")) + (define-key map [sepopn] '("--")) (define-key map [open-other] '(menu-item "Open in other window" vc-status-find-file-other-window :help "Find the file on the current line, in another window")) @@ -2814,12 +2814,13 @@ With prefix arg READ-SWITCHES, specify a value to override (define-key map "p" 'vc-status-previous-line) (define-key map [backtab] 'vc-status-previous-line) ;; VC commands. - (define-key map "=" 'vc-diff) + (define-key map "=" 'vc-diff) ;; C-x v = (define-key map "a" 'vc-status-register) - (define-key map "+" 'vc-update) + (define-key map "+" 'vc-update) ;; C-x v + + (define-key map "U" 'vc-revert) ;; u is taken by unmark. ;; Can't be "g" (as in vc map), so "A" for "Annotate". (define-key map "A" 'vc-annotate) - (define-key map "l" 'vc-print-log) + (define-key map "l" 'vc-print-log) ;; C-x v l ;; The remainder. (define-key map "f" 'vc-status-find-file) (define-key map "\C-m" 'vc-status-find-file) @@ -2961,9 +2962,9 @@ Throw an error if another update process is in progress." (interactive) (if vc-status-process-buffer (error "Another update process is in progress, cannot run two at a time") - ;; This is not very efficient; ewoc could use a new function here. ;; We clear the ewoc, but remember the marked files so that we can ;; mark them again after the refresh is done. + ;; This is not very efficient; ewoc could use a new function here. (setq vc-status-crt-marked (mapcar (lambda (elem) @@ -2973,17 +2974,29 @@ Throw an error if another update process is in progress." (lambda (crt) (vc-status-fileinfo->marked crt))))) (ewoc-filter vc-status (lambda (node) nil)) - (let ((backend (vc-responsible-backend default-directory))) + (let ((backend (vc-responsible-backend default-directory)) + (status-buffer (current-buffer)) + (def-dir default-directory)) (vc-set-mode-line-busy-indicator) - ;; Call the dir-status backend function. dir-status is supposed to - ;; be asynchronous. It should compute the results and call the - ;; function passed as a an arg to update the vc-status buffer with - ;; the results. - (let ((buf (vc-call-backend - backend 'dir-status default-directory - #'vc-update-vc-status-buffer (current-buffer)))) - (setq vc-status-process-buffer - (if (buffer-live-p buf) buf nil)))))) + ;; Call the `dir-status' backend function. + ;; `dir-status' is supposed to be asynchronous. + ;; It should compute the results, and then call the function + ;; passed as an argument in order to update the vc-status buffer + ;; with the results. + + ;; Create a buffer that can be used by `dir-status' and call + ;; `dir-status' with this buffer as the current buffer. Use + ;; `vc-status-process-buffer' to remember this buffer, so that + ;; it can be used later to kill the update process in case it + ;; takes too long. + (setq vc-status-process-buffer + (get-buffer-create + (generate-new-buffer-name (format " *VC-%s* status" backend)))) + (with-current-buffer vc-status-process-buffer + (cd def-dir) + (erase-buffer) + (vc-call-backend backend 'dir-status def-dir + #'vc-update-vc-status-buffer status-buffer))))) (defun vc-status-kill-dir-status-process () "Kill the temporary buffer and associated process."