view lisp/pcmpl-cvs.el @ 65342:c71b1b2d2d04

Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-530 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 106-111) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-09-05 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/message.el (message-tab-body-function): Fixed mismatched custom type. * lisp/gnus/gnus.el (gnus-group-change-level-function): Ditto. * lisp/gnus/gnus-msg.el (gnus-outgoing-message-group): Ditto. * lisp/gnus/gnus-art.el (gnus-signature-limit) (gnus-article-mime-part-function): Ditto. 2005-09-04 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/nnweb.el (nnweb-type-definition, nnweb-google-wash-article): Make fetching article by MID work again for Google Groups. Added FIXME concerning gnus-group-make-web-group. * lisp/gnus/mml-smime.el (mml-smime-sign-query, mml-smime-get-dns-cert): Don't depend on Gnus by using mail-extract-address-components if gnus-extract-address-components is not bound. * lisp/gnus/gnus.el (gnus-user-agent): Use list of symbols instead of symbols. Display full version number for (S)XEmacs. Optionally display (S)XEmacs codename. * lisp/gnus/gnus-util.el (gnus-emacs-version): Update for new `gnus-user-agent'. * lisp/gnus/gnus-msg.el (gnus-extended-version): Make it possible to omit Gnus version. 2005-09-02 Hrvoje Niksic <hniksic@xemacs.org> * lisp/gnus/mm-encode.el (mm-encode-content-transfer-encoding): Likewise when encoding. * lisp/gnus/mm-bodies.el (mm-decode-content-transfer-encoding): De-canonicalize CRLF for all text content types, not just text/plain. 2005-09-02 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-sum.el (gnus-thread-hide-subtree): Doc fix. * lisp/gnus/gnus-msg.el (gnus-inews-insert-gcc): Fix the mistake of using list, not listp. 2005-08-29 Romain Francoise <romain@orebokech.com> * lisp/gnus/gnus-fun.el (gnus-convert-image-to-face-command): Fix typo in docstring. (gnus-face-from-file): Likewise. 2005-08-31 Juanma Barranquero <lekktu@gmail.com> * lisp/gnus/gnus-art.el (w3m-minor-mode-map): * lisp/gnus/gnus-spec.el (gnus-newsrc-file-version): * lisp/gnus/gnus-util.el (nnmail-active-file-coding-system) (gnus-original-article-buffer, gnus-user-agent): * lisp/gnus/gnus.el (gnus-ham-process-destinations) (gnus-parameter-ham-marks-alist) (gnus-parameter-spam-marks-alist, gnus-spam-autodetect) (gnus-spam-autodetect-methods, gnus-spam-newsgroup-contents) (gnus-spam-process-destinations, gnus-spam-process-newsgroups): * lisp/gnus/mm-decode.el (gnus-current-window-configuration): * lisp/gnus/mm-extern.el (gnus-article-mime-handles): * lisp/gnus/mm-url.el (url-current-object, url-package-name) (url-package-version): * lisp/gnus/mm-view.el (gnus-article-mime-handles, gnus-newsgroup-charset) (smime-keys, w3m-cid-retrieve-function-alist) (w3m-current-buffer, w3m-display-inline-images) (w3m-minor-mode-map): * lisp/gnus/mml-smime.el (gnus-extract-address-components): * lisp/gnus/mml.el (gnus-article-mime-handles, gnus-mouse-2) (gnus-newsrc-hashtb, message-default-charset) (message-deletable-headers, message-options) (message-posting-charset, message-required-mail-headers) (message-required-news-headers): * lisp/gnus/mml1991.el (mc-pgp-always-sign): * lisp/gnus/mml2015.el (mc-pgp-always-sign): * lisp/gnus/nnheader.el (nnmail-extra-headers): * lisp/gnus/rfc1843.el (gnus-decode-encoded-word-function) (gnus-decode-header-function, gnus-newsgroup-name): * lisp/gnus/spam-stat.el (gnus-original-article-buffer): Add defvars.
author Miles Bader <miles@gnu.org>
date Mon, 05 Sep 2005 23:58:09 +0000
parents 41bb365f41c4
children 3bd95f4f2941 2d92f5c9d6ae
line wrap: on
line source

;;; pcmpl-cvs.el --- functions for dealing with cvs completions

;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
;;   2005 Free Software Foundation, Inc.

;; Author: John Wiegley <johnw@gnu.org>

;; This file is part of GNU Emacs.

;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; These functions provide completion rules for the `cvs' tool.

;;; Code:

(provide 'pcmpl-cvs)

(require 'pcomplete)
(require 'executable)

(defgroup pcmpl-cvs nil
  "Functions for dealing with CVS completions."
  :group 'pcomplete)

;; User Variables:

(defcustom pcmpl-cvs-binary (or (executable-find "cvs") "cvs")
  "*The full path of the 'cvs' binary."
  :type 'file
  :group 'pcmpl-cvs)

;; Functions:

;;;###autoload
(defun pcomplete/cvs ()
  "Completion rules for the `cvs' command."
  (let ((pcomplete-help "(cvs)Invoking CVS"))
    (pcomplete-opt "HQqrwlntvfab/T/e*d/z?s")
    (pcomplete-here* (pcmpl-cvs-commands))
    (cond ((pcomplete-test "add")
	   (setq pcomplete-help "(cvs)Adding files")
	   (pcomplete-opt "k?m?")
	   (while (pcomplete-here (pcmpl-cvs-entries '(??)))))
	  ((pcomplete-test "remove")
	   (setq pcomplete-help "(cvs)Removing files")
	   (pcomplete-opt "flR")
	   (while (pcomplete-here (pcmpl-cvs-entries '(?U)))))
	  ((pcomplete-test "init")
	   (setq pcomplete-help "(cvs)Creating a repository"))
	  ((pcomplete-test '("login" "logout"))
	   (setq pcomplete-help "(cvs)Password authentication client"))
	  ((pcomplete-test "import")
	   (setq pcomplete-help "(cvs)import")
	   (pcomplete-opt "dk?I(pcmpl-cvs-entries '(??))b?m?W?"))
	  ((pcomplete-test "checkout")
	   (setq pcomplete-help "(cvs)checkout")
	   (pcomplete-opt "ANPRcflnpsr?D?d/k?j?")
	   (pcomplete-here (pcmpl-cvs-modules)))
	  ((pcomplete-test "rtag")
	   (setq pcomplete-help "(cvs)Creating a branch")
	   (pcomplete-opt "aflRndbr?DF")
	   (pcomplete-here (pcmpl-cvs-modules)))
	  ((pcomplete-test "release")
	   (setq pcomplete-help "(cvs)release")
	   (pcomplete-opt "d")
	   (while (pcomplete-here (pcomplete-dirs))))
	  ((pcomplete-test "export")
	   (setq pcomplete-help "(cvs)export")
	   (pcomplete-opt "NflRnr?D?d/k?")
	   (pcomplete-here (pcmpl-cvs-modules)))
	  ((pcomplete-test "commit")
	   (setq pcomplete-help "(cvs)commit files")
	   (pcomplete-opt "nRlfF.m?r(pcmpl-cvs-tags '(?M ?R ?A))")
	   (while (pcomplete-here (pcmpl-cvs-entries '(?M ?R ?A)))))
	  ((pcomplete-test "diff")
	   (setq pcomplete-help "(cvs)Viewing differences")
	   (let ((opt-index pcomplete-index)
		 saw-backdate)
	     (pcomplete-opt "lRD?Nr(pcmpl-cvs-tags)")
	     (while (< opt-index pcomplete-index)
	       (if (pcomplete-match "^-[Dr]" (- pcomplete-index opt-index))
		   (setq saw-backdate t opt-index pcomplete-index)
		 (setq opt-index (1+ opt-index))))
	     (while (pcomplete-here
		     (pcmpl-cvs-entries (unless saw-backdate '(?M)))))))
	  ((pcomplete-test "unedit")
	   (setq pcomplete-help "(cvs)Editing files")
	   (pcomplete-opt "lR")
	   (while (pcomplete-here (pcmpl-cvs-entries '(?M ?R ?A)))))
	  ((pcomplete-test "update")
	   (setq pcomplete-help "(cvs)update")
	   (pcomplete-opt
	    (concat "APdflRpk?r(pcmpl-cvs-tags '(?U ?P))D?"
		    "j(pcmpl-cvs-tags '(?U ?P))"
		    "I(pcmpl-cvs-entries '(??))W?"))
	   (while (pcomplete-here (pcmpl-cvs-entries '(?U ?P)))))
	  (t
	   (while (pcomplete-here (pcmpl-cvs-entries)))))))

(defun pcmpl-cvs-commands ()
  "Return a list of available CVS commands."
  (with-temp-buffer
    (call-process pcmpl-cvs-binary nil t nil "--help-commands")
    (goto-char (point-min))
    (let (cmds)
      (while (re-search-forward "^\\s-+\\([a-z]+\\)" nil t)
	(setq cmds (cons (match-string 1) cmds)))
      (pcomplete-uniqify-list cmds))))

(defun pcmpl-cvs-modules ()
  "Return a list of available modules under CVS."
  (with-temp-buffer
    (call-process pcmpl-cvs-binary nil t nil "checkout" "-c")
    (goto-char (point-min))
    (let (entries)
      (while (re-search-forward "\\(\\S-+\\)$" nil t)
	(setq entries (cons (match-string 1) entries)))
      (pcomplete-uniqify-list entries))))

(defun pcmpl-cvs-tags (&optional opers)
  "Return all the tags which could apply to the files related to OPERS."
  (let ((entries (pcmpl-cvs-entries opers))
	tags)
    (with-temp-buffer
      (apply 'call-process pcmpl-cvs-binary nil t nil
	     "status" "-v" entries)
      (goto-char (point-min))
      (while (re-search-forward "Existing Tags:" nil t)
	(forward-line)
	(while (not (looking-at "^$"))
	  (unless (looking-at "^\\s-+\\(\\S-+\\)\\s-+")
	    (error "Error in output from `cvs status -v'"))
	  (setq tags (cons (match-string 1) tags))
	  (forward-line))))
    (pcomplete-uniqify-list tags)))

(defun pcmpl-cvs-entries (&optional opers)
  "Return the Entries for the current directory.
If OPERS is a list of characters, return entries for which that
operation character applies, as displayed by 'cvs -n update'."
  (let* ((arg (pcomplete-arg))
	 (dir (file-name-as-directory
	       (or (file-name-directory arg) "")))
	 (nondir (or (file-name-nondirectory arg) ""))
	 entries)
    (if opers
	(with-temp-buffer
	  (and dir (cd dir))
	  (call-process pcmpl-cvs-binary nil t nil
			"-q" "-n" "-f" "update"); "-l")
	  (goto-char (point-min))
	  (while (re-search-forward "^\\(.\\) \\(.+\\)$" nil t)
	    (if (memq (string-to-char (match-string 1)) opers)
		(setq entries (cons (match-string 2) entries)))))
      (with-temp-buffer
	(insert-file-contents (concat dir "CVS/Entries"))
	(goto-char (point-min))
	(while (not (eobp))
	  (let* ((line (buffer-substring (line-beginning-position)
					 (line-end-position)))
		 (fields (split-string line "/"))
		 text)
	    (if (eq (aref line 0) ?/)
		(setq fields (cons "" fields)))
	    (setq text (nth 1 fields))
	    (when text
	      (if (string= (nth 0 fields) "D")
		  (setq text (file-name-as-directory text)))
	      (setq entries (cons text entries))))
	  (forward-line))))
    (setq pcomplete-stub nondir)
    (pcomplete-uniqify-list entries)))

;;; arch-tag: d2aeac43-4bf5-4509-a496-74b863c6642b
;;; pcmpl-cvs.el ends here