Mercurial > emacs
changeset 96256:a56e02fe83fc
* vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
vc-dir-marked-only-files. Change the return value.
(vc-dir-child-files-and-states): Rename from vc-dir-child-files.
Change the return value.
(vc-dir-deduce-fileset): New function broken out from ...
* vc.el (vc-deduce-fileset): ... here and ...
(vc-deduce-fileset): ... here.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Wed, 25 Jun 2008 03:19:14 +0000 |
parents | cc315e7d5288 |
children | 343227fc64ed |
files | lisp/ChangeLog lisp/vc-dir.el lisp/vc.el |
diffstat | 3 files changed, 94 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Wed Jun 25 02:56:20 2008 +0000 +++ b/lisp/ChangeLog Wed Jun 25 03:19:14 2008 +0000 @@ -1,5 +1,13 @@ 2008-06-25 Dan Nicolaescu <dann@ics.uci.edu> + * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from + vc-dir-marked-only-files. Change the return value. + (vc-dir-child-files-and-states): Rename from vc-dir-child-files. + Change the return value. + (vc-dir-deduce-fileset): New function broken out from ... + * vc.el (vc-deduce-fileset): ... here and ... + (vc-deduce-fileset): ... here. + * vc-svn.el (vc-annotate-parent-rev): Pacify byte compiler. 2008-06-25 Andreas Schwab <schwab@suse.de>
--- a/lisp/vc-dir.el Wed Jun 25 02:56:20 2008 +0000 +++ b/lisp/vc-dir.el Wed Jun 25 03:19:14 2008 +0000 @@ -690,14 +690,16 @@ (lambda (elem) (expand-file-name (vc-dir-fileinfo->name elem))) (ewoc-collect vc-ewoc 'vc-dir-fileinfo->marked))) -(defun vc-dir-marked-only-files () - "Return the list of marked files, for marked directories return child files." +(defun vc-dir-marked-only-files-and-states () + "Return the list of conses (FILE . STATE) for the marked files. +For marked directories return the corresponding conses for the +child files." (let ((crt (ewoc-nth vc-ewoc 0)) result) (while crt (let ((crt-data (ewoc-data crt))) (if (vc-dir-fileinfo->marked crt-data) - ;; FIXME: use vc-dir-child-files here instead of duplicating it. + ;; FIXME: use vc-dir-child-files-and-states here instead of duplicating it. (if (vc-dir-fileinfo->directory crt-data) (let* ((dir (vc-dir-fileinfo->directory crt-data)) (dirlen (length dir)) @@ -709,15 +711,20 @@ (setq data (ewoc-data crt)) (vc-dir-node-directory crt)))) (unless (vc-dir-fileinfo->directory data) - (push (expand-file-name (vc-dir-fileinfo->name data)) result)))) - (push (expand-file-name (vc-dir-fileinfo->name crt-data)) result) + (push + (cons (expand-file-name (vc-dir-fileinfo->name data)) + (vc-dir-fileinfo->state data)) + result)))) + (push (cons (expand-file-name (vc-dir-fileinfo->name crt-data)) + (vc-dir-fileinfo->state crt-data)) + result) (setq crt (ewoc-next vc-ewoc crt))) (setq crt (ewoc-next vc-ewoc crt))))) result)) -(defun vc-dir-child-files () - "Return the list of child files for the current entry if it's a directory. -If it is a file, return the file itself." +(defun vc-dir-child-files-and-states () + "Return the list of conses (FILE . STATE) for child files of the current entry if it's a directory. +If it is a file, return the corresponding cons for the file itself." (let* ((crt (ewoc-locate vc-ewoc)) (crt-data (ewoc-data crt)) result) @@ -731,8 +738,13 @@ (setq data (ewoc-data crt)) (vc-dir-node-directory crt)))) (unless (vc-dir-fileinfo->directory data) - (push (expand-file-name (vc-dir-fileinfo->name data)) result)))) - (push (expand-file-name (vc-dir-fileinfo->name crt-data)) result)) + (push + (cons (expand-file-name (vc-dir-fileinfo->name data)) + (vc-dir-fileinfo->state data)) + result)))) + (push + (cons (expand-file-name (vc-dir-fileinfo->name crt-data)) + (vc-dir-fileinfo->state crt-data)) result)) result)) (defun vc-dir-resynch-file (&optional fname) @@ -932,6 +944,35 @@ (defun vc-dir-status-printer (fileentry) (vc-call-backend vc-dir-backend 'status-printer fileentry)) +(defun vc-dir-deduce-fileset (&optional state-model-only-files) + (let ((marked (vc-dir-marked-files)) + files + only-files-list + state + model) + (if marked + (progn + (setq files marked) + (when state-model-only-files + (setq only-files-list (vc-dir-marked-only-files-and-states)))) + (let ((crt (vc-dir-current-file))) + (setq files (list crt)) + (when state-model-only-files + (setq only-files-list (vc-dir-child-files-and-states))))) + + (when state-model-only-files + (setq state (cdar only-files-list)) + ;; Check that all files are in a consistent state, since we use that + ;; state to decide which operation to perform. + (dolist (crt (cdr only-files-list)) + (unless (vc-compatible-state (cdr crt) state) + (error "%s:%s clashes with %s:%s" + (car crt) (cdr crt) (caar only-files-list) state))) + (setq only-files-list (mapcar 'car only-files-list)) + (when (and state (not (eq state 'unregistered))) + (setq model (vc-checkout-model vc-dir-backend only-files-list)))) + (list vc-dir-backend files only-files-list state model))) + ;;;###autoload (defun vc-dir (dir backend) "Show the VC status for DIR.
--- a/lisp/vc.el Wed Jun 25 02:56:20 2008 +0000 +++ b/lisp/vc.el Wed Jun 25 03:19:14 2008 +0000 @@ -643,6 +643,9 @@ ;; ;; - vc-dir toolbar needs more icons. ;; +;; - vc-dir-hide-up-to-date needs to hide directories that do not have +;; any children anymore. +;; ;;; Code: (require 'vc-hooks) @@ -903,38 +906,39 @@ ;; (vc-backend (car cooked))))) ;; (cons backend selection))) -(declare-function vc-dir-child-files "vc-dir" ()) (declare-function vc-dir-current-file "vc-dir" ()) -(declare-function vc-dir-marked-files "vc-dir" ()) -(declare-function vc-dir-marked-only-files "vc-dir" ()) +(declare-function vc-dir-deduce-fileset "vc-dir" (&optional state-model-only-files)) -(defun vc-deduce-fileset (&optional observer allow-unregistered only-files) +(defun vc-deduce-fileset (&optional observer allow-unregistered + state-model-only-files) "Deduce a set of files and a backend to which to apply an operation. -Return (BACKEND FILESET FILESET-ONLY-FILES). +Return (BACKEND FILESET FILESET-ONLY-FILES STATE CHECKOUT-MODEL). If we're in VC-dir mode, the fileset is the list of marked files. Otherwise, if we're looking at a buffer visiting a version-controlled file, the fileset is a singleton containing this file. If none of these conditions is met, but ALLOW_UNREGISTERED is on and the visited file is not registered, return a singleton fileset containing it. Otherwise, throw an error. -ONLY-FILES if non-nil, means that the caller needs to FILESET-ONLY-FILES -info. Otherwise, that part may be skipped. -BEWARE: this function may change the current buffer." + +STATE-MODEL-ONLY-FILES if non-nil, means that the caller needs +the FILESET-ONLY-FILES STATE and MODEL info. Otherwise, that +part may be skipped. +BEWARE: this function may change the +current buffer." ;; FIXME: OBSERVER is unused. The name is not intuitive and is not ;; documented. It's set to t when called from diff and print-log. (let (backend) (cond ((derived-mode-p 'vc-dir-mode) - (let ((marked (vc-dir-marked-files))) - (if marked - (list vc-dir-backend marked - (if only-files (vc-dir-marked-only-files))) - (let ((crt (vc-dir-current-file))) - (list vc-dir-backend (list crt) - (if only-files (vc-dir-child-files))))))) + (vc-dir-deduce-fileset state-model-only-files)) ((setq backend (vc-backend buffer-file-name)) - (list backend (list buffer-file-name) (list buffer-file-name))) + (if state-model-only-files + (list backend (list buffer-file-name) + (list buffer-file-name) + (vc-state buffer-file-name) + (vc-checkout-model backend buffer-file-name)) + (list backend (list buffer-file-name)))) ((and (buffer-live-p vc-parent-buffer) ;; FIXME: Why this test? --Stef (or (buffer-file-name vc-parent-buffer) @@ -942,19 +946,26 @@ (eq major-mode 'vc-dir-mode)))) (progn ;FIXME: Why not `with-current-buffer'? --Stef. (set-buffer vc-parent-buffer) - (vc-deduce-fileset observer allow-unregistered only-files))) + (vc-deduce-fileset observer allow-unregistered state-model-only-files))) ((not buffer-file-name) (error "Buffer %s is not associated with a file" (buffer-name))) ((and allow-unregistered (not (vc-registered buffer-file-name))) - (list (vc-responsible-backend - (file-name-directory (buffer-file-name))) - (list buffer-file-name) (list buffer-file-name))) + (if state-model-only-files + (list (vc-responsible-backend + (file-name-directory (buffer-file-name))) + (list buffer-file-name) + (list buffer-file-name) + (when state-model-only-files 'unregistered) + nil) + (list (vc-responsible-backend + (file-name-directory (buffer-file-name))) + (list buffer-file-name)))) (t (error "No fileset is available here."))))) (defun vc-ensure-vc-buffer () "Make sure that the current buffer visits a version-controlled file." (cond - ((vc-dispatcher-browsing) + ((derived-mode-p 'vc-dir-mode) (set-buffer (find-file-noselect (vc-dir-current-file)))) (t (while (and vc-parent-buffer @@ -1019,27 +1030,17 @@ If the repository file is changed, you are asked if you want to merge in the changes into your working copy." (interactive "P") - (let* ((vc-fileset (vc-deduce-fileset nil t 'only-files)) + (let* ((vc-fileset (vc-deduce-fileset nil t 'state-model-only-files)) (backend (car vc-fileset)) (files (nth 1 vc-fileset)) (fileset-only-files (nth 2 vc-fileset)) ;; FIXME: We used to call `vc-recompute-state' here. - (state (vc-state (car fileset-only-files))) + (state (nth 3 vc-fileset)) ;; The backend should check that the checkout-model is consistent ;; among all the `files'. - (model - ;; FIXME: This is not very elegant... - (when (and state (not (eq state 'unregistered))) - (vc-checkout-model backend files))) + (model (nth 4 vc-fileset)) revision) - ;; Check that all files are in a consistent state, since we use that - ;; state to decide which operation to perform. - (dolist (file (cdr fileset-only-files)) - (unless (vc-compatible-state (vc-state file) state) - (error "%s:%s clashes with %s:%s" - file (vc-state file) (car fileset-only-files) state))) - ;; Do the right thing (cond ((eq state 'missing)