From: Dan Nicolaescu Date: Fri, 20 Jul 2007 00:09:17 +0000 (+0000) Subject: * vc-hg.el (vc-hg-print-log): Deal with multiple file arguments. X-Git-Tag: emacs-pretest-23.0.90~11832 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a6ea7ffc2002875c2e396a90f57f5d106fd0fab4;p=emacs.git * vc-hg.el (vc-hg-print-log): Deal with multiple file arguments. (vc-hg-registered): Replace if with when. (vc-hg-state): Deal with nonexistent files and handle removed files. (vc-hg-dir-state, vc-hg-dired-state-info): New functions. (vc-hg-checkout): Re-enable. (vc-hg-create-repo): Fix typos. * vc.el: Fix typo. * vc-mcvs.el (vc-mcvs-create-repo): Fix typos. * vc-bzr.el (vc-bzr-create-repo): New function. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ed6d038d8d6..dca9dd64364 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,19 @@ +2007-07-20 Dan Nicolaescu + + * vc-hg.el (vc-hg-print-log): Deal with multiple file arguments. + (vc-hg-registered): Replace if with when. + (vc-hg-state): Deal with nonexistent files and handle removed + files. + (vc-hg-dir-state, vc-hg-dired-state-info): New functions. + (vc-hg-checkout): Re-enable. + (vc-hg-create-repo): Fix typos. + + * vc.el: Fix typo. + + * vc-mcvs.el (vc-mcvs-create-repo): Fix typos. + + * vc-bzr.el (vc-bzr-create-repo): New function. + 2007-07-19 Stefan Monnier * vc-hooks.el (vc-find-root): Walk up the tree to find an existing diff --git a/lisp/vc-bzr.el b/lisp/vc-bzr.el index e7a09450fd9..dc8004c25a8 100644 --- a/lisp/vc-bzr.el +++ b/lisp/vc-bzr.el @@ -196,6 +196,10 @@ Return nil if there isn't one." (defun vc-bzr-checkout-model (file) 'implicit) +(defun vc-bzr-create-repo () + "Create a new BZR repository." + (vc-bzr-command "init" nil 0 nil)) + (defun vc-bzr-register (files &optional rev comment) "Register FILE under bzr. Signal an error unless REV is nil. diff --git a/lisp/vc-hg.el b/lisp/vc-hg.el index 8003f347756..d56063b996c 100644 --- a/lisp/vc-hg.el +++ b/lisp/vc-hg.el @@ -4,7 +4,6 @@ ;; Author: Ivan Kanis ;; Keywords: tools -;; Version: 1889 ;; This file is part of GNU Emacs. @@ -39,18 +38,22 @@ ;; beginning of vc.el. The current status is: ;; FUNCTION NAME STATUS +;; BACKEND PROPERTIES +;; * revision-granularity OK +;; STATE-QUERYING FUNCTIONS ;; * 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 (files &optional rev comment) OK +;; * create-repo () OK ;; - init-version () NOT NEEDED ;; - responsible-p (file) OK ;; - could-register (file) OK @@ -58,7 +61,7 @@ ;; - unregister (file) COMMENTED OUT, MAY BE INCORRECT ;; * checkin (files 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 ;; - rollback (files) ?? PROBABLY NOT NEEDED ;; - merge (file rev1 rev2) NEEDED @@ -75,6 +78,7 @@ ;; * diff (files &optional rev1 rev2 buffer) OK ;; - revision-completion-table (file) ?? ;; - diff-tree (dir &optional rev1 rev2) TEST IT +;; - revision-completion-table (file) ?? ;; - annotate-command (file buf &optional rev) OK ;; - annotate-time () OK ;; - annotate-current-time () ?? NOT NEEDED @@ -143,8 +147,8 @@ ;; Modelled after the similar function in vc-bzr.el (defun vc-hg-registered (file) "Return non-nil if FILE is registered with hg." - (if (vc-hg-root file) ; short cut - (vc-hg-state file))) ; expensive + (when (vc-hg-root file) ; short cut + (vc-hg-state file))) ; expensive (defun vc-hg-state (file) "Hg-specific version of `vc-state'." @@ -165,13 +169,41 @@ (error nil))))))) (when (eq 0 status) (if (eq 0 (length out)) 'up-to-date - (let ((state (aref out 0))) - (cond - ((eq state ?M) 'edited) - ((eq state ?A) 'edited) - ((eq state ?P) 'needs-patch) - ((eq state ??) nil) - (t 'up-to-date))))))) + (when (null (string-match ".*: No such file or directory$" out)) + (let ((state (aref out 0))) + (cond + ((eq state ?A) 'edited) + ((eq state ?M) 'edited) + ((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'." @@ -209,13 +241,18 @@ ;; If the buffer exists from a previous invocation it might be ;; read-only. (let ((inhibit-read-only t)) - (with-current-buffer - buffer - (insert "File: " (vc-delistify (mapcar (lambda (file) (file-name-nondirectory file)) files)) "\n"))) - (vc-hg-command - buffer - (if (and (vc-stay-local-p file) (fboundp 'start-process)) 'async 0) - files "log")) + ;; We need to loop and call "hg log" on each file separately. + ;; "hg log" with multiple file arguments mashes all the logs + ;; together. + (dolist (file files) + (with-current-buffer + buffer + (insert "File: " (file-name-nondirectory file) "\n")) + (vc-hg-command + buffer + ;; XXX Is this stuff really needed? + (if (and (vc-stay-local-p file) (fboundp 'start-process)) 'async 0) + file "log")))) (defvar log-view-message-re) (defvar log-view-file-re) @@ -327,7 +364,7 @@ COMMENT is ignored." (defun vc-hg-create-repo () "Create a new Mercurial repository." - (vc-do-command nil 0 "svn" '("init"))) + (vc-hg-command nil nil nil "init")) (defalias 'vc-hg-responsible-p 'vc-hg-root) @@ -360,24 +397,29 @@ REV is ignored." (vc-hg-command buffer nil file "cat")))) ;; 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 diff --git a/lisp/vc-mcvs.el b/lisp/vc-mcvs.el index 30ec751c69c..928f2978ec1 100644 --- a/lisp/vc-mcvs.el +++ b/lisp/vc-mcvs.el @@ -207,9 +207,9 @@ This is only meaningful if you don't use the implicit checkout model ;;; State-changing functions ;;; -(defun vc-cvs-create-repo () - "Create a new CVS repository." - (error "Creation of CVS repositories is not supported.")) +(defun vc-mcvs-create-repo () + "Create a new Meta-CVS repository." + (error "Creation of Meta-CVS repositories is not supported.")) (defun vc-mcvs-register (files &optional rev comment) "Register FILES into the Meta-CVS version-control system. diff --git a/lisp/vc.el b/lisp/vc.el index d881219b187..b5ae94d8bdd 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -177,7 +177,7 @@ ;; ;; STATE-CHANGING FUNCTIONS ;; -;; * create-repo (backend) +;; * create-repo () ;; ;; Create an empty repository in the current directory and initialize ;; it so VC mode can add files to it. For file-oriented systems, this