;;; pcvs-util.el --- utility functions for PCL-CVS -*- byte-compile-dynamic: t -*-
;; Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-;; 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
+;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
-;; Author: Stefan Monnier <monnier@cs.yale.edu>
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; Keywords: pcl-cvs
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; 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.
+;; the Free Software Foundation, either version 3 of the License, 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
;; 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.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
(unless (member x ys) (push x zs)))))
(defun cvs-map (-cvs-map-f &rest -cvs-map-ls)
- (unless (cvs-every 'null -cvs-map-ls)
- (cons (apply -cvs-map-f (mapcar 'car -cvs-map-ls))
- (apply 'cvs-map -cvs-map-f (mapcar 'cdr -cvs-map-ls)))))
+ (let ((accum ()))
+ (while (not (cvs-every 'null -cvs-map-ls))
+ (push (apply -cvs-map-f (mapcar 'car -cvs-map-ls)) accum)
+ (setq -cvs-map-ls (mapcar 'cdr -cvs-map-ls)))
+ (nreverse accum)))
(defun cvs-first (l &optional n)
(if (null n) (car l)
In such a case, the search for another buffer with the same name doesn't
use the buffer name but the buffer's `list-buffers-directory' variable.
If NOREUSE is non-nil, always return a new buffer."
- (or (and (not (file-name-absolute-p name)) (get-buffer-create name))
+ (or (and (not (file-name-absolute-p name))
+ (if noreuse (generate-new-buffer name)
+ (get-buffer-create name)))
(unless noreuse
(dolist (buf (buffer-list))
(with-current-buffer buf
(when (equal name list-buffers-directory)
(return buf)))))
(with-current-buffer (create-file-buffer name)
- (set (make-local-variable 'list-buffers-directory) name)
+ (setq list-buffers-directory name)
(current-buffer))))
;;;;
(setq tab-width colwidth)
;; The insertion should be "sensible" no matter what choices were made.
(dolist (str strings)
- (unless (bolp) (insert " \t"))
- (when (< wwidth (+ (max colwidth (length str)) (current-column)))
- (delete-char -2) (insert "\n"))
- (insert str)))))
+ (unless (bolp)
+ (insert " \t")
+ (when (< wwidth (+ (max colwidth (length str)) (current-column)))
+ (delete-char -2) (insert "\n")))
+ (insert str)))))
(defun cvs-file-to-string (file &optional oneline args)
"Tell whether STR1 is a prefix of STR2."
(eq t (compare-strings str2 nil (length str1) str1 nil nil)))
-;; (string->strings (strings->string X)) == X
-(defun cvs-strings->string (strings &optional separator)
- "Concatenate the STRINGS, adding the SEPARATOR (default \" \").
-This tries to quote the strings to avoid ambiguity such that
- (cvs-string->strings (cvs-strings->string strs)) == strs
-Only some SEPARATOR will work properly."
- (let ((sep (or separator " ")))
- (mapconcat
- (lambda (str)
- (if (string-match "[\\\"]" str)
- (concat "\"" (replace-regexp-in-string "[\\\"]" "\\\\\\&" str) "\"")
- str))
- strings sep)))
-
-;; (string->strings (strings->string X)) == X
-(defun cvs-string->strings (string &optional separator)
- "Split the STRING into a list of strings.
-It understands elisp style quoting within STRING such that
- (cvs-string->strings (cvs-strings->string strs)) == strs
-The SEPARATOR regexp defaults to \"\\s-+\"."
- (let ((sep (or separator "\\s-+"))
- (i (string-match "[\"]" string)))
- (if (null i) (split-string string sep t) ; no quoting: easy
- (append (unless (eq i 0) (split-string (substring string 0 i) sep t))
- (let ((rfs (read-from-string string i)))
- (cons (car rfs)
- (cvs-string->strings (substring string (cdr rfs))
- sep)))))))
-
;;;;
;;;; file names
;;;;
(defconst cvs-qtypedesc-string1 (cvs-qtypedesc-create 'identity 'identity t))
(defconst cvs-qtypedesc-string (cvs-qtypedesc-create 'identity 'identity))
(defconst cvs-qtypedesc-strings
- (cvs-qtypedesc-create 'cvs-string->strings 'cvs-strings->string nil))
+ (cvs-qtypedesc-create 'split-string-and-unquote
+ 'combine-and-quote-strings nil))
(defun cvs-query-read (default prompt qtypedesc &optional hist-sym)
(let* ((qtypedesc (or qtypedesc cvs-qtypedesc-strings))
(defun cvs-flags-query (sym &optional desc arg)
"Query flags based on SYM.
-Optional argument DESC will be used for the prompt
+Optional argument DESC will be used for the prompt.
If ARG (or a prefix argument) is nil, just use the 0th default.
If it is a non-negative integer, use the corresponding default.
If it is a negative integer query for a new value of the corresponding
and reset the persistence."
(let* ((prefix (symbol-value (cvs-prefix-sym sym)))
(numarg (if (integerp arg) arg 0))
- (defs (cvs-flags-defaults prefix)))
+ ;; (defs (cvs-flags-defaults prefix))
+ )
;; set persistence if requested
(when (> (prefix-numeric-value arg) 9)
(defun cvs-prefix-get (sym &optional read-only)
"Return the current value of the prefix SYM.
-and reset it unless READ-ONLY is non-nil."
+And reset it unless READ-ONLY is non-nil."
(prog1 (symbol-value sym)
(unless (or read-only
(cvs-flags-persist (symbol-value (cvs-prefix-sym sym))))