From 498ecddeeefea9c65e7fba35a0d8515bde1655dc Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 25 Jun 2002 00:11:28 +0000 Subject: [PATCH] (cvs-parse-process): Don't save/restore point. Fix last change not to introduce spurious dir FIs. (cvs-move-to-goal-column): New function extracted from cvs-mode-previous-line. (cvs-mode-previous-line, cvs-mode-next-line): Use it. (cvs-addto-collection): Use it to preserve point. (cvs-vc-command-advice): Ad-hoc workaround for `cvs -q add'. --- lisp/pcvs.el | 106 +++++++++++++++++++++++++-------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/lisp/pcvs.el b/lisp/pcvs.el index ffec60e673b..b8ec3e009ad 100644 --- a/lisp/pcvs.el +++ b/lisp/pcvs.el @@ -14,7 +14,7 @@ ;; (Jari Aalto+mail.emacs) jari.aalto@poboxes.com ;; Maintainer: (Stefan Monnier) monnier+lists/cvs/pcl@flint.cs.yale.edu ;; Keywords: CVS, version control, release management -;; Revision: $Id: pcvs.el,v 1.36 2002/06/18 21:50:30 monnier Exp $ +;; Revision: $Id: pcvs.el,v 1.37 2002/06/24 22:49:38 monnier Exp $ ;; This file is part of GNU Emacs. @@ -62,7 +62,6 @@ ;; ******** FIX THE DOCUMENTATION ********* ;; ;; - rework the displaying of error messages. -;; - use UP-TO-DATE rather than DEAD when cleaning before `examine'. ;; - allow to flush messages only ;; - allow to protect files like ChangeLog from flushing ;; - automatically cvs-mode-insert files from find-file-hook @@ -640,45 +639,41 @@ DCD is the `dont-change-disc' flag to use when parsing that output. SUBDIR is the subdirectory (if any) where this command was run. OLD-FIS is the list of fileinfos on which the cvs command was applied and which should be considered up-to-date if they are missing from the output." - (let* ((from-buf (current-buffer)) - (fileinfos (cvs-parse-buffer 'cvs-parse-table dcd subdir)) - (_ (set-buffer cvs-buffer)) - last - (from-pt (point))) - ;; Expand OLD-FIS to actual files. - (dolist (fi old-fis) - (when (eq (cvs-fileinfo->type fi) 'DIRCHANGE) - (setq old-fis (nconc (ewoc-collect cvs-cookies 'cvs-dir-member-p - (cvs-fileinfo->dir fi)) - old-fis)))) - ;; Drop OLD-FIS which were already up-to-date. - (let ((fis nil)) + (let* ((fileinfos (cvs-parse-buffer 'cvs-parse-table dcd subdir)) + last) + (with-current-buffer cvs-buffer + ;; Expand OLD-FIS to actual files. + (let ((fis nil)) + (dolist (fi old-fis) + (setq fis (if (eq (cvs-fileinfo->type fi) 'DIRCHANGE) + (nconc (ewoc-collect cvs-cookies 'cvs-dir-member-p + (cvs-fileinfo->dir fi)) + fis) + (cons fi fis)))) + (setq old-fis fis)) + ;; Drop OLD-FIS which were already up-to-date. + (let ((fis nil)) + (dolist (fi old-fis) + (unless (eq (cvs-fileinfo->type fi) 'UP-TO-DATE) (push fi fis))) + (setq old-fis fis)) + ;; Add the new fileinfos to the ewoc. + (dolist (fi fileinfos) + (setq last (cvs-addto-collection cvs-cookies fi last)) + ;; This FI was in the output, so remove it from OLD-FIS. + (setq old-fis (delq (ewoc-data last) old-fis))) + ;; Process the "silent output" (i.e. absence means up-to-date). (dolist (fi old-fis) - (unless (eq (cvs-fileinfo->type fi) 'UP-TO-DATE) (push fi fis))) - (setq old-fis fis)) - ;; Add the new fileinfos to the ewoc. - (dolist (fi fileinfos) - (setq last (cvs-addto-collection cvs-cookies fi last)) - ;; This FI was in the output, so remove it from OLD-FIS. - (setq old-fis (delq (ewoc-data last) old-fis))) - ;; Process the "silent output" (i.e. absence means up-to-date). - (dolist (fi old-fis) - (setf (cvs-fileinfo->type fi) 'UP-TO-DATE) - (setq last (cvs-addto-collection cvs-cookies fi last))) - (setq fileinfos (nconc old-fis fileinfos)) - ;; Clean up the ewoc as requested by the user. - (cvs-cleanup-collection cvs-cookies - (eq cvs-auto-remove-handled t) - cvs-auto-remove-directories - nil) - ;; Revert buffers if necessary. - (when (and cvs-auto-revert (not dcd) (not cvs-from-vc)) - (cvs-revert-if-needed fileinfos)) - ;; get back to where we were. `save-excursion' doesn't seem to - ;; work in this case, probably because the buffer is reconstructed - ;; by the cookie code. - (goto-char from-pt) - (set-buffer from-buf))) + (setf (cvs-fileinfo->type fi) 'UP-TO-DATE) + (setq last (cvs-addto-collection cvs-cookies fi last))) + (setq fileinfos (nconc old-fis fileinfos)) + ;; Clean up the ewoc as requested by the user. + (cvs-cleanup-collection cvs-cookies + (eq cvs-auto-remove-handled t) + cvs-auto-remove-directories + nil) + ;; Revert buffers if necessary. + (when (and cvs-auto-revert (not dcd) (not cvs-from-vc)) + (cvs-revert-if-needed fileinfos))))) (defmacro defun-cvs-mode (fun args docstring interact &rest body) "Define a function to be used in a *cvs* buffer. @@ -766,6 +761,8 @@ TIN specifies an optional starting point." ;; fi == tin (cvs-fileinfo-update (ewoc-data tin) fi) (ewoc-invalidate c tin) + ;; Move cursor back to where it belongs. + (when (bolp) (cvs-move-to-goal-column)) tin)))) (defcustom cvs-cleanup-functions nil @@ -1108,29 +1105,25 @@ Full documentation is in the Texinfo file." ;; Move around in the buffer +(defun cvs-move-to-goal-column () + (let* ((eol (line-end-position)) + (fpos (next-single-property-change (point) 'cvs-goal-column nil eol))) + (when (< fpos eol) + (goto-char fpos)))) + (defun-cvs-mode cvs-mode-previous-line (arg) "Go to the previous line. If a prefix argument is given, move by that many lines." (interactive "p") (ewoc-goto-prev cvs-cookies arg) - (let ((fpos (next-single-property-change - (point) 'cvs-goal-column - (current-buffer) (line-end-position))) - (eol (line-end-position))) - (when (< fpos eol) - (goto-char fpos)))) + (cvs-move-to-goal-column)) (defun-cvs-mode cvs-mode-next-line (arg) "Go to the next line. If a prefix argument is given, move by that many lines." (interactive "p") (ewoc-goto-next cvs-cookies arg) - (let ((fpos (next-single-property-change - (point) 'cvs-goal-column - (current-buffer) (line-end-position))) - (eol (line-end-position))) - (when (< fpos eol) - (goto-char fpos)))) + (cvs-move-to-goal-column)) ;;;; ;;;; Mark handling @@ -2144,7 +2137,7 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (pop flags)) ;; don't parse output we don't understand. (member (car flags) cvs-parse-known-commands))) - (save-excursion + (save-current-buffer (let ((buffer (current-buffer)) (dir default-directory) (cvs-from-vc t)) @@ -2156,6 +2149,13 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (let ((subdir (substring dir (length default-directory)))) (set-buffer buffer) (set (make-local-variable 'cvs-buffer) cvs-buf) + ;; `cvs -q add file' produces no useful output :-( + (when (and (equal (car flags) "add") + (goto-char (point-min)) + (looking-at ".*to add this file permanently\n\\'")) + (insert "cvs add: scheduling file `" + (file-name-nondirectory file) + "' for addition\n")) ;; VC never (?) does `cvs -n update' so dcd=nil ;; should probably always be the right choice. (cvs-parse-process nil subdir)))))))) -- 2.39.2