;;; vc-hg.el --- VC backend for the mercurial version control system
-;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
;; Author: Ivan Kanis
;; Keywords: tools
;; * registered (file) OK
;; * state (file) OK
;; - state-heuristic (file) NOT NEEDED
+;; - dir-status (dir update-function) OK
+;; - dir-status-files (dir files ds uf) OK
+;; - dir-extra-headers (dir) OK
+;; - dir-printer (fileinfo) OK
;; * working-revision (file) OK
;; - latest-on-branch-p (file) ??
;; * checkout-model (files) OK
;; - workfile-unchanged-p (file) OK
;; - mode-line-string (file) NOT NEEDED
-;; - prettify-state-info (file) OK
;; STATE-CHANGING FUNCTIONS
;; * register (files &optional rev comment) OK
;; * create-repo () OK
;; - annotate-current-time () NOT NEEDED
;; - annotate-extract-revision-at-line () OK
;; TAG SYSTEM
-;; - create-tag (dir name branchp) NEEDED
-;; - retrieve-tag (dir name update) NEEDED
+;; - create-tag (dir name branchp) NEEDED
+;; - retrieve-tag (dir name update) NEEDED
;; MISCELLANEOUS
;; - make-version-backups-p (file) ??
;; - repository-hostname (dirname) ??
;; - delete-file (file) TEST IT
;; - rename-file (old new) OK
;; - find-file-hook () PROBABLY NOT NEEDED
-;; - find-file-not-found-hook () PROBABLY NOT NEEDED
;; 2) Implement Stefan Monnier's advice:
;; vc-hg-registered and vc-hg-state
;;; Customization options
(defcustom vc-hg-global-switches nil
- "*Global switches to pass to any Hg command."
+ "Global switches to pass to any Hg command."
:type '(choice (const :tag "None" nil)
(string :tag "Argument String")
- (repeat :tag "Argument List"
- :value ("")
- string))
+ (repeat :tag "Argument List" :value ("") string))
:version "22.2"
:group 'vc)
+(defcustom vc-hg-diff-switches t ; Hg doesn't support common args like -u
+ "String or list of strings specifying switches for Hg diff under VC.
+If nil, use the value of `vc-diff-switches'. If t, use no switches."
+ :type '(choice (const :tag "Unspecified" nil)
+ (const :tag "None" t)
+ (string :tag "Argument String")
+ (repeat :tag "Argument List" :value ("") string))
+ :version "23.1"
+ :group 'vc)
+
\f
;;; Properties of the backend
;;; History functions
+(defcustom vc-hg-log-switches nil
+ "String or list of strings specifying switches for hg log under VC."
+ :type '(choice (const :tag "None" nil)
+ (string :tag "Argument String")
+ (repeat :tag "Argument List" :value ("") string))
+ :group 'vc-hg)
+
(defun vc-hg-print-log (files &optional buffer)
"Get change log associated with FILES."
;; `log-view-mode' needs to have the file names in order to function
(let ((inhibit-read-only t))
(with-current-buffer
buffer
- (vc-hg-command buffer 0 files "log"))))
+ (apply 'vc-hg-command buffer 0 files "log" vc-hg-log-switches))))
(defvar log-view-message-re)
(defvar log-view-file-re)
(defun vc-hg-diff (files &optional oldvers newvers buffer)
"Get a difference report using hg between two revisions of FILES."
(let* ((firstfile (car files))
+ (cwd (if firstfile (file-name-directory firstfile)
+ (expand-file-name default-directory)))
(working (and firstfile (vc-working-revision firstfile))))
(when (and (equal oldvers working) (not newvers))
(setq oldvers nil))
(when (and (not oldvers) newvers)
(setq oldvers working))
(apply #'vc-hg-command (or buffer "*vc-diff*") nil
- (mapcar (lambda (file) (file-name-nondirectory file)) files)
- "--cwd" (or (when firstfile (file-name-directory firstfile))
- (expand-file-name default-directory))
+ (mapcar (lambda (file) (file-relative-name file cwd)) files)
+ "--cwd" cwd
"diff"
(append
+ (vc-switches 'hg 'diff)
(when oldvers
(if newvers
(list "-r" oldvers "-r" newvers)
rename-state ;; rename or copy state
extra-name) ;; original name for copies and rename targets, new name for
-(declare-function vc-default-status-printer "vc-dir" (backend fileentry))
+(declare-function vc-default-dir-printer "vc-dir" (backend fileentry))
-(defun vc-hg-status-printer (info)
+(defun vc-hg-dir-printer (info)
"Pretty-printer for the vc-dir-fileinfo structure."
(let ((extra (vc-dir-fileinfo->extra info)))
- (vc-default-status-printer 'Hg info)
+ (vc-default-dir-printer 'Hg info)
(when extra
(insert (propertize
(format " (%s %s)"
(vc-exec-after
`(vc-hg-after-dir-status (quote ,update-function))))
-(defun vc-hg-status-extra-header (name &rest commands)
+(defun vc-hg-dir-status-files (dir files default-state update-function)
+ (apply 'vc-hg-command (current-buffer) 'async dir "status" "-C" files)
+ (vc-exec-after
+ `(vc-hg-after-dir-status (quote ,update-function))))
+
+(defun vc-hg-dir-extra-header (name &rest commands)
(concat (propertize name 'face 'font-lock-type-face)
(propertize
(with-temp-buffer
(buffer-substring-no-properties (point-min) (1- (point-max))))
'face 'font-lock-variable-name-face)))
-(defun vc-hg-status-extra-headers (dir)
+(defun vc-hg-dir-extra-headers (dir)
"Generate extra status headers for a Mercurial tree."
(let ((default-directory dir))
(concat
- (vc-hg-status-extra-header "Root : " "root") "\n"
- (vc-hg-status-extra-header "Branch : " "id" "-b") "\n"
- (vc-hg-status-extra-header "Tags : " "id" "-t") ; "\n"
+ (vc-hg-dir-extra-header "Root : " "root") "\n"
+ (vc-hg-dir-extra-header "Branch : " "id" "-b") "\n"
+ (vc-hg-dir-extra-header "Tags : " "id" "-t") ; "\n"
;; these change after each commit
- ;; (vc-hg-status-extra-header "Local num : " "id" "-n") "\n"
- ;; (vc-hg-status-extra-header "Global id : " "id" "-i")
+ ;; (vc-hg-dir-extra-header "Local num : " "id" "-n") "\n"
+ ;; (vc-hg-dir-extra-header "Global id : " "id" "-i")
)))
;; FIXME: this adds another top level menu, instead figure out how to