# HG changeset patch # User Dan Nicolaescu # Date 1184558334 0 # Node ID 9cbb2ce8ec8cff220fd6e781225917d5163dc818 # Parent 59b0e1e3faf111a465e77ce6a40830e0fba2d143 (vc-hg-state): Handle removed files. (vc-hg-dir-state, vc-hg-dired-state-info): New functions. (vc-hg-checkout): Re-enable. diff -r 59b0e1e3faf1 -r 9cbb2ce8ec8c lisp/ChangeLog --- a/lisp/ChangeLog Mon Jul 16 03:50:51 2007 +0000 +++ b/lisp/ChangeLog Mon Jul 16 03:58:54 2007 +0000 @@ -1,3 +1,9 @@ +2007-07-16 Dan Nicolaescu + + * vc-hg.el (vc-hg-state): Handle removed files. + (vc-hg-dir-state, vc-hg-dired-state-info): New functions. + (vc-hg-checkout): Re-enable. + 2007-07-15 Richard Stallman * kmacro.el (kmacro-bind-to-key): Avoid comparisons on function keys. diff -r 59b0e1e3faf1 -r 9cbb2ce8ec8c lisp/vc-hg.el --- a/lisp/vc-hg.el Mon Jul 16 03:50:51 2007 +0000 +++ b/lisp/vc-hg.el Mon Jul 16 03:58:54 2007 +0000 @@ -42,13 +42,13 @@ ;; * registered (file) OK ;; * state (file) OK ;; - state-heuristic (file) ?? PROBABLY NOT NEEDED -;; - dir-state (dir) NEEDED +;; - dir-state (dir) OK ;; * workfile-version (file) OK ;; - latest-on-branch-p (file) ?? ;; * checkout-model (file) OK ;; - workfile-unchanged-p (file) ?? ;; - mode-line-string (file) NOT NEEDED -;; - dired-state-info (file) NEEDED +;; - dired-state-info (file) OK ;; STATE-CHANGING FUNCTIONS ;; * register (file &optional rev comment) OK ;; - init-version () NOT NEEDED @@ -58,7 +58,7 @@ ;; - unregister (file) COMMENTED OUT, MAY BE INCORRECT ;; * checkin (file rev comment) OK ;; * find-version (file rev buffer) OK -;; * checkout (file &optional editable rev) NOT NEEDED, COMMENTED OUT +;; * checkout (file &optional editable rev) OK ;; * revert (file &optional contents-done) OK ;; - cancel-version (file editable) ?? PROBABLY NOT NEEDED ;; - merge (file rev1 rev2) NEEDED @@ -113,10 +113,6 @@ (eval-when-compile (require 'vc)) -;; XXX This should be moved to vc-hooks after this gets a bit more -;; testing in the trunk. -(add-to-list 'vc-handled-backends 'HG) - ;;; Customization options (defcustom vc-hg-global-switches nil @@ -165,12 +161,39 @@ (if (eq 0 (length out)) 'up-to-date (let ((state (aref out 0))) (cond + ((eq state ?A) 'edited) ((eq state ?M) 'edited) - ((eq state ?A) 'edited) - ((eq state ?P) 'needs-patch) + ((eq state ?R) nil) ((eq state ??) nil) (t 'up-to-date))))))) +(defun vc-hg-dir-state (dir) + (with-temp-buffer + (vc-hg-command (current-buffer) nil nil "status") + (goto-char (point-min)) + (let ((status-char nil) + (file nil)) + (while (eq 0 (forward-line)) + (setq status-char (char-after)) + (setq file + (expand-file-name + (buffer-substring-no-properties (+ (point) 2) (line-end-position)))) + (cond + ;; The rest of the possible states in "hg status" output: + ;; R = removed + ;; ! = deleted, but still tracked + ;; ? = not tracked + ;; should not show up in vc-dired, so don't deal with them + ;; here. + ((eq status-char ?A) + (vc-file-setprop file 'vc-workfile-version "0") + (vc-file-setprop file 'vc-state 'edited)) + ((eq status-char ?M) + (vc-file-setprop file 'vc-state 'edited)) + ((eq status-char ??) + (vc-file-setprop file 'vc-backend 'none) + (vc-file-setprop file 'vc-state 'nil))))))) + (defun vc-hg-workfile-version (file) "Hg-specific version of `vc-workfile-version'." (let* @@ -355,22 +378,29 @@ ;; Modelled after the similar function in vc-bzr.el ;; This should not be needed, `vc-hg-find-version' provides the same ;; functionality. -;; (defun vc-hg-checkout (file &optional editable rev workfile) -;; "Retrieve a revision of FILE into a WORKFILE. -;; EDITABLE is ignored. -;; REV is the revision to check out into WORKFILE." -;; (unless workfile -;; (setq workfile (vc-version-backup-file-name file rev))) -;; (let ((coding-system-for-read 'binary) -;; (coding-system-for-write 'binary)) -;; (with-temp-file workfile -;; (if rev -;; (vc-hg-command t nil file "cat" "-r" rev) -;; (vc-hg-command t nil file "cat"))))) +(defun vc-hg-checkout (file &optional editable rev) + "Retrieve a revision of FILE. +EDITABLE is ignored. +REV is the revision to check out into WORKFILE." + (let ((coding-system-for-read 'binary) + (coding-system-for-write 'binary)) + (with-current-buffer (or (get-file-buffer file) (current-buffer)) + (if rev + (vc-hg-command t nil file "cat" "-r" rev) + (vc-hg-command t nil file "cat"))))) (defun vc-hg-checkout-model (file) 'implicit) +(defun vc-hg-dired-state-info (file) + "Hg-specific version of `vc-dired-state-info'." + (let ((hg-state (vc-state file))) + (if (eq hg-state 'edited) + (if (equal (vc-workfile-version file) "0") + "(added)" "(modified)") + ;; fall back to the default VC representation + (vc-default-dired-state-info 'HG file)))) + ;; Modelled after the similar function in vc-bzr.el (defun vc-hg-revert (file &optional contents-done) (unless contents-done