(eval-when-compile
(require 'cl)
- (require 'vc)) ; for vc-exec-after
+ (require 'vc) ;; for vc-exec-after
+ (require 'vc-dir))
;; Clear up the cache to force vc-call to check again and discover
;; new functions when we reload this file.
(if rev (error "Can't check in a specific revision with bzr"))
(vc-bzr-command "commit" nil 0 files "-m" comment))
-(defun vc-bzr-find-version (file rev buffer)
- "Fetch version REV of file FILE and put it into BUFFER."
+(defun vc-bzr-find-revision (file rev buffer)
+ "Fetch revision REV of file FILE and put it into BUFFER."
(with-current-buffer buffer
(if (and rev (stringp rev) (not (string= rev "")))
(vc-bzr-command "cat" t 0 file "-r" rev)
(defun vc-bzr-show-log-entry (revision)
"Find entry for patch name REVISION in bzr change log buffer."
(goto-char (point-min))
- (let (case-fold-search)
- (if (re-search-forward
- ;; "revno:" can appear either at the beginning of a line, or indented.
- (concat "^[ ]*-+\n[ ]*revno: "
- ;; The revision can contain ".", quote it so that it
- ;; does not interfere with regexp matching.
- (regexp-quote revision) "$") nil t)
- (beginning-of-line 0)
- (goto-char (point-min)))))
+ (when revision
+ (let (case-fold-search)
+ (if (re-search-forward
+ ;; "revno:" can appear either at the beginning of a line,
+ ;; or indented.
+ (concat "^[ ]*-+\n[ ]*revno: "
+ ;; The revision can contain ".", quote it so that it
+ ;; does not interfere with regexp matching.
+ (regexp-quote revision) "$") nil t)
+ (beginning-of-line 0)
+ (goto-char (point-min))))))
(defun vc-bzr-diff (files &optional rev1 rev2 buffer)
"VC bzr backend for diff."
;; `bzr diff' exits with code 1 if diff is non-empty.
(apply #'vc-bzr-command "diff" (or buffer "*vc-diff*") 'async files
"--diff-options" (mapconcat 'identity
- (vc-diff-switches-list bzr)
+ (vc-switches 'bzr 'diff)
" ")
;; This `when' is just an optimization because bzr-1.2 is *much*
;; faster when the revision argument is not given.
(replace-match "")
(insert tag " |")))))
+(declare-function vc-annotate-convert-time "vc-annotate" (time))
+
(defun vc-bzr-annotate-time ()
(when (re-search-forward "^ *[0-9.]+ +|" nil t)
(let ((prop (get-text-property (line-beginning-position) 'help-echo)))
Return nil if current line isn't annotated."
(save-excursion
(beginning-of-line)
- (if (looking-at " *\\([0-9.]+\\) | ")
+ (if (looking-at " *\\([0-9.]+\\) *| ")
(match-string-no-properties 1))))
(defun vc-bzr-command-discarding-stderr (command &rest args)
;; else fall back to default vc.el representation
(vc-default-prettify-state-info 'Bzr file)))
-;; XXX: this needs testing, it's probably incomplete.
+(defstruct (vc-bzr-extra-fileinfo
+ (:copier nil)
+ (:constructor vc-bzr-create-extra-fileinfo (extra-name))
+ (:conc-name vc-bzr-extra-fileinfo->))
+ extra-name) ;; original name for rename targets, new name for
+
+(defun vc-bzr-status-printer (info)
+ "Pretty-printer for the vc-dir-fileinfo structure."
+ (let ((extra (vc-dir-fileinfo->extra info)))
+ (vc-default-status-printer 'Bzr info)
+ (when extra
+ (insert (propertize
+ (format " (renamed from %s)"
+ (vc-bzr-extra-fileinfo->extra-name extra))
+ 'face 'font-lock-comment-face)))))
+
+;; FIXME: this needs testing, it's probably incomplete.
(defun vc-bzr-after-dir-status (update-function)
(let ((status-str nil)
- (translation '(("+N" . added)
- ("-D" . removed)
- (" M" . edited)
- ;; XXX: what about ignored files?
- (" D" . missing)
+ (translation '(("+N " . added)
+ ("-D " . removed)
+ (" M " . edited) ;; file text modified
+ (" *" . edited) ;; execute bit changed
+ (" M*" . edited) ;; text modified + execute bit changed
+ ;; FIXME: what about ignored files?
+ (" D " . missing)
;; For conflicts, should we list the .THIS/.BASE/.OTHER?
- ("C " . conflict)
- ("? " . unregistered)
+ ("C " . conflict)
+ ("? " . unregistered)
+ ("? " . unregistered)
+ ;; No such state, but we need to distinguish this case.
+ ("R " . renamed)
;; Ignore "P " and "P." for pending patches.
))
(translated nil)
(goto-char (point-min))
(while (not (eobp))
(setq status-str
- (buffer-substring-no-properties (point) (+ (point) 2)))
+ (buffer-substring-no-properties (point) (+ (point) 3)))
(setq translated (cdr (assoc status-str translation)))
- ;; For conflicts the file appears twice in the listing: once
- ;; with the M flag and once with the C flag, so take care not
- ;; to add it twice to `result'. Ugly.
- (if (eq translated 'conflict)
- (let* ((file
- (buffer-substring-no-properties
- ;;For files with conflicts the format is:
- ;;C Text conflict in FILENAME
- ;; Bah.
- (+ (point) 21) (line-end-position)))
- (entry (assoc file result)))
- (when entry
- (setf (nth 1 entry) 'conflict)))
+ (cond
+ ((eq translated 'conflict)
+ ;; For conflicts the file appears twice in the listing: once
+ ;; with the M flag and once with the C flag, so take care
+ ;; not to add it twice to `result'. Ugly.
+ (let* ((file
+ (buffer-substring-no-properties
+ ;;For files with conflicts the format is:
+ ;;C Text conflict in FILENAME
+ ;; Bah.
+ (+ (point) 21) (line-end-position)))
+ (entry (assoc file result)))
+ (when entry
+ (setf (nth 1 entry) 'conflict))))
+ ((eq translated 'renamed)
+ (re-search-forward "R \\(.*\\) => \\(.*\\)$" (line-end-position) t)
+ (let ((new-name (match-string 2))
+ (old-name (match-string 1)))
+ (push (list new-name 'edited
+ (vc-bzr-create-extra-fileinfo old-name)) result)))
+ (t
(push (list (buffer-substring-no-properties
(+ (point) 4)
(line-end-position))
- translated) result))
+ translated) result)))
(forward-line))
(funcall update-function result)))