# HG changeset patch # User Dan Nicolaescu # Date 1208754716 0 # Node ID 2aa6d908ffad6c9c7c00158128e72bac8b0a8cb7 # Parent 10db3330138c6c567f78cd75bd3fea82a64f9738 * vc-hooks.el (vc-insert-file, vc-state, vc-working-revision) (vc-check-master-templates, vc-file-not-found-hook) (vc-kill-buffer-hook): * vc.el (vc-process-sentinel, vc-exec-after, vc-do-command) (vc-find-position-by-context, vc-buffer-context) (vc-restore-buffer-context, vc-responsible-backend) (vc-expand-dirs, vc-ensure-vc-buffer, vc-buffer-sync) (vc-next-action, vc-register, vc-register-with, vc-steal-lock) (vc-finish-logentry, vc-coding-system-for-diff, vc-switches) (vc-version-diff, vc-diff, vc-insert-headers) (vc-dired-buffers-for-dir, vc-dired-resynch-file) (vc-snapshot-precondition, vc-create-snapshot, vc-print-log) (vc-revert, vc-rollback, vc-version-backup-file) (vc-rename-master, vc-delete-file, vc-rename-file) (vc-branch-part, vc-default-retrieve-snapshot) (vc-annotate-display-autoscale, vc-annotate-display-select) (vc-annotate, vc-annotate-warp-revision, vc-annotate-difference) (vc-annotate-lines, vc-file-tree-walk-internal): Use when instead of if. (vc-dir-update): Handle directories. (vc-default-status-printer): Simplify. diff -r 10db3330138c -r 2aa6d908ffad lisp/ChangeLog --- a/lisp/ChangeLog Mon Apr 21 05:02:06 2008 +0000 +++ b/lisp/ChangeLog Mon Apr 21 05:11:56 2008 +0000 @@ -1,5 +1,26 @@ 2008-04-21 Dan Nicolaescu + * vc-hooks.el (vc-insert-file, vc-state, vc-working-revision) + (vc-check-master-templates, vc-file-not-found-hook) + (vc-kill-buffer-hook): + * vc.el (vc-process-sentinel, vc-exec-after, vc-do-command) + (vc-find-position-by-context, vc-buffer-context) + (vc-restore-buffer-context, vc-responsible-backend) + (vc-expand-dirs, vc-ensure-vc-buffer, vc-buffer-sync) + (vc-next-action, vc-register, vc-register-with, vc-steal-lock) + (vc-finish-logentry, vc-coding-system-for-diff, vc-switches) + (vc-version-diff, vc-diff, vc-insert-headers) + (vc-dired-buffers-for-dir, vc-dired-resynch-file) + (vc-snapshot-precondition, vc-create-snapshot, vc-print-log) + (vc-revert, vc-rollback, vc-version-backup-file) + (vc-rename-master, vc-delete-file, vc-rename-file) + (vc-branch-part, vc-default-retrieve-snapshot) + (vc-annotate-display-autoscale, vc-annotate-display-select) + (vc-annotate, vc-annotate-warp-revision, vc-annotate-difference) + (vc-annotate-lines, vc-file-tree-walk-internal): Use when instead of if. + (vc-dir-update): Handle directories. + (vc-default-status-printer): Simplify. + * progmodes/asm-mode.el (asm-mode-map): * progmodes/hideif.el (hide-ifdef-mode-menu): Add :help. diff -r 10db3330138c -r 2aa6d908ffad lisp/vc-hooks.el --- a/lisp/vc-hooks.el Mon Apr 21 05:02:06 2008 +0000 +++ b/lisp/vc-hooks.el Mon Apr 21 05:11:56 2008 +0000 @@ -309,15 +309,15 @@ (when (file-exists-p file) (if (not limit) (insert-file-contents file) - (if (not blocksize) (setq blocksize 8192)) + (unless blocksize (setq blocksize 8192)) (let ((filepos 0)) (while (and (< 0 (cadr (insert-file-contents file nil filepos (incf filepos blocksize)))) (progn (beginning-of-line) (let ((pos (re-search-forward limit nil 'move))) - (if pos (delete-region (match-beginning 0) - (point-max))) + (when pos (delete-region (match-beginning 0) + (point-max))) (not pos))))))) (set-buffer-modified-p nil) t)) @@ -549,9 +549,9 @@ ;; - `removed' ;; - `copied' and `moved' (might be handled by `removed' and `added') (or (vc-file-getprop file 'vc-state) - (if (and (> (length file) 0) (vc-backend file)) - (vc-file-setprop file 'vc-state - (vc-call state-heuristic file))))) + (when (and (> (length file) 0) (vc-backend file)) + (vc-file-setprop file 'vc-state + (vc-call state-heuristic file))))) (defun vc-recompute-state (file) "Recompute the version control state of FILE, and return it. @@ -604,9 +604,10 @@ "Return the repository version from which FILE was checked out. If FILE is not registered, this function always returns nil." (or (vc-file-getprop file 'vc-working-revision) - (if (vc-backend file) - (vc-file-setprop file 'vc-working-revision - (vc-call working-revision file))))) + (when (vc-backend file) + (vc-file-setprop file 'vc-working-revision + (vc-call working-revision file))))) + ;; Backward compatibility. (define-obsolete-function-alias 'vc-workfile-version 'vc-working-revision "23.1") @@ -668,17 +669,17 @@ (mapcar (lambda (s) (let ((trial (vc-possible-master s dirname basename))) - (if (and trial (file-exists-p trial) - ;; Make sure the file we found with name - ;; TRIAL is not the source file itself. - ;; That can happen with RCS-style names if - ;; the file name is truncated (e.g. to 14 - ;; chars). See if either directory or - ;; attributes differ. - (or (not (string= dirname - (file-name-directory trial))) - (not (equal (file-attributes file) - (file-attributes trial))))) + (when (and trial (file-exists-p trial) + ;; Make sure the file we found with name + ;; TRIAL is not the source file itself. + ;; That can happen with RCS-style names if + ;; the file name is truncated (e.g. to 14 + ;; chars). See if either directory or + ;; attributes differ. + (or (not (string= dirname + (file-name-directory trial))) + (not (equal (file-attributes file) + (file-attributes trial))))) (throw 'found trial)))) templates)))) @@ -960,7 +961,7 @@ ;; from a previous visit. (vc-file-clearprops buffer-file-name) (let ((backend (vc-backend buffer-file-name))) - (if backend (vc-call-backend backend 'find-file-not-found-hook)))) + (when backend (vc-call-backend backend 'find-file-not-found-hook)))) (defun vc-default-find-file-not-found-hook (backend) ;; This used to do what vc-rcs-find-file-not-found-hook does, but it only @@ -971,8 +972,7 @@ (defun vc-kill-buffer-hook () "Discard VC info about a file when we kill its buffer." - (if buffer-file-name - (vc-file-clearprops buffer-file-name))) + (when buffer-file-name (vc-file-clearprops buffer-file-name))) (add-hook 'kill-buffer-hook 'vc-kill-buffer-hook) diff -r 10db3330138c -r 2aa6d908ffad lisp/vc.el --- a/lisp/vc.el Mon Apr 21 05:02:06 2008 +0000 +++ b/lisp/vc.el Mon Apr 21 05:11:56 2008 +0000 @@ -668,10 +668,10 @@ (require 'dired) ; for dired-map-over-marks macro (require 'dired-aux)) ; for dired-kill-{line,tree} -(if (not (assoc 'vc-parent-buffer minor-mode-alist)) - (setq minor-mode-alist - (cons '(vc-parent-buffer vc-parent-buffer-name) - minor-mode-alist))) +(unless (assoc 'vc-parent-buffer minor-mode-alist) + (setq minor-mode-alist + (cons '(vc-parent-buffer vc-parent-buffer-name) + minor-mode-alist))) ;; General customization @@ -1078,7 +1078,7 @@ ;; Impatient users sometime kill "slow" buffers; check liveness ;; to avoid "error in process sentinel: Selecting deleted buffer". (when (buffer-live-p buf) - (if previous (funcall previous p s)) + (when previous (funcall previous p s)) (with-current-buffer buf (setq mode-line-process (let ((status (process-status p))) @@ -1099,12 +1099,12 @@ ;; difficult to achieve. (vc-exec-after cmd)))) ;; But sometimes the sentinels really want to move point. - (if vc-sentinel-movepoint - (let ((win (get-buffer-window (current-buffer) 0))) - (if (not win) - (goto-char vc-sentinel-movepoint) - (with-selected-window win - (goto-char vc-sentinel-movepoint)))))))))) + (when vc-sentinel-movepoint + (let ((win (get-buffer-window (current-buffer) 0))) + (if (not win) + (goto-char vc-sentinel-movepoint) + (with-selected-window win + (goto-char vc-sentinel-movepoint)))))))))) (defun vc-set-mode-line-busy-indicator () (setq mode-line-process @@ -1126,7 +1126,7 @@ ;; anyway. -- cyd ((or (null proc) (eq (process-status proc) 'exit)) ;; Make sure we've read the process's output before going further. - (if proc (accept-process-output proc)) + (when proc (accept-process-output proc)) (eval code)) ;; If a process is running, add CODE to the sentinel ((eq (process-status proc) 'run) @@ -1212,9 +1212,9 @@ (mapconcat 'identity vc-path path-separator)) process-environment)) (w32-quote-process-args t)) - (if (and (eq okstatus 'async) (file-remote-p default-directory)) - ;; start-process does not support remote execution - (setq okstatus nil)) + (when (and (eq okstatus 'async) (file-remote-p default-directory)) + ;; start-process does not support remote execution + (setq okstatus nil)) (if (eq okstatus 'async) ;; Run asynchronously. (let ((proc @@ -1229,8 +1229,8 @@ `(if vc-command-messages (message "Running %s in background... done" ',full-command)))) ;; Run synchrously - (if vc-command-messages - (message "Running %s in foreground..." full-command)) + (when vc-command-messages + (message "Running %s in foreground..." full-command)) (let ((buffer-undo-list t)) (setq status (apply 'process-file command nil t nil squeezed))) (when (and (not (eq t okstatus)) @@ -1270,7 +1270,7 @@ (point-max) (save-excursion (let ((diff (- (nth 1 context) (buffer-size)))) - (if (< diff 0) (setq diff (- diff))) + (when (< diff 0) (setq diff (- diff))) (goto-char (nth 0 context)) (if (or (search-forward context-string nil t) ;; Can't use search-backward since the match may continue @@ -1296,8 +1296,8 @@ Used by `vc-restore-buffer-context' to later restore the context." (let ((point-context (vc-position-context (point))) ;; Use mark-marker to avoid confusion in transient-mark-mode. - (mark-context (if (eq (marker-buffer (mark-marker)) (current-buffer)) - (vc-position-context (mark-marker)))) + (mark-context (when (eq (marker-buffer (mark-marker)) (current-buffer)) + (vc-position-context (mark-marker)))) ;; Make the right thing happen in transient-mark-mode. (mark-active nil) ;; The new compilation code does not use compilation-error-list any @@ -1359,12 +1359,12 @@ ;; if necessary, restore point and mark (if (not (vc-context-matches-p (point) point-context)) (let ((new-point (vc-find-position-by-context point-context))) - (if new-point (goto-char new-point)))) + (when new-point (goto-char new-point)))) (and mark-active mark-context (not (vc-context-matches-p (mark) mark-context)) (let ((new-mark (vc-find-position-by-context mark-context))) - (if new-mark (set-mark new-mark)))))) + (when new-mark (set-mark new-mark)))))) ;;; Code for deducing what fileset and backend to assume @@ -1383,8 +1383,8 @@ which FILE is not yet registered. If there is no such backend, return the first backend under which FILE is not yet registered, but could be registered." - (if (not vc-handled-backends) - (error "No handled backends")) + (when (not vc-handled-backends) + (error "No handled backends")) (or (and (not (file-directory-p file)) (not register) (vc-backend file)) (catch 'found ;; First try: find a responsible backend. If this is for registration, @@ -1413,7 +1413,7 @@ (let ((flattened '())) (dolist (node file-or-dir-list) (vc-file-tree-walk - node (lambda (f) (if (vc-backend f) (push f flattened))))) + node (lambda (f) (when (vc-backend f) (push f flattened))))) (nreverse flattened))) (defun vc-deduce-fileset (&optional allow-directory-wildcard allow-unregistered) @@ -1483,8 +1483,8 @@ (set-buffer vc-parent-buffer)) (if (not buffer-file-name) (error "Buffer %s is not associated with a file" (buffer-name)) - (if (not (vc-backend buffer-file-name)) - (error "File %s is not under version control" buffer-file-name)))))) + (unless (vc-backend buffer-file-name) + (error "File %s is not under version control" buffer-file-name)))))) ;;; Support for the C-x v v command. This is where all the single-file-oriented ;;; code from before the fileset rewrite lives. @@ -1515,12 +1515,12 @@ (defun vc-buffer-sync (&optional not-urgent) "Make sure the current buffer and its working file are in sync. NOT-URGENT means it is ok to continue if the user says not to save." - (if (buffer-modified-p) - (if (or vc-suppress-confirm - (y-or-n-p (format "Buffer %s modified; save it? " (buffer-name)))) - (save-buffer) - (unless not-urgent - (error "Aborted"))))) + (when (buffer-modified-p) + (if (or vc-suppress-confirm + (y-or-n-p (format "Buffer %s modified; save it? " (buffer-name)))) + (save-buffer) + (unless not-urgent + (error "Aborted"))))) (defvar vc-dired-window-configuration) @@ -1705,8 +1705,8 @@ ;; unlocked-changes ((eq state 'unlocked-changes) (dolist (file files) - (if (not (equal buffer-file-name file)) - (find-file-other-window file)) + (when (not (equal buffer-file-name file)) + (find-file-other-window file)) (if (save-window-excursion (vc-diff-internal nil (list file) (vc-working-revision file) nil) (goto-char (point-min)) @@ -1768,10 +1768,10 @@ ;; does not exist yet, even though buffer-modified-p is nil. (when bname (with-current-buffer bname - (if (and (not (buffer-modified-p)) + (when (and (not (buffer-modified-p)) (zerop (buffer-size)) (not (file-exists-p buffer-file-name))) - (set-buffer-modified-p t)) + (set-buffer-modified-p t)) (vc-buffer-sync))) (vc-start-entry (list fname) (if set-revision @@ -1797,8 +1797,8 @@ (defun vc-register-with (backend) "Register the current file with a specified back end." (interactive "SBackend: ") - (if (not (member backend vc-handled-backends)) - (error "Unknown back end.")) + (when (not (member backend vc-handled-backends)) + (error "Unknown back end.")) (let ((vc-handled-backends (list backend))) (call-interactively 'vc-register))) @@ -1931,9 +1931,9 @@ (if rev (setq file-description (format "%s:%s" file rev)) (setq file-description file)) - (if (not (yes-or-no-p (format "Steal the lock on %s from %s? " - file-description owner))) - (error "Steal canceled")) + (when (not (yes-or-no-p (format "Steal the lock on %s from %s? " + file-description owner))) + (error "Steal canceled")) (message "Stealing lock on %s..." file) (with-vc-properties (list file) @@ -1995,7 +1995,7 @@ ;; Check and record the comment, if any. (unless nocomment ;; Comment too long? - (vc-call-backend (or (if vc-log-fileset (vc-backend vc-log-fileset)) + (vc-call-backend (or (when vc-log-fileset (vc-backend vc-log-fileset)) (vc-responsible-backend default-directory)) 'logentry-check) (run-hooks 'vc-logentry-check-hook)) @@ -2003,8 +2003,8 @@ ;; But not if it is a vc-dired buffer. (with-current-buffer vc-parent-buffer (or vc-dired-mode (eq major-mode 'vc-dir-mode) (vc-buffer-sync))) - (if (not vc-log-operation) - (error "No log operation is pending")) + (unless vc-log-operation + (error "No log operation is pending")) ;; save the parameters held in buffer-local variables (let ((log-operation vc-log-operation) (log-fileset vc-log-fileset) @@ -2031,11 +2031,11 @@ (bury-buffer) (pop-to-buffer tmp-vc-parent-buffer)))) ;; Now make sure we see the expanded headers - (if log-fileset - (mapc - (lambda (file) (vc-resynch-buffer file vc-keep-workfiles t)) - log-fileset)) - (if (or vc-dired-mode (eq major-mode 'vc-dir-mode)) + (when log-fileset + (mapc + (lambda (file) (vc-resynch-buffer file vc-keep-workfiles t)) + log-fileset)) + (when (or vc-dired-mode (eq major-mode 'vc-dir-mode)) (dired-move-to-filename)) (run-hooks after-hook 'vc-finish-logentry-hook))) @@ -2066,8 +2066,8 @@ ;; if we already have this file open, ;; use the buffer's coding system (let ((buf (find-buffer-visiting file))) - (if buf (with-current-buffer buf - buffer-file-coding-system))) + (when buf (with-current-buffer buf + buffer-file-coding-system))) ;; otherwise, try to find one based on the file name (car (find-operation-coding-system 'insert-file-contents file)) ;; and a final fallback @@ -2075,20 +2075,20 @@ (defun vc-switches (backend op) (let ((switches - (or (if backend - (let ((sym (vc-make-backend-sym - backend (intern (concat (symbol-name op) - "-switches"))))) - (if (boundp sym) (symbol-value sym)))) + (or (when backend + (let ((sym (vc-make-backend-sym + backend (intern (concat (symbol-name op) + "-switches"))))) + (when (boundp sym) (symbol-value sym)))) (let ((sym (intern (format "vc-%s-switches" (symbol-name op))))) - (if (boundp sym) (symbol-value sym))) + (when (boundp sym) (symbol-value sym))) (cond ((eq op 'diff) diff-switches))))) (if (stringp switches) (list switches) ;; If not a list, return nil. ;; This is so we can set vc-diff-switches to t to override ;; any switches in diff-switches. - (if (listp switches) switches)))) + (when (listp switches) switches)))) ;; Old def for compatibility with Emacs-21.[123]. (defmacro vc-diff-switches-list (backend) `(vc-switches ',backend 'diff)) @@ -2203,7 +2203,7 @@ (t (setq rev1-default (vc-call previous-revision first (vc-working-revision first))) - (if (string= rev1-default "") (setq rev1-default nil)) + (when (string= rev1-default "") (setq rev1-default nil)) (setq rev2-default (vc-working-revision first)))) ;; construct argument list (let* ((rev1-prompt (if rev1-default @@ -2220,8 +2220,8 @@ (completing-read rev2-prompt completion-table nil nil nil nil rev2-default) (read-string rev2-prompt nil nil rev2-default)))) - (if (string= rev1 "") (setq rev1 nil)) - (if (string= rev2 "") (setq rev2 nil)) + (when (string= rev1 "") (setq rev1 nil)) + (when (string= rev2 "") (setq rev2 nil)) (list files rev1 rev2)))) (if (and (not rev1) rev2) (error "Not a valid revision range.")) @@ -2250,7 +2250,7 @@ (if historic (call-interactively 'vc-version-diff) (let* ((files (vc-deduce-fileset t))) - (if buffer-file-name (vc-buffer-sync not-urgent)) + (when buffer-file-name (vc-buffer-sync not-urgent)) (vc-diff-internal t files nil nil (interactive-p))))) @@ -2320,21 +2320,21 @@ (save-excursion (save-restriction (widen) - (if (or (not (vc-check-headers)) - (y-or-n-p "Version headers already exist. Insert another set? ")) - (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))))))))))) + (when (or (not (vc-check-headers)) + (y-or-n-p "Version headers already exist. Insert another set? ")) + (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")) + (when vc-static-header-alist + (dolist (f vc-static-header-alist) + (when (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). @@ -2659,8 +2659,8 @@ (when (fboundp 'dired-buffers-for-dir) (dolist (buffer (dired-buffers-for-dir dir)) (with-current-buffer buffer - (if vc-dired-mode - (push buffer result))))) + (when vc-dired-mode + (push buffer result))))) (nreverse result))) (defun vc-dired-resynch-file (file) @@ -2669,11 +2669,11 @@ (when buffers (mapcar (lambda (buffer) (with-current-buffer buffer - (if (dired-goto-file file) - ;; bind vc-dired-terse-mode to nil so that - ;; files won't vanish when they are checked in - (let ((vc-dired-terse-mode nil)) - (dired-do-redisplay 1))))) + (when (dired-goto-file file) + ;; bind vc-dired-terse-mode to nil so that + ;; files won't vanish when they are checked in + (let ((vc-dired-terse-mode nil)) + (dired-do-redisplay 1))))) buffers)))) ;;;###autoload @@ -2707,7 +2707,7 @@ (:type list) ;So we can use `member' on lists of FIs. (:constructor ;; We could define it as an alias for `list'. - vc-dir-create-fileinfo (name state &optional extra marked)) + vc-dir-create-fileinfo (name state &optional extra marked directory)) (:conc-name vc-dir-fileinfo->)) name ;Keep it as first, for `member'. state @@ -2717,7 +2717,7 @@ ;; To keep track of not updated files during a global refresh needs-update ;; To distinguish files and directories. - directoryp) + directory) (defvar vc-ewoc nil) @@ -2741,26 +2741,27 @@ (defun vc-default-status-printer (backend fileentry) "Pretty print FILEENTRY." - (if (vc-dir-fileinfo->directoryp fileentry) - (insert " Directory: %s" (vc-dir-fileinfo->name fileentry)) - ;; If you change the layout here, change vc-dir-move-to-goal-column. - (let ((state (vc-dir-fileinfo->state fileentry))) - (insert - (propertize - (format "%c" (if (vc-dir-fileinfo->marked fileentry) ?* ? )) - 'face 'font-lock-type-face) - " " - (propertize - (format "%-20s" state) - 'face (cond ((eq state 'up-to-date) 'font-lock-builtin-face) - ((memq state '(missing conflict)) 'font-lock-warning-face) - (t 'font-lock-variable-name-face)) - 'mouse-face 'highlight) - " " - (propertize - (format "%s" (vc-dir-fileinfo->name fileentry)) - 'face 'font-lock-function-name-face - 'mouse-face 'highlight))))) + ;; If you change the layout here, change vc-dir-move-to-goal-column. + (let ((state + (if (vc-dir-fileinfo->directory fileentry) + 'DIRECTORY + (vc-dir-fileinfo->state fileentry)))) + (insert + (propertize + (format "%c" (if (vc-dir-fileinfo->marked fileentry) ?* ? )) + 'face 'font-lock-type-face) + " " + (propertize + (format "%-20s" state) + 'face (cond ((eq state 'up-to-date) 'font-lock-builtin-face) + ((memq state '(missing conflict)) 'font-lock-warning-face) + (t 'font-lock-variable-name-face)) + 'mouse-face 'highlight) + " " + (propertize + (format "%s" (vc-dir-fileinfo->name fileentry)) + 'face 'font-lock-function-name-face + 'mouse-face 'highlight)))) (defun vc-dir-printer (fileentry) (let ((backend (vc-responsible-backend default-directory))) @@ -3016,6 +3017,12 @@ (put 'vc-dir-mode 'mode-class 'special) +;; t if directories should be shown in vc-dir. +;; WORK IN PROGRESS! DO NOT SET this! ONLY set it if you want to help +;; write code for this feature. This variable will likely disappear +;; when the work is done. +(defvar vc-dir-insert-directories t) + (defun vc-dir-update (entries buffer &optional noinsert) "Update BUFFER's ewoc from the list of ENTRIES. If NOINSERT, ignore elements on ENTRIES which are not in the ewoc." @@ -3036,31 +3043,100 @@ ((string< dir1 dir2) t) ((not (string= dir1 dir2)) nil) ((string< (car entry1) (car entry2)))))))) - (let ((entry (car entries)) - (node (ewoc-nth vc-ewoc 0))) - (while (and entry node) - (let ((entryfile (car entry)) - (nodefile (vc-dir-fileinfo->name (ewoc-data node)))) - (cond - ((string-lessp nodefile entryfile) - (setq node (ewoc-next vc-ewoc node))) - ((string-lessp entryfile nodefile) - (unless noinsert - (ewoc-enter-before vc-ewoc node - (apply 'vc-dir-create-fileinfo entry))) - (setq entries (cdr entries) entry (car entries))) - (t - (setf (vc-dir-fileinfo->state (ewoc-data node)) (nth 1 entry)) - (setf (vc-dir-fileinfo->extra (ewoc-data node)) (nth 2 entry)) - (setf (vc-dir-fileinfo->needs-update (ewoc-data node)) nil) - (ewoc-invalidate vc-ewoc node) - (setq entries (cdr entries) entry (car entries)) - (setq node (ewoc-next vc-ewoc node)))))) - (unless (or node noinsert) - ;; We're past the last node, all remaining entries go to the end. - (while entries - (ewoc-enter-last vc-ewoc - (apply 'vc-dir-create-fileinfo (pop entries)))))))) + (if (not vc-dir-insert-directories) + (let ((entry (car entries)) + (node (ewoc-nth vc-ewoc 0))) + (while (and entry node) + (let ((entryfile (car entry)) + (nodefile (vc-dir-fileinfo->name (ewoc-data node)))) + (cond + ((string-lessp nodefile entryfile) + (setq node (ewoc-next vc-ewoc node))) + ((string-lessp entryfile nodefile) + (unless noinsert + (ewoc-enter-before vc-ewoc node + (apply 'vc-dir-create-fileinfo entry))) + (setq entries (cdr entries) entry (car entries))) + (t + (setf (vc-dir-fileinfo->state (ewoc-data node)) (nth 1 entry)) + (setf (vc-dir-fileinfo->extra (ewoc-data node)) (nth 2 entry)) + (setf (vc-dir-fileinfo->needs-update (ewoc-data node)) nil) + (ewoc-invalidate vc-ewoc node) + (setq entries (cdr entries) entry (car entries)) + (setq node (ewoc-next vc-ewoc node)))))) + (unless (or node noinsert) + ;; We're past the last node, all remaining entries go to the end. + (while entries + (ewoc-enter-last vc-ewoc + (apply 'vc-dir-create-fileinfo (pop entries)))))) + ;; Insert directory entries in the right places. + (let ((entry (car entries)) + (node (ewoc-nth vc-ewoc 0))) + ;; Insert . if it is not present. + (unless node + (let ((rd (file-relative-name default-directory))) + (ewoc-enter-last + vc-ewoc (vc-dir-create-fileinfo + rd nil nil nil (expand-file-name default-directory)))) + (setq node (ewoc-nth vc-ewoc 0))) + + (while (and entry node) + (let* ((entryfile (car entry)) + (entrydir (file-name-directory (expand-file-name entryfile))) + (nodedir + (or (vc-dir-fileinfo->directory (ewoc-data node)) + (file-name-directory + (expand-file-name + (vc-dir-fileinfo->name (ewoc-data node))))))) + (cond + ;; First try to find the directory. + ((string-lessp nodedir entrydir) + (setq node (ewoc-next vc-ewoc node))) + ((string-equal nodedir entrydir) + ;; Found the directory, find the place for the file name. + (let ((nodefile (vc-dir-fileinfo->name (ewoc-data node)))) + (cond + ((string-lessp nodefile entryfile) + (setq node (ewoc-next vc-ewoc node))) + ((string-equal nodefile entryfile) + (setf (vc-dir-fileinfo->state (ewoc-data node)) (nth 1 entry)) + (setf (vc-dir-fileinfo->extra (ewoc-data node)) (nth 2 entry)) + (setf (vc-dir-fileinfo->needs-update (ewoc-data node)) nil) + (ewoc-invalidate vc-ewoc node) + (setq entries (cdr entries) entry (car entries)) + (setq node (ewoc-next vc-ewoc node))) + (t + (ewoc-enter-before vc-ewoc node + (apply 'vc-dir-create-fileinfo entry)) + (setq entries (cdr entries) entry (car entries)))))) + (t + ;; We need to insert a directory node + (let ((rd (file-relative-name entrydir))) + (ewoc-enter-last + vc-ewoc (vc-dir-create-fileinfo rd nil nil nil entrydir))) + ;; Now insert the node itself. + (ewoc-enter-before vc-ewoc node + (apply 'vc-dir-create-fileinfo entry)) + (setq entries (cdr entries) entry (car entries)))))) + ;; We're past the last node, all remaining entries go to the end. + (unless (or node noinsert) + (let* ((lastnode (ewoc-nth vc-ewoc -1)) + (lastdir + (or (vc-dir-fileinfo->directory (ewoc-data lastnode)) + (file-name-directory + (expand-file-name + (vc-dir-fileinfo->name (ewoc-data lastnode))))))) + (dolist (entry entries) + (let ((entrydir (file-name-directory (expand-file-name (car entry))))) + ;; Insert a directory node if needed. + (unless (string-equal lastdir entrydir) + (setq lastdir entrydir) + (let ((rd (file-relative-name entrydir))) + (ewoc-enter-last + vc-ewoc (vc-dir-create-fileinfo rd nil nil nil entrydir)))) + ;; Now insert the node itself. + (ewoc-enter-last vc-ewoc + (apply 'vc-dir-create-fileinfo entry)))))))))) (defun vc-dir-busy () (and (buffer-live-p vc-dir-process-buffer) @@ -3385,7 +3461,7 @@ dir (lambda (f) (if (not (vc-up-to-date-p f)) (throw 'vc-locked-example f) - (if (get-file-buffer f) (setq status 'visited))))) + (when (get-file-buffer f) (setq status 'visited))))) status))) ;;;###autoload @@ -3400,7 +3476,7 @@ (read-string "New snapshot name: ") current-prefix-arg)) (message "Making %s... " (if branchp "branch" "snapshot")) - (if (file-directory-p dir) (setq dir (file-name-as-directory dir))) + (when (file-directory-p dir) (setq dir (file-name-as-directory dir))) (vc-call-backend (vc-responsible-backend dir) 'create-snapshot dir name branchp) (message "Making %s... done" (if branchp "branch" "snapshot"))) @@ -3448,8 +3524,8 @@ (delete-char (- (match-end 0) (match-beginning 0))) (forward-line -1)) (goto-char (point-min)) - (if (looking-at "[\b\t\n\v\f\r ]+") - (delete-char (- (match-end 0) (match-beginning 0)))) + (when (looking-at "[\b\t\n\v\f\r ]+") + (delete-char (- (match-end 0) (match-beginning 0)))) (shrink-window-if-larger-than-buffer) ;; move point to the log entry for the working revision (vc-call-backend ',backend 'show-log-entry ',working-revision) @@ -3467,26 +3543,24 @@ ;; sure buffer is saved. If the user says `no', abort since ;; we cannot show the changes and ask for confirmation to ;; discard them. - (if (or (not files) (memq (buffer-file-name) files)) - (vc-buffer-sync nil)) + (when (or (not files) (memq (buffer-file-name) files)) + (vc-buffer-sync nil)) (dolist (file files) (let ((buf (get-file-buffer file))) - (if (and buf (buffer-modified-p buf)) + (when (and buf (buffer-modified-p buf)) (error "Please kill or save all modified buffers before reverting."))) - (if (vc-up-to-date-p file) - (unless (yes-or-no-p (format "%s seems up-to-date. Revert anyway? " file)) - (error "Revert canceled")))) - (if (vc-diff-internal vc-allow-async-revert files nil nil) - (progn - (unless (yes-or-no-p (format "Discard changes in %s? " (vc-delistify files))) - (error "Revert canceled")) - (delete-windows-on "*vc-diff*") - (kill-buffer "*vc-diff*"))) + (when (vc-up-to-date-p file) + (unless (yes-or-no-p (format "%s seems up-to-date. Revert anyway? " file)) + (error "Revert canceled")))) + (when (vc-diff-internal vc-allow-async-revert files nil nil) + (unless (yes-or-no-p (format "Discard changes in %s? " (vc-delistify files))) + (error "Revert canceled")) + (delete-windows-on "*vc-diff*") + (kill-buffer "*vc-diff*")) (dolist (file files) - (progn - (message "Reverting %s..." (vc-delistify files)) - (vc-revert-file file) - (message "Reverting %s...done" (vc-delistify files)))))) + (message "Reverting %s..." (vc-delistify files)) + (vc-revert-file file) + (message "Reverting %s...done" (vc-delistify files))))) ;;;###autoload (defun vc-rollback () @@ -3499,21 +3573,21 @@ (granularity (vc-call-backend backend 'revision-granularity))) (unless (vc-find-backend-function backend 'rollback) (error "Rollback is not supported in %s" backend)) - (if (and (not (eq granularity 'repository)) (/= (length files) 1)) - (error "Rollback requires a singleton fileset or repository versioning")) - (if (not (vc-call latest-on-branch-p (car files))) - (error "Rollback is only possible at the tip revision.")) + (when (and (not (eq granularity 'repository)) (/= (length files) 1)) + (error "Rollback requires a singleton fileset or repository versioning")) + (when (not (vc-call latest-on-branch-p (car files))) + (error "Rollback is only possible at the tip revision.")) ;; If any of the files is visited by the current buffer, make ;; sure buffer is saved. If the user says `no', abort since ;; we cannot show the changes and ask for confirmation to ;; discard them. - (if (or (not files) (memq (buffer-file-name) files)) - (vc-buffer-sync nil)) + (when (or (not files) (memq (buffer-file-name) files)) + (vc-buffer-sync nil)) (dolist (file files) - (if (buffer-modified-p (get-file-buffer file)) - (error "Please kill or save all modified buffers before rollback.")) - (if (not (vc-up-to-date-p file)) - (error "Please revert all modified workfiles before rollback."))) + (when (buffer-modified-p (get-file-buffer file)) + (error "Please kill or save all modified buffers before rollback.")) + (when (not (vc-up-to-date-p file)) + (error "Please revert all modified workfiles before rollback."))) ;; Accumulate changes associated with the fileset (vc-setup-buffer "*vc-diff*") (not-modified) @@ -3579,8 +3653,8 @@ backup-file ;; there is no automatic backup, but maybe the user made one manually (setq backup-file (vc-version-backup-file-name file rev 'manual)) - (if (file-exists-p backup-file) - backup-file))))) + (when (file-exists-p backup-file) + backup-file))))) (defun vc-revert-file (file) "Revert FILE back to the repository working revision it was based on." @@ -3705,9 +3779,9 @@ (mapcar (lambda (s) (vc-possible-master s newdir newbase)) templates))) - (if (or (file-symlink-p oldmaster) - (file-symlink-p (file-name-directory oldmaster))) - (error "This is unsafe in the presence of symbolic links")) + (when (or (file-symlink-p oldmaster) + (file-symlink-p (file-name-directory oldmaster))) + (error "This is unsafe in the presence of symbolic links")) (rename-file oldmaster (catch 'found @@ -3733,8 +3807,8 @@ (file-name-nondirectory file))) (unless (vc-find-backend-function backend 'delete-file) (error "Deleting files under %s is not supported in VC" backend)) - (if (and buf (buffer-modified-p buf)) - (error "Please save files before deleting them")) + (when (and buf (buffer-modified-p buf)) + (error "Please save files before deleting them")) (unless (y-or-n-p (format "Really want to delete %s? " (file-name-nondirectory file))) (error "Abort!")) @@ -3748,7 +3822,7 @@ (unless buf (kill-buffer (current-buffer))))) (vc-call delete-file file) ;; If the backend hasn't deleted the file itself, let's do it for him. - (if (file-exists-p file) (delete-file file)) + (when (file-exists-p file) (delete-file file)) ;; Forget what VC knew about the file. (vc-file-clearprops file) (vc-resynch-buffer file buf t))) @@ -3758,12 +3832,12 @@ "Rename file OLD to NEW, and rename its master file likewise." (interactive "fVC rename file: \nFRename to: ") (let ((oldbuf (get-file-buffer old))) - (if (and oldbuf (buffer-modified-p oldbuf)) - (error "Please save files before moving them")) - (if (get-file-buffer new) - (error "Already editing new file name")) - (if (file-exists-p new) - (error "New file already exists")) + (when (and oldbuf (buffer-modified-p oldbuf)) + (error "Please save files before moving them")) + (when (get-file-buffer new) + (error "Already editing new file name")) + (when (file-exists-p new) + (error "New file already exists")) (let ((state (vc-state old))) (unless (memq state '(up-to-date edited)) (error "Please %s files before moving them" @@ -3771,17 +3845,17 @@ (vc-call rename-file old new) (vc-file-clearprops old) ;; Move the actual file (unless the backend did it already) - (if (file-exists-p old) (rename-file old new)) + (when (file-exists-p old) (rename-file old new)) ;; ?? Renaming a file might change its contents due to keyword expansion. ;; We should really check out a new copy if the old copy was precisely equal ;; to some checked-in revision. However, testing for this is tricky.... - (if oldbuf - (with-current-buffer oldbuf - (let ((buffer-read-only buffer-read-only)) - (set-visited-file-name new)) - (vc-backend new) - (vc-mode-line new) - (set-buffer-modified-p nil))))) + (when oldbuf + (with-current-buffer oldbuf + (let ((buffer-read-only buffer-read-only)) + (set-visited-file-name new)) + (vc-backend new) + (vc-mode-line new) + (set-buffer-modified-p nil))))) ;;;###autoload (defun vc-update-change-log (&rest args) @@ -3839,8 +3913,8 @@ (defun vc-branch-part (rev) "Return the branch part of a revision number REV." (let ((index (string-match "\\.[0-9]+\\'" rev))) - (if index - (substring rev 0 index)))) + (when index + (substring rev 0 index)))) (defun vc-minor-part (rev) "Return the minor revision number of a revision number REV." @@ -4030,7 +4104,7 @@ (vc-up-to-date-p f) (vc-error-occurred (vc-call checkout f nil "") - (if update (vc-resynch-buffer f t t))))))) + (when update (vc-resynch-buffer f t t))))))) (let ((result (vc-snapshot-precondition dir))) (if (stringp result) (error "File %s is locked" result) @@ -4039,7 +4113,7 @@ dir (lambda (f) (vc-error-occurred (vc-call checkout f nil name) - (if update (vc-resynch-buffer f t t))))))))) + (when update (vc-resynch-buffer f t t))))))))) (defun vc-default-revert (backend file contents-done) (unless contents-done @@ -4160,10 +4234,10 @@ (goto-char (point-min)) (while (not (eobp)) (when (setq date (vc-annotate-get-time-set-line-props)) - (if (> date newest) - (setq newest date)) - (if (< date oldest) - (setq oldest date))) + (when (> date newest) + (setq newest date)) + (when (< date oldest) + (setq oldest date))) (forward-line 1))) (vc-annotate-display (/ (- (if full newest current) oldest) @@ -4239,7 +4313,7 @@ BUFFER. `vc-annotate-display-mode' specifies the highlighting mode to use; you may override this using the second optional arg MODE." (interactive) - (if mode (setq vc-annotate-display-mode mode)) + (when mode (setq vc-annotate-display-mode mode)) (pop-to-buffer (or buffer (current-buffer))) (cond ((null vc-annotate-display-mode) ;; The ratio is global, thus relative to the global color-map. @@ -4311,18 +4385,18 @@ ;; 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)))) + (when buf (with-current-buffer buf + (rename-buffer temp-buffer-name t) + ;; In case it had to be uniquified. + (setq temp-buffer-name (buffer-name)))) (with-output-to-temp-buffer temp-buffer-name (vc-call annotate-command file (get-buffer temp-buffer-name) rev) ;; we must setup the mode first, and then set our local ;; variables before the show-function is called at the exit of ;; with-output-to-temp-buffer (with-current-buffer temp-buffer-name - (if (not (equal major-mode 'vc-annotate-mode)) - (vc-annotate-mode)) + (unless (equal major-mode 'vc-annotate-mode) + (vc-annotate-mode)) (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) @@ -4457,18 +4531,18 @@ (setq newrev (vc-call next-revision vc-annotate-parent-file newrev)) (setq revspec (1- revspec))) - (if (not newrev) - (message "Cannot increment %d revisions from revision %s" - revspeccopy vc-annotate-parent-rev))) + (unless newrev + (message "Cannot increment %d revisions from revision %s" + revspeccopy vc-annotate-parent-rev))) ((and (integerp revspec) (< revspec 0)) (setq newrev vc-annotate-parent-rev) (while (and (< revspec 0) newrev) (setq newrev (vc-call previous-revision vc-annotate-parent-file newrev)) (setq revspec (1+ revspec))) - (if (not newrev) - (message "Cannot decrement %d revisions from revision %s" - (- 0 revspeccopy) vc-annotate-parent-rev))) + (unless newrev + (message "Cannot decrement %d revisions from revision %s" + (- 0 revspeccopy) vc-annotate-parent-rev))) ((stringp revspec) (setq newrev revspec)) (t (error "Invalid argument to vc-annotate-warp-revision"))) (when newrev @@ -4504,10 +4578,10 @@ difference in days between the time returned and the current time, or OFFSET if present." (let ((next-time (vc-annotate-get-time-set-line-props))) - (if next-time - (- (or offset - (vc-call-backend vc-annotate-backend 'annotate-current-time)) - next-time)))) + (when next-time + (- (or offset + (vc-call-backend vc-annotate-backend 'annotate-current-time)) + next-time)))) (defun vc-default-annotate-current-time (backend) "Return the current time, encoded as fractional days." @@ -4519,10 +4593,10 @@ "Highlight `vc-annotate' output in the current buffer. RATIO, is the expansion that should be applied to `vc-annotate-color-map'. The annotations are relative to the current time, unless overridden by OFFSET." - (if (/= ratio 1.0) - (set (make-local-variable 'vc-annotate-color-map) - (mapcar (lambda (elem) (cons (* (car elem) ratio) (cdr elem))) - vc-annotate-color-map))) + (when (/= ratio 1.0) + (set (make-local-variable 'vc-annotate-color-map) + (mapcar (lambda (elem) (cons (* (car elem) ratio) (cdr elem))) + vc-annotate-color-map))) (set (make-local-variable 'vc-annotate-offset) offset) (font-lock-mode 1)) @@ -4544,9 +4618,9 @@ (face (or (intern-soft face-name) (let ((tmp-face (make-face (intern face-name)))) (set-face-foreground tmp-face (cdr color)) - (if vc-annotate-background - (set-face-background tmp-face - vc-annotate-background)) + (when vc-annotate-background + (set-face-background tmp-face + vc-annotate-background)) tmp-face)))) ; Return the face (put-text-property start end 'face face))))) ;; Pretend to font-lock there were no matches. @@ -4578,7 +4652,7 @@ (defun vc-file-tree-walk-internal (file func args) (if (not (file-directory-p file)) - (if (vc-backend file) (apply func file args)) + (when (vc-backend file) (apply func file args)) (message "Traversing directory %s..." (abbreviate-file-name file)) (let ((dir (file-name-as-directory file))) (mapcar