summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/vc-hg.el62
2 files changed, 59 insertions, 8 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index e201177aba6..338c19875f5 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -2,6 +2,11 @@
* vc.el (vc-dir-mode-map): Don't bind "r".
+ * vc-hg.el (vc-hg-extra-fileinfo): New defstruct.
+ (vc-hg-status-printer): New function.
+ (vc-hg-after-dir-status): Deal with copied and renamed files.
+ (vc-hg-dir-status): Add flag to show copied files.
+
2008-05-01 John Paul Wallington <jpw@pobox.com>
* ibuffer.el (ibuffer-last-sorting-mode): New variable.
diff --git a/lisp/vc-hg.el b/lisp/vc-hg.el
index d6cd13d3bd0..013bdcbed63 100644
--- a/lisp/vc-hg.el
+++ b/lisp/vc-hg.el
@@ -473,7 +473,27 @@ REV is the revision to check out into WORKFILE."
(define-derived-mode vc-hg-incoming-mode vc-hg-log-view-mode "Hg-Incoming")
-;; XXX Experimental function for the vc-dired replacement.
+(defstruct (vc-hg-extra-fileinfo
+ (:copier nil)
+ (:constructor vc-hg-create-extra-fileinfo (rename-state extra-name))
+ (:conc-name vc-hg-extra-fileinfo->))
+ rename-state ;; rename or copy state
+ extra-name) ;; original name for copies and rename targets, new name for
+
+(defun vc-hg-status-printer (info)
+ "Pretty-printer for the vc-dir-fileinfo structure."
+ (let ((extra (vc-dir-fileinfo->extra info)))
+ (vc-default-status-printer 'Hg info)
+ (when extra
+ (insert (propertize
+ (format " (%s %s)"
+ (case (vc-hg-extra-fileinfo->rename-state extra)
+ ('copied "copied from")
+ ('renamed-from "renamed from")
+ ('renamed-to "renamed to"))
+ (vc-hg-extra-fileinfo->extra-name extra))
+ 'face 'font-lock-comment-face)))))
+
(defun vc-hg-after-dir-status (update-function)
(let ((status-char nil)
(file nil)
@@ -484,24 +504,50 @@ REV is the revision to check out into WORKFILE."
(?M . edited)
(?I . ignored)
(?! . missing)
+ (? . copy-rename-line)
(?? . unregistered)))
(translated nil)
- (result nil))
+ (result nil)
+ (last-added nil)
+ (last-line-copy nil))
(goto-char (point-min))
(while (not (eobp))
- (setq status-char (char-after))
+ (setq translated (cdr (assoc (char-after) translation)))
(setq file
(buffer-substring-no-properties (+ (point) 2)
(line-end-position)))
- (setq translated (assoc status-char translation))
- (when (and translated (not (eq (cdr translated) 'up-to-date)))
- (push (list file (cdr translated)) result))
+ (cond ((not translated)
+ (setq last-line-copy nil))
+ ((eq translated 'up-to-date)
+ (setq last-line-copy nil))
+ ((eq translated 'copy-rename-line)
+ ;; For copied files the output looks like this:
+ ;; A COPIED_FILE_NAME
+ ;; ORIGINAL_FILE_NAME
+ (setf (nth 2 last-added)
+ (vc-hg-create-extra-fileinfo 'copied file))
+ (setq last-line-copy t))
+ ((and last-line-copy (eq translated 'removed))
+ ;; For renamed files the output looks like this:
+ ;; A NEW_FILE_NAME
+ ;; ORIGINAL_FILE_NAME
+ ;; R ORIGINAL_FILE_NAME
+ ;; We need to adjust the previous entry to not think it is a copy.
+ (setf (vc-hg-extra-fileinfo->rename-state (nth 2 last-added))
+ 'renamed-from)
+ (push (list file translated
+ (vc-hg-create-extra-fileinfo
+ 'renamed-to (nth 0 last-added))) result)
+ (setq last-line-copy nil))
+ (t
+ (setq last-added (list file translated nil))
+ (push last-added result)
+ (setq last-line-copy nil)))
(forward-line))
(funcall update-function result)))
-;; XXX Experimental function for the vc-dired replacement.
(defun vc-hg-dir-status (dir update-function)
- (vc-hg-command (current-buffer) 'async dir "status")
+ (vc-hg-command (current-buffer) 'async dir "status" "-C")
(vc-exec-after
`(vc-hg-after-dir-status (quote ,update-function))))