:group 'tools)
(defcustom vc-suppress-confirm nil
- "*If non-nil, treat user as expert; suppress yes-no prompts on some things."
+ "If non-nil, treat user as expert; suppress yes-no prompts on some things."
:type 'boolean
:group 'vc)
(defcustom vc-delete-logbuf-window t
- "*If non-nil, delete the *VC-log* buffer and window after each logical action.
+ "If non-nil, delete the *VC-log* buffer and window after each logical action.
If nil, bury that buffer instead.
This is most useful if you have multiple windows on a frame and would like to
preserve the setting."
:group 'vc)
(defcustom vc-initial-comment nil
- "*If non-nil, prompt for initial comment when a file is registered."
+ "If non-nil, prompt for initial comment when a file is registered."
:type 'boolean
:group 'vc)
(defcustom vc-default-init-version "1.1"
- "*A string used as the default version number when a new file is registered.
+ "A string used as the default version number when a new file is registered.
This can be overridden by giving a prefix argument to \\[vc-register]. This
can also be overridden by a particular VC backend."
:type 'string
:version "20.3")
(defcustom vc-command-messages nil
- "*If non-nil, display run messages from back-end commands."
+ "If non-nil, display run messages from back-end commands."
:type 'boolean
:group 'vc)
(defcustom vc-checkin-switches nil
- "*A string or list of strings specifying extra switches for checkin.
+ "A string or list of strings specifying extra switches for checkin.
These are passed to the checkin program by \\[vc-checkin]."
:type '(choice (const :tag "None" nil)
(string :tag "Argument String")
:group 'vc)
(defcustom vc-checkout-switches nil
- "*A string or list of strings specifying extra switches for checkout.
+ "A string or list of strings specifying extra switches for checkout.
These are passed to the checkout program by \\[vc-checkout]."
:type '(choice (const :tag "None" nil)
(string :tag "Argument String")
:group 'vc)
(defcustom vc-register-switches nil
- "*A string or list of strings; extra switches for registering a file.
+ "A string or list of strings; extra switches for registering a file.
These are passed to the checkin program by \\[vc-register]."
:type '(choice (const :tag "None" nil)
(string :tag "Argument String")
:group 'vc)
(defcustom vc-dired-listing-switches "-al"
- "*Switches passed to `ls' for vc-dired. MUST contain the `l' option."
+ "Switches passed to `ls' for vc-dired. MUST contain the `l' option."
:type 'string
:group 'vc
:version "21.1")
(defcustom vc-dired-recurse t
- "*If non-nil, show directory trees recursively in VC Dired."
+ "If non-nil, show directory trees recursively in VC Dired."
:type 'boolean
:group 'vc
:version "20.3")
(defcustom vc-dired-terse-display t
- "*If non-nil, show only locked files in VC Dired."
+ "If non-nil, show only locked files in VC Dired."
:type 'boolean
:group 'vc
:version "20.3")
(defcustom vc-directory-exclusion-list '("SCCS" "RCS" "CVS" "MCVS" ".svn" "{arch}")
- "*List of directory names to be ignored when walking directory trees."
+ "List of directory names to be ignored when walking directory trees."
:type '(repeat string)
:group 'vc)
(defcustom vc-diff-switches nil
- "*A string or list of strings specifying switches for diff under VC.
+ "A string or list of strings specifying switches for diff under VC.
When running diff under a given BACKEND, VC concatenates the values of
`diff-switches', `vc-diff-switches', and `vc-BACKEND-diff-switches' to
get the switches for that command. Thus, `vc-diff-switches' should
:version "21.1")
(defcustom vc-allow-async-revert nil
- "*Specifies whether the diff during \\[vc-revert-buffer] may be asynchronous.
+ "Specifies whether the diff during \\[vc-revert-buffer] may be asynchronous.
Enabling this option means that you can confirm a revert operation even
if the local changes in the file have not been found and displayed yet."
:type '(choice (const :tag "No" nil)
;;;###autoload
(defcustom vc-checkout-hook nil
- "*Normal hook (list of functions) run after checking out a file.
+ "Normal hook (list of functions) run after checking out a file.
See `run-hooks'."
:type 'hook
:group 'vc
;;;###autoload
(defcustom vc-checkin-hook nil
- "*Normal hook (list of functions) run after a checkin is done.
+ "Normal hook (list of functions) run after a checkin is done.
See also `log-edit-done-hook'."
:type 'hook
:options '(log-edit-comment-to-change-log)
;;;###autoload
(defcustom vc-before-checkin-hook nil
- "*Normal hook (list of functions) run before a file is checked in.
+ "Normal hook (list of functions) run before a file is checked in.
See `run-hooks'."
:type 'hook
:group 'vc)
(defcustom vc-logentry-check-hook nil
- "*Normal hook run by `vc-backend-logentry-check'.
+ "Normal hook run by `vc-backend-logentry-check'.
Use this to impose your own rules on the entry in addition to any the
version control backend imposes itself."
:type 'hook
(300. . "#00CCFF")
(320. . "#00CC99")
(340. . "#0099FF"))
- "*Association list of age versus color, for \\[vc-annotate].
+ "Association list of age versus color, for \\[vc-annotate].
Ages are given in units of fractional days. Default is eighteen steps
using a twenty day increment."
:type 'alist
:group 'vc)
(defcustom vc-annotate-very-old-color "#0046FF"
- "*Color for lines older than the current color range in \\[vc-annotate]]."
+ "Color for lines older than the current color range in \\[vc-annotate]]."
:type 'string
:group 'vc)
(defcustom vc-annotate-background "black"
- "*Background color for \\[vc-annotate].
+ "Background color for \\[vc-annotate].
Default color is used if nil."
:type 'string
:group 'vc)
(defcustom vc-annotate-menu-elements '(2 0.5 0.1 0.01)
- "*Menu elements for the mode-specific menu of VC-Annotate mode.
+ "Menu elements for the mode-specific menu of VC-Annotate mode.
List of factors, used to expand/compress the time scale. See `vc-annotate'."
:type '(repeat number)
:group 'vc)
(defvar vc-annotate-mode-map
(let ((m (make-sparse-keymap)))
(define-key m [menu-bar] (make-sparse-keymap "VC-Annotate"))
+ (define-key m "A" 'vc-annotate-revision-previous-to-line)
+ (define-key m "D" 'vc-annotate-show-diff-revision-at-line)
+ (define-key m "J" 'vc-annotate-revision-at-line)
+ (define-key m "L" 'vc-annotate-show-log-revision-at-line)
+ (define-key m "N" 'vc-annotate-next-version)
+ (define-key m "P" 'vc-annotate-prev-version)
+ (define-key m "W" 'vc-annotate-workfile-version)
m)
"Local keymap used for VC-Annotate mode.")
-(define-key vc-annotate-mode-map "A" 'vc-annotate-revision-previous-to-line)
-(define-key vc-annotate-mode-map "D" 'vc-annotate-show-diff-revision-at-line)
-(define-key vc-annotate-mode-map "J" 'vc-annotate-revision-at-line)
-(define-key vc-annotate-mode-map "L" 'vc-annotate-show-log-revision-at-line)
-(define-key vc-annotate-mode-map "N" 'vc-annotate-next-version)
-(define-key vc-annotate-mode-map "P" 'vc-annotate-prev-version)
-(define-key vc-annotate-mode-map "W" 'vc-annotate-workfile-version)
-
(defvar vc-annotate-mode-menu nil
"Local keymap used for VC-Annotate mode's menu bar menu.")
;; Header-insertion hair
(defcustom vc-static-header-alist
- '(("\\.c$" .
+ '(("\\.c\\'" .
"\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n#endif /* lint */\n"))
"*Associate static header string templates with file types.
A \%s in the template is replaced with the first string associated with
;; Variables the user doesn't need to know about.
(defvar vc-log-operation nil)
(defvar vc-log-after-operation-hook nil)
-(defvar vc-annotate-buffers nil
- "Alist of current \"Annotate\" buffers and their corresponding backends.
-The keys are \(BUFFER . BACKEND\). See also `vc-annotate-get-backend'.")
+
;; In a log entry buffer, this is a local variable
;; that points to the buffer for which it was made
;; (either a file, or a VC dired buffer).
;; These functions help the vc-next-action entry point
+(defun vc-default-init-version (backend) vc-default-init-version)
+
;;;###autoload
(defun vc-register (&optional set-version comment)
"Register the current file into a version control system.
(if set-version
(read-string (format "Initial version level for %s: "
(buffer-name)))
- (let ((backend (vc-responsible-backend buffer-file-name)))
- (if (vc-find-backend-function backend 'init-version)
- (vc-call-backend backend 'init-version)
- vc-default-init-version)))
+ (vc-call-backend (vc-responsible-backend buffer-file-name)
+ 'init-version))
(or comment (not vc-initial-comment))
nil
"Enter initial comment."
(widen)
(if (or (not (vc-check-headers))
(y-or-n-p "Version headers already exist. Insert another set? "))
- (progn
- (let* ((delims (cdr (assq major-mode vc-comment-alist)))
- (comment-start-vc (or (car delims) comment-start "#"))
- (comment-end-vc (or (car (cdr delims)) comment-end ""))
- (hdsym (vc-make-backend-sym (vc-backend buffer-file-name)
- 'header))
- (hdstrings (and (boundp hdsym) (symbol-value hdsym))))
- (mapcar (lambda (s)
- (insert comment-start-vc "\t" s "\t"
- comment-end-vc "\n"))
- hdstrings)
- (if vc-static-header-alist
- (mapcar (lambda (f)
- (if (string-match (car f) buffer-file-name)
- (insert (format (cdr f) (car hdstrings)))))
- vc-static-header-alist))
- )
- )))))
+ (let* ((delims (cdr (assq major-mode vc-comment-alist)))
+ (comment-start-vc (or (car delims) comment-start "#"))
+ (comment-end-vc (or (car (cdr delims)) comment-end ""))
+ (hdsym (vc-make-backend-sym (vc-backend buffer-file-name)
+ 'header))
+ (hdstrings (and (boundp hdsym) (symbol-value hdsym))))
+ (dolist (s hdstrings)
+ (insert comment-start-vc "\t" s "\t"
+ comment-end-vc "\n"))
+ (if vc-static-header-alist
+ (dolist (f vc-static-header-alist)
+ (if (string-match (car f) buffer-file-name)
+ (insert (format (cdr f) (car hdstrings)))))))))))
(defun vc-clear-headers (&optional file)
"Clear all version headers in the current buffer (or FILE).
(concat odefault f))))
files)))
"done"
- (pop-to-buffer
- (set-buffer (get-buffer-create "*vc*")))
+ (pop-to-buffer (get-buffer-create "*vc*"))
(erase-buffer)
(insert-file-contents tempfile)
"failed"))
;; annotate-mode, which replaces it with the more sensible "span-to
;; days", along with autoscaling support.
(defvar vc-annotate-ratio nil "Global variable.")
-(defvar vc-annotate-backend nil "Global variable.")
;; internal buffer-local variables
+(defvar vc-annotate-backend nil)
(defvar vc-annotate-parent-file nil)
(defvar vc-annotate-parent-rev nil)
(defvar vc-annotate-parent-display-mode nil)
;; The fontification is done by vc-annotate-lines instead of font-lock.
'((vc-annotate-lines)))
-(defun vc-annotate-get-backend (buffer)
- "Return the backend matching \"Annotate\" buffer BUFFER.
-Return nil if no match made. Associations are made based on
-`vc-annotate-buffers'."
- (cdr (assoc buffer vc-annotate-buffers)))
-
(define-derived-mode vc-annotate-mode fundamental-mode "Annotate"
"Major mode for output buffers of the `vc-annotate' command.
(set (make-local-variable 'truncate-lines) t)
(set (make-local-variable 'font-lock-defaults)
'(vc-annotate-font-lock-keywords t))
- (view-mode 1)
- (vc-annotate-add-menu))
+ (view-mode 1))
(defun vc-annotate-display-default (&optional ratio)
"Display the output of \\[vc-annotate] using the default color range.
(format "Spanned to %.1f days old" (- current oldest))))))
;; Menu -- Using easymenu.el
-(defun vc-annotate-add-menu ()
- "Add the menu 'Annotate' to the menu bar in VC-Annotate mode."
- (let ((menu-elements vc-annotate-menu-elements)
- (menu-def
- '("VC-Annotate"
- ["Default" (unless (null vc-annotate-display-mode)
- (setq vc-annotate-display-mode nil)
- (vc-annotate-display-select))
- :style toggle :selected (null vc-annotate-display-mode)]))
- (oldest-in-map (vc-annotate-car-last-cons vc-annotate-color-map)))
- (while menu-elements
- (let* ((element (car menu-elements))
- (days (* element oldest-in-map)))
- (setq menu-elements (cdr menu-elements))
- (setq menu-def
- (append menu-def
- `([,(format "Span %.1f days" days)
- (unless (and (numberp vc-annotate-display-mode)
- (= vc-annotate-display-mode ,days))
- (vc-annotate-display-select nil ,days))
- :style toggle :selected
- (and (numberp vc-annotate-display-mode)
- (= vc-annotate-display-mode ,days)) ])))))
- (setq menu-def
- (append menu-def
- (list
- ["Span ..."
- (let ((days
- (float (string-to-number
- (read-string "Span how many days? ")))))
- (vc-annotate-display-select nil days)) t])
- (list "--")
- (list
- ["Span to Oldest"
- (unless (eq vc-annotate-display-mode 'scale)
- (vc-annotate-display-select nil 'scale))
- :style toggle :selected
- (eq vc-annotate-display-mode 'scale)])
- (list
- ["Span Oldest->Newest"
- (unless (eq vc-annotate-display-mode 'fullscale)
- (vc-annotate-display-select nil 'fullscale))
- :style toggle :selected
- (eq vc-annotate-display-mode 'fullscale)])
- (list "--")
- (list ["Annotate previous revision"
- (call-interactively 'vc-annotate-prev-version)])
- (list ["Annotate next revision"
- (call-interactively 'vc-annotate-next-version)])
- (list ["Annotate revision at line"
- (vc-annotate-revision-at-line)])
- (list ["Annotate revision previous to line"
- (vc-annotate-revision-previous-to-line)])
- (list ["Annotate latest revision"
- (vc-annotate-workfile-version)])
- (list ["Show log of revision at line"
- (vc-annotate-show-log-revision-at-line)])
- (list ["Show diff of revision at line"
- (vc-annotate-show-diff-revision-at-line)])))
-
- ;; Define the menu
- (if (or (featurep 'easymenu) (load "easymenu" t))
- (easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map
- "VC Annotate Display Menu" menu-def))))
+(easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map
+ "VC Annotate Display Menu"
+ `("VC-Annotate"
+ ["Default" (unless (null vc-annotate-display-mode)
+ (setq vc-annotate-display-mode nil)
+ (vc-annotate-display-select))
+ :style toggle :selected (null vc-annotate-display-mode)]
+ ,@(let ((oldest-in-map (vc-annotate-car-last-cons vc-annotate-color-map)))
+ (mapcar (lambda (element)
+ (let ((days (* element oldest-in-map)))
+ `([,(format "Span %.1f days" days)
+ (unless (and (numberp vc-annotate-display-mode)
+ (= vc-annotate-display-mode ,days))
+ (vc-annotate-display-select nil ,days))
+ :style toggle :selected
+ (and (numberp vc-annotate-display-mode)
+ (= vc-annotate-display-mode ,days)) ])))
+ vc-annotate-menu-elements))
+ ["Span ..."
+ (let ((days
+ (float (string-to-number
+ (read-string "Span how many days? ")))))
+ (vc-annotate-display-select nil days)) t]
+ "--"
+ ["Span to Oldest"
+ (unless (eq vc-annotate-display-mode 'scale)
+ (vc-annotate-display-select nil 'scale))
+ :style toggle :selected
+ (eq vc-annotate-display-mode 'scale)]
+ ["Span Oldest->Newest"
+ (unless (eq vc-annotate-display-mode 'fullscale)
+ (vc-annotate-display-select nil 'fullscale))
+ :style toggle :selected
+ (eq vc-annotate-display-mode 'fullscale)]
+ "--"
+ ["Annotate previous revision" vc-annotate-prev-version]
+ ["Annotate next revision" vc-annotate-next-version]
+ ["Annotate revision at line" vc-annotate-revision-at-line]
+ ["Annotate revision previous to line" vc-annotate-revision-previous-to-line]
+ ["Annotate latest revision" vc-annotate-workfile-version]
+ ["Show log of revision at line" vc-annotate-show-log-revision-at-line]
+ ["Show diff of revision at line" vc-annotate-show-diff-revision-at-line]))
(defun vc-annotate-display-select (&optional buffer mode)
"Highlight the output of \\[vc-annotate].
;;;; the contents in BUFFER.
;;;###autoload
-(defun vc-annotate (prefix &optional revision display-mode)
+(defun vc-annotate (file rev &optional display-mode buf)
"Display the edit history of the current file using colors.
This command creates a buffer that shows, for each line of the current
mode-specific menu. `vc-annotate-color-map' and
`vc-annotate-very-old-color' defines the mapping of time to
colors. `vc-annotate-background' specifies the background color."
- (interactive "P")
+ (interactive
+ (save-current-buffer
+ (vc-ensure-vc-buffer)
+ (list buffer-file-name
+ (let ((def (vc-workfile-version buffer-file-name)))
+ (if (null current-prefix-arg) def
+ (read-string
+ (format "Annotate from version (default %s): " def)
+ nil nil def)))
+ (if (null current-prefix-arg)
+ vc-annotate-display-mode
+ (float (string-to-number
+ (read-string "Annotate span days (default 20): "
+ nil nil "20")))))))
(vc-ensure-vc-buffer)
- (let* ((temp-buffer-name nil)
- (temp-buffer-show-function 'vc-annotate-display-select)
- (rev (or revision (vc-workfile-version buffer-file-name)))
- (bfn buffer-file-name)
- (vc-annotate-version
- (if prefix (read-string
- (format "Annotate from version (default %s): " rev)
- nil nil rev)
- rev)))
- (if display-mode
- (setq vc-annotate-display-mode display-mode)
- (if prefix
- (setq vc-annotate-display-mode
- (float (string-to-number
- (read-string "Annotate span days (default 20): "
- nil nil "20"))))))
- (setq temp-buffer-name (format "*Annotate %s (rev %s)*"
- (buffer-name) vc-annotate-version))
- (setq vc-annotate-backend (vc-backend buffer-file-name))
+ (setq vc-annotate-display-mode display-mode) ;Not sure why. --Stef
+ (let* ((temp-buffer-name (format "*Annotate %s (rev %s)*" (buffer-name) rev))
+ (temp-buffer-show-function 'vc-annotate-display-select))
(message "Annotating...")
+ ;; If BUF is specified it tells in which buffer we should put the
+ ;; annotations. This is used when switching annotations to another
+ ;; revision, so we should update the buffer's name.
+ (if buf (with-current-buffer buf
+ (rename-buffer temp-buffer-name t)
+ ;; In case it had to be uniquified.
+ (setq temp-buffer-name (buffer-name))))
(if (not (vc-find-backend-function vc-annotate-backend 'annotate-command))
(error "Sorry, annotating is not implemented for %s"
vc-annotate-backend))
(with-output-to-temp-buffer temp-buffer-name
- (vc-call-backend vc-annotate-backend 'annotate-command
- buffer-file-name
- (get-buffer temp-buffer-name)
- vc-annotate-version))
- (save-excursion
- (set-buffer temp-buffer-name)
- (set (make-local-variable 'vc-annotate-parent-file) bfn)
- (set (make-local-variable 'vc-annotate-parent-rev) vc-annotate-version)
+ (vc-call annotate-command file (get-buffer temp-buffer-name) rev))
+ (with-current-buffer temp-buffer-name
+ (set (make-local-variable 'vc-annotate-backend) (vc-backend file))
+ (set (make-local-variable 'vc-annotate-parent-file) file)
+ (set (make-local-variable 'vc-annotate-parent-rev) rev)
(set (make-local-variable 'vc-annotate-parent-display-mode)
- vc-annotate-display-mode))
+ display-mode))
- ;; Don't use the temp-buffer-name until the buffer is created
- ;; (only after `with-output-to-temp-buffer'.)
- (setq vc-annotate-buffers
- (append vc-annotate-buffers
- (list (cons (get-buffer temp-buffer-name) vc-annotate-backend))))
(message "Annotating... done")))
(defun vc-annotate-prev-version (prefix)
((stringp revspec) (setq newrev revspec))
(t (error "Invalid argument to vc-annotate-warp-version")))
(when newrev
- (save-window-excursion
- (find-file vc-annotate-parent-file)
- (vc-annotate nil newrev vc-annotate-parent-display-mode))
- (kill-buffer (current-buffer)) ;; kill the buffer we started from
- (switch-to-buffer (car (car (last vc-annotate-buffers))))
+ (vc-annotate vc-annotate-parent-file newrev
+ vc-annotate-parent-display-mode
+ (current-buffer))
(goto-line (min oldline (progn (goto-char (point-max))
(previous-line)
(line-number-at-pos))))))))
(defun vc-annotate-car-last-cons (a-list)
"Return car of last cons in association list A-LIST."
- (if (not (eq nil (cdr a-list)))
- (vc-annotate-car-last-cons (cdr a-list))
- (car (car a-list))))
+ (caar (last a-list)))
(defun vc-annotate-time-span (a-list span &optional quantize)
"Apply factor SPAN to the time-span of association list A-LIST.