]> code.delx.au - gnu-emacs/blobdiff - lisp/vc/pcvs.el
Update copyright year to 2016
[gnu-emacs] / lisp / vc / pcvs.el
index 914eef4dd39278f8f0dc74feabac13c686d9d7f2..36a1d91d90e6ba5c36988a142814ef82e847c679 100644 (file)
@@ -1,6 +1,6 @@
-;;; pcvs.el --- a front-end to CVS
+;;; pcvs.el --- a front-end to CVS  -*- lexical-binding:t -*-
 
-;; Copyright (C) 1991-2013 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2016 Free Software Foundation, Inc.
 
 ;; Author: (The PCL-CVS Trust) pcl-cvs@cyclic.com
 ;;     (Per Cederqvist) ceder@lysator.liu.se
@@ -341,15 +341,15 @@ the \\[cvs-mode-map] prefix."
 (defun cvs-temp-buffer (&optional cmd normal nosetup)
   "Create a temporary buffer to run CMD in.
 If CMD is a string, use it to lookup `cvs-buffer-name-alist' to find
-the buffer name to be used and its `major-mode'.
+the buffer name to be used and its major mode.
 
 The selected window will not be changed.  The new buffer will not maintain undo
 information and will be read-only unless NORMAL is non-nil.  It will be emptied
-\(unless NOSETUP is non-nil\) and its `default-directory' will be inherited
+\(unless NOSETUP is non-nil) and its `default-directory' will be inherited
 from the current buffer."
   (let* ((cvs-buf (current-buffer))
         (info (cdr (assoc cmd cvs-buffer-name-alist)))
-        (name (eval (nth 0 info)))
+        (name (eval (nth 0 info) `((cmd . ,cmd))))
         (mode (nth 1 info))
         (dir default-directory)
         (buf (cond
@@ -359,9 +359,10 @@ from the current buffer."
               (t
                (set (make-local-variable 'cvs-temp-buffer)
                     (cvs-get-buffer-create
-                     (eval cvs-temp-buffer-name) 'noreuse))))))
+                     (eval cvs-temp-buffer-name `((dir . ,dir)))
+                      'noreuse))))))
 
-    ;; handle the potential pre-existing process
+    ;; Handle the potential pre-existing process.
     (let ((proc (get-buffer-process buf)))
       (when (and (not normal) (processp proc)
                 (memq (process-status proc) '(run stop)))
@@ -416,7 +417,7 @@ from the current buffer."
 If non-nil, NEW means to create a new buffer no matter what."
   ;; the real cvs-buffer creation
   (setq dir (cvs-expand-dir-name dir))
-  (let* ((buffer-name (eval cvs-buffer-name))
+  (let* ((buffer-name (eval cvs-buffer-name `((dir . ,dir))))
         (buffer
          (or (and (not new)
                   (eq cvs-reuse-cvs-buffer 'current)
@@ -569,9 +570,9 @@ If non-nil, NEW means to create a new buffer no matter what."
           process 'cvs-postprocess
           (if (null rest)
               ;; this is the last invocation
-              postprocess
+               postprocess
             ;; else, we have to register ourselves to be rerun on the rest
-            `(cvs-run-process ',args ',rest ',postprocess ',single-dir)))
+            (lambda () (cvs-run-process args rest postprocess single-dir))))
          (set-process-sentinel process 'cvs-sentinel)
          (set-process-filter process 'cvs-update-filter)
          (set-marker (process-mark process) (point-max))
@@ -675,7 +676,8 @@ it is finished."
                (error "cvs' process buffer was killed")
              (with-current-buffer procbuf
                ;; Do the postprocessing like parsing and such.
-               (save-excursion (eval cvs-postproc)))))))
+               (save-excursion
+                  (funcall cvs-postproc)))))))
       ;; Check whether something is left.
       (when (and procbuf (not (get-buffer-process procbuf)))
         (with-current-buffer procbuf
@@ -748,14 +750,15 @@ FUN can be either a symbol (i.e. STYLE is nil) or a cons (FUN . STYLE).
 ARGS and DOCSTRING are the normal argument list.
 INTERACT is the interactive specification or nil for non-commands.
 
-STYLE can be either SIMPLE, NOARGS or DOUBLE.  It's an error for it
+STYLE can be either `SIMPLE', `NOARGS' or `DOUBLE'.  It's an error for it
 to have any other value, unless other details of the function make it
 clear what alternative to use.
-- SIMPLE will get all the interactive arguments from the original buffer.
-- NOARGS will get all the arguments from the *cvs* buffer and will
+- `SIMPLE' will get all the interactive arguments from the original buffer.
+- `NOARGS' will get all the arguments from the *cvs* buffer and will
   always behave as if called interactively.
-- DOUBLE is the generic case."
-  (declare (debug (&define sexp lambda-list stringp ("interactive" interactive) def-body))
+- `DOUBLE' is the generic case."
+  (declare (debug (&define sexp lambda-list stringp
+                           ("interactive" interactive) def-body))
           (doc-string 3))
   (let ((style (cvs-cdr fun))
        (fun (cvs-car fun)))
@@ -907,7 +910,7 @@ RM-MSGS if non-nil means remove messages."
        (setq rerun t)))))
 
 (defun cvs-get-cvsroot ()
-  "Gets the CVSROOT for DIR."
+  "Get the CVSROOT for DIR."
   (let ((cvs-cvsroot-file (expand-file-name "Root" "CVS")))
     (or (cvs-file-to-string cvs-cvsroot-file t)
        cvs-cvsroot
@@ -937,7 +940,7 @@ This usually doesn't really work but is a handy initval in a prompt."
 
 ;;;###autoload
 (defun cvs-checkout (modules dir flags &optional root)
-  "Run a 'cvs checkout MODULES' in DIR.
+  "Run a `cvs checkout MODULES' in DIR.
 Feed the output to a *cvs* buffer, display it in the current window,
 and run `cvs-mode' on it.
 
@@ -961,14 +964,14 @@ With a prefix argument, prompt for cvs FLAGS to use."
                :noexist t)))
 
 (defun-cvs-mode (cvs-mode-checkout . NOARGS) (dir)
-  "Run cvs checkout against the current branch.
+  "Run `cvs checkout' against the current branch.
 The files are stored to DIR."
   (interactive
    (let* ((branch (cvs-prefix-get 'cvs-branch-prefix))
-         (prompt (format "CVS Checkout Directory for `%s%s': "
-                        (cvs-get-module)
-                        (if branch (format " (branch: %s)" branch)
-                          ""))))
+         (prompt (format-message "CVS Checkout Directory for `%s%s': "
+                                 (cvs-get-module)
+                                 (if branch (format " (branch: %s)" branch)
+                                   ""))))
      (list (read-directory-name prompt nil default-directory nil))))
   (let ((modules (split-string-and-unquote (cvs-get-module)))
        (flags (cvs-add-branch-prefix
@@ -1079,7 +1082,7 @@ Optional argument NOSHOW if non-nil means not to display the buffer."
              :noshow noshow :dont-change-disc t))
 
 (defun cvs-update-filter (proc string)
-  "Filter function for pcl-cvs.
+  "Filter function for PCL-CVS.
 This function gets the output that CVS sends to stdout.  It inserts
 the STRING into (process-buffer PROC) but it also checks if CVS is waiting
 for a lock file.  If so, it inserts a message cookie in the *cvs* buffer."
@@ -1226,7 +1229,7 @@ If a prefix argument is given, move by that many lines."
 (defun-cvs-mode cvs-mode-mark (&optional arg)
   "Mark the fileinfo on the current line.
 If the fileinfo is a directory, all the contents of that directory are
-marked instead. A directory can never be marked."
+marked instead.  A directory can never be marked."
   (interactive)
   (let* ((tin (ewoc-locate cvs-cookies))
         (fi (ewoc-data tin)))
@@ -1394,7 +1397,7 @@ an empty list if it doesn't point to a file at all."
     (nreverse fis)))
 
 (cl-defun cvs-mode-marked (filter &optional cmd
-                               &key read-only one file noquery)
+                                 &key read-only one file noquery)
   "Get the list of marked FIS.
 CMD is used to determine whether to use the marks or not.
 Only files for which FILTER is applicable are returned.
@@ -1465,7 +1468,7 @@ The POSTPROC specified there (typically `log-edit') is then called,
     (set (make-local-variable 'cvs-minor-wrap-function) 'cvs-commit-minor-wrap)
     (run-hooks 'cvs-mode-commit-hook)))
 
-(defun cvs-commit-minor-wrap (buf f)
+(defun cvs-commit-minor-wrap (_buf f)
   (let ((cvs-ignore-marks-modif (cvs-mode-mark-get-modif "commit")))
     (funcall f)))
 
@@ -1598,24 +1601,25 @@ With prefix argument, prompt for cvs flags."
   (interactive (list (cvs-flags-query 'cvs-add-flags "cvs add flags")))
   (let ((fis (cvs-mode-marked 'add))
        (needdesc nil) (dirs nil))
-    ;; find directories and look for fis needing a description
+    ;; Find directories and look for fis needing a description.
     (dolist (fi fis)
       (cond
        ((file-directory-p (cvs-fileinfo->full-name fi)) (push fi dirs))
        ((eq (cvs-fileinfo->type fi) 'UNKNOWN) (setq needdesc t))))
-    ;; prompt for description if necessary
+    ;; Prompt for description if necessary.
     (let* ((msg (if (and needdesc
                         (or current-prefix-arg (not cvs-add-default-message)))
                    (read-from-minibuffer "Enter description: ")
                  (or cvs-add-default-message "")))
           (flags `("-m" ,msg ,@flags))
           (postproc
-           ;; setup postprocessing for the directory entries
+           ;; Setup postprocessing for the directory entries.
            (when dirs
-             `((cvs-run-process (list "-n" "update")
-                                ',dirs
-                                '(cvs-parse-process t))
-               (cvs-mark-fis-dead ',dirs)))))
+              (lambda ()
+                (cvs-run-process (list "-n" "update")
+                                dirs
+                                (lambda () (cvs-parse-process t)))
+               (cvs-mark-fis-dead dirs)))))
       (cvs-mode-run "add" flags fis :postproc postproc))))
 
 (defun-cvs-mode (cvs-mode-diff . DOUBLE) (flags)
@@ -1632,25 +1636,25 @@ See also `cvs-diff-ignore-marks'."
 
 (defun-cvs-mode (cvs-mode-diff-head . SIMPLE) (flags)
   "Diff the selected files against the head of the current branch.
-See ``cvs-mode-diff'' for more info."
+See `cvs-mode-diff' for more info."
   (interactive (list (cvs-flags-query 'cvs-diff-flags "cvs diff flags")))
   (cvs-mode-diff-1 (cons "-rHEAD" flags)))
 
 (defun-cvs-mode (cvs-mode-diff-repository . SIMPLE) (flags)
   "Diff the files for changes in the repository since last co/update/commit.
-See ``cvs-mode-diff'' for more info."
+See `cvs-mode-diff' for more info."
   (interactive (list (cvs-flags-query 'cvs-diff-flags "cvs diff flags")))
   (cvs-mode-diff-1 (cons "-rBASE" (cons "-rHEAD" flags))))
 
 (defun-cvs-mode (cvs-mode-diff-yesterday . SIMPLE) (flags)
   "Diff the selected files against yesterday's head of the current branch.
-See ``cvs-mode-diff'' for more info."
+See `cvs-mode-diff' for more info."
   (interactive (list (cvs-flags-query 'cvs-diff-flags "cvs diff flags")))
   (cvs-mode-diff-1 (cons "-Dyesterday" flags)))
 
 (defun-cvs-mode (cvs-mode-diff-vendor . SIMPLE) (flags)
   "Diff the selected files against the head of the vendor branch.
-See ``cvs-mode-diff'' for more info."
+See `cvs-mode-diff' for more info."
   (interactive (list (cvs-flags-query 'cvs-diff-flags "cvs diff flags")))
   (cvs-mode-diff-1 (cons (concat "-r" cvs-vendor-branch) flags)))
 
@@ -1666,10 +1670,7 @@ or \"Conflict\" in the *cvs* buffer."
         (fis (car (cvs-partition 'cvs-fileinfo->backup-file marked))))
     (unless (consp fis)
       (error "No files with a backup file selected!"))
-    ;; let's extract some info into the environment for `buffer-name'
-    (let* ((dir (cvs-fileinfo->dir (car fis)))
-          (file (cvs-fileinfo->file (car fis))))
-      (set-buffer (cvs-temp-buffer "diff")))
+    (set-buffer (cvs-temp-buffer "diff"))
     (message "cvs diff backup...")
     (cvs-execute-single-file-list fis 'cvs-diff-backup-extractor
                                  cvs-diff-program flags))
@@ -1851,15 +1852,16 @@ Signal an error if there is no backup file."
       ret)))
 
 (cl-defun cvs-mode-run (cmd flags fis
-                     &key (buf (cvs-temp-buffer))
-                          dont-change-disc cvsargs postproc)
+                        &key (buf (cvs-temp-buffer))
+                             dont-change-disc cvsargs postproc)
   "Generic cvs-mode-<foo> function.
 Executes `cvs CVSARGS CMD FLAGS FIS'.
 BUF is the buffer to be used for cvs' output.
 DONT-CHANGE-DISC non-nil indicates that the command will not change the
   contents of files.  This is only used by the parser.
-POSTPROC is a list of expressions to be evaluated at the very end (after
-  parsing if applicable).  It will be prepended with `progn' if necessary."
+POSTPROC is a function of no argument to be evaluated at the very end (after
+  parsing if applicable)."
+  (unless postproc (setq postproc #'ignore))
   (let ((def-dir default-directory))
     ;; Save the relevant buffers
     (save-some-buffers nil (lambda () (cvs-is-within-p fis def-dir))))
@@ -1878,14 +1880,17 @@ POSTPROC is a list of expressions to be evaluated at the very end (after
     (cvs-cleanup-collection cvs-cookies ;cleanup remaining messages
                            (eq cvs-auto-remove-handled 'delayed) nil t)
     (when (fboundp after-mode)
-      (setq postproc (append postproc `((,after-mode)))))
+      (setq postproc (let ((pp postproc))
+                       (lambda () (funcall pp) (funcall after-mode)))))
     (when parse
       (let ((old-fis
             (when (member cmd '("status" "update"))    ;FIXME: Yuck!!
                ;; absence of `cvs update' output has a specific meaning.
-               (or fis (list (cvs-create-fileinfo 'DIRCHANGE "" "." ""))))))
-       (push `(cvs-parse-process ',dont-change-disc nil ',old-fis) postproc)))
-    (setq postproc (if (cdr postproc) (cons 'progn postproc) (car postproc)))
+               (or fis (list (cvs-create-fileinfo 'DIRCHANGE "" "." "")))))
+            (pp postproc))
+        (setq postproc (lambda ()
+                         (cvs-parse-process dont-change-disc nil old-fis)
+                         (funcall pp)))))
     (with-current-buffer buf
       (let ((inhibit-read-only t)) (erase-buffer))
       (message "Running cvs %s ..." cmd)
@@ -1893,13 +1898,13 @@ POSTPROC is a list of expressions to be evaluated at the very end (after
 
 
 (cl-defun cvs-mode-do (cmd flags filter
-                    &key show dont-change-disc cvsargs postproc)
+                      &key show dont-change-disc cvsargs postproc)
   "Generic cvs-mode-<foo> function.
 Executes `cvs CVSARGS CMD FLAGS' on the selected files.
 FILTER is passed to `cvs-applicable-p' to only apply the command to
   files for which it makes sense.
 SHOW indicates that CMD should be not be run in the default temp buffer and
-  should be shown to the user.  The buffer and mode to be used is determined
+  should be shown to the user.  The buffer and mode to be used are determined
   by `cvs-buffer-name-alist'.
 DONT-CHANGE-DISC non-nil indicates that the command will not change the
   contents of files.  This is only used by the parser."
@@ -1915,8 +1920,11 @@ With prefix argument, prompt for cvs flags."
   (interactive (list (cvs-flags-query 'cvs-status-flags "cvs status flags")))
   (cvs-mode-do "status" flags nil :dont-change-disc t :show t
               :postproc (when (eq cvs-auto-remove-handled 'status)
-                          `((with-current-buffer ,(current-buffer)
-                              (cvs-mode-remove-handled))))))
+                           (let ((buf (current-buffer)))
+                             (lambda () (with-current-buffer buf
+                                     (cvs-mode-remove-handled)))))))
+
+(autoload 'cvs-status-cvstrees "cvs-status")
 
 (defun-cvs-mode (cvs-mode-tree . SIMPLE) (flags)
   "Call cvstree using the file under the point as a keyfile."
@@ -1924,7 +1932,7 @@ With prefix argument, prompt for cvs flags."
   (cvs-mode-run "status" (cons "-v" flags) (cvs-mode-marked nil "status")
                :buf (cvs-temp-buffer "tree")
                :dont-change-disc t
-               :postproc '((cvs-status-cvstrees))))
+               :postproc #'cvs-status-cvstrees))
 
 ;; cvs log
 
@@ -1958,18 +1966,19 @@ With a prefix argument, prompt for cvs flags."
   (cvs-mode-do "update" flags nil :cvsargs '("-n") :dont-change-disc t))
 
 
-(defun-cvs-mode cvs-mode-ignore (&optional pattern)
+(defun-cvs-mode cvs-mode-ignore ()
   "Arrange so that CVS ignores the selected files.
 This command ignores files that are not flagged as `Unknown'."
   (interactive)
   (dolist (fi (cvs-mode-marked 'ignore))
-    (cvs-append-to-ignore (cvs-fileinfo->dir fi) (cvs-fileinfo->file fi)
+    (vc-cvs-append-to-ignore (cvs-fileinfo->dir fi) (cvs-fileinfo->file fi)
                          (eq (cvs-fileinfo->subtype fi) 'NEW-DIR))
     (setf (cvs-fileinfo->type fi) 'DEAD))
   (cvs-cleanup-collection cvs-cookies nil nil nil))
 
-(declare-function vc-editable-p "vc" (file))
-(declare-function vc-checkout "vc" (file &optional writable rev))
+(define-obsolete-function-alias 'cvs-append-to-ignore 'vc-cvs-append-to-ignore
+  "24.4")
+
 
 (defun cvs-mode-find-file-other-window (e)
   "Select a buffer containing the file in another window."
@@ -1990,7 +1999,7 @@ This command ignores files that are not flagged as `Unknown'."
 
 
 (defun cvs-mode-view-file-other-window (e)
-  "View the file."
+  "View the file in another window."
   (interactive (list last-input-event))
   (cvs-mode-find-file e t t))
 
@@ -2065,8 +2074,10 @@ The file is removed and `cvs update FILE' is run."
        (cvs-mode-run "update" flags fis-other
                      :postproc
                      (when fis-removed
-                       `((with-current-buffer ,(current-buffer)
-                           (cvs-mode-run "add" nil ',fis-removed)))))))))
+                        (let ((buf (current-buffer)))
+                          (lambda ()
+                            (with-current-buffer buf
+                              (cvs-mode-run "add" nil fis-removed))))))))))
 
 
 (defun-cvs-mode (cvs-mode-revert-to-rev . NOARGS) (rev)
@@ -2077,11 +2088,14 @@ The file is removed and `cvs update FILE' is run."
               (cvs-flags-query 'cvs-idiff-version)))))
   (let* ((fis (cvs-mode-marked 'revert "revert" :file t))
         (tag (concat "tmp_pcl_tag_" (make-temp-name "")))
-        (untag `((with-current-buffer ,(current-buffer)
-                   (cvs-mode-run "tag" (list "-d" ',tag) ',fis))))
-        (update `((with-current-buffer ,(current-buffer)
-                    (cvs-mode-run "update" (list "-j" ',tag "-j" ',rev) ',fis
-                                  :postproc ',untag)))))
+         (buf (current-buffer))
+        (untag (lambda ()
+                  (with-current-buffer buf
+                   (cvs-mode-run "tag" (list "-d" tag) fis))))
+        (update (lambda ()
+                   (with-current-buffer buf
+                    (cvs-mode-run "update" (list "-j" tag "-j" rev) fis
+                                  :postproc untag)))))
     (cvs-mode-run "tag" (list tag) fis :postproc update)))
 
 
@@ -2185,7 +2199,8 @@ to use it on individual files."
 With prefix argument, prompt for cvs flags."
   (interactive
    (list (setq cvs-tag-name
-              (cvs-query-read cvs-tag-name "Tag to delete: " cvs-qtypedesc-tag))
+              (cvs-query-read cvs-tag-name "Tag to delete: "
+                               cvs-qtypedesc-tag))
         (cvs-flags-query 'cvs-tag-flags "tag flags")))
   (cvs-mode-do "tag" (append '("-d") flags (list tag))
               (when cvs-force-dir-tag 'tag)))
@@ -2194,7 +2209,7 @@ With prefix argument, prompt for cvs flags."
 ;; Byte compile files.
 
 (defun-cvs-mode cvs-mode-byte-compile-files ()
-  "Run byte-compile-file on all selected files that end in '.el'."
+  "Run byte-compile-file on all selected files with `.el' extension."
   (interactive)
   (let ((marked (cvs-get-marked (cvs-ignore-marks-p "byte-compile"))))
     (dolist (fi marked)
@@ -2203,6 +2218,7 @@ With prefix argument, prompt for cvs flags."
          (byte-compile-file filename))))))
 
 ;; ChangeLog support.
+(defvar add-log-buffer-file-name-function)
 
 (defun-cvs-mode cvs-mode-add-change-log-entry-other-window ()
   "Add a ChangeLog entry in the ChangeLog of the current directory."
@@ -2296,13 +2312,13 @@ this file, or a list of arguments to send to the program."
            (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)
            ;; `preserve-modes' avoids changing the (minor) modes.  But we
            ;; do want to reset the mode for VC, so we do it explicitly.
-           (vc-find-file-hook)
+           (vc-refresh-state)
            (when (eq (cvs-fileinfo->type fileinfo) 'CONFLICT)
              (smerge-start-session))))))))
 
 \f
 (defun cvs-change-cvsroot (newroot)
-  "Change the cvsroot."
+  "Change the CVSROOT."
   (interactive "DNew repository: ")
   (if (or (file-directory-p (expand-file-name "CVSROOT" newroot))
          (y-or-n-p (concat "Warning: no CVSROOT found inside repository."
@@ -2328,7 +2344,7 @@ Sensible values are `cvs-examine', `cvs-status' and `cvs-quickdir'."
 (defcustom cvs-dired-use-hook '(4)
   "Whether or not opening a CVS directory should run PCL-CVS.
 A value of nil means never do it.
-ALWAYS means to always do it unless a prefix argument is given to the
+`always' means to always do it unless a prefix argument is given to the
   command that prompted the opening of the directory.
 Anything else means to do it only if the prefix arg is equal to this value."
   :group 'pcl-cvs
@@ -2387,9 +2403,9 @@ The exact behavior is determined also by `cvs-dired-use-hook'."
                         (goto-char (point-min))
                         (looking-at ".*to add this file permanently\n\\'"))
                 (dolist (file (if (listp files) files (list files)))
-                  (insert "cvs add: scheduling file `"
-                          (file-name-nondirectory file)
-                          "' for addition\n")))
+                  (insert (format-message
+                          "cvs add: scheduling file `%s' for addition\n"
+                          (file-name-nondirectory file)))))
              ;; VC never (?) does `cvs -n update' so dcd=nil
              ;; should probably always be the right choice.
              (cvs-parse-process nil subdir))))))))