Mercurial > emacs
changeset 98519:4031fe2e11ee
(vc-svn-after-dir-status): Handle `svn status -u' output.
(vc-svn-dir-status): Respect vc-stay-local-p. (Bug#1046)
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Sat, 04 Oct 2008 20:23:54 +0000 |
parents | 31c64334579f |
children | 291daaa78213 |
files | lisp/vc-svn.el |
diffstat | 1 files changed, 19 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/vc-svn.el Sat Oct 04 19:55:00 2008 +0000 +++ b/lisp/vc-svn.el Sat Oct 04 20:23:54 2008 +0000 @@ -1,6 +1,7 @@ ;;; vc-svn.el --- non-resident support for Subversion version-control -;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 +;; Free Software Foundation, Inc. ;; Author: FSF (see vc.el for full credits) ;; Maintainer: Stefan Monnier <monnier@gnu.org> @@ -146,7 +147,9 @@ "SVN-specific state heuristic." (vc-svn-state file 'local)) -(defun vc-svn-after-dir-status (callback) +;; FIXME it would be better not to have the "remote" argument, +;; but to distinguish the two output formats based on content. +(defun vc-svn-after-dir-status (callback &optional remote) (let ((state-map '((?A . added) (?C . conflict) (?D . removed) @@ -156,11 +159,18 @@ (?? . unregistered) ;; This is what vc-svn-parse-status does. (?~ . edited))) + (re (if remote "^\\(.\\)..... \\([ *]\\) +[-0-9]+ +\\(.*\\)$" + ;; Subexp 2 is a dummy in this case, so the numbers match. + "^\\(.\\)....\\(.\\) \\(.*\\)$")) result) (goto-char (point-min)) - (while (re-search-forward "^\\(.\\)..... \\(.*\\)$" nil t) + (while (re-search-forward re nil t) (let ((state (cdr (assq (aref (match-string 1) 0) state-map))) - (filename (match-string 2))) + (filename (match-string 3))) + (and remote (string-equal (match-string 2) "*") + ;; FIXME are there other possible combinations? + (cond ((eq state 'edited) (setq state 'needs-merge)) + ((not state) (setq state 'needs-update)))) (when state (setq result (cons (list filename state) result))))) (funcall callback result))) @@ -169,9 +179,12 @@ "Run 'svn status' for DIR and update BUFFER via CALLBACK. CALLBACK is called as (CALLBACK RESULT BUFFER), where RESULT is a list of conses (FILE . STATE) for directory DIR." - (vc-svn-command (current-buffer) 'async nil "status") + ;; FIXME should this rather be all the files in dir? + (let ((remote (not (vc-stay-local-p dir)))) + (vc-svn-command (current-buffer) 'async nil "status" + (if remote "-u")) (vc-exec-after - `(vc-svn-after-dir-status (quote ,callback)))) + `(vc-svn-after-dir-status (quote ,callback) ,remote)))) (defun vc-svn-dir-status-files (dir files default-state callback) (apply 'vc-svn-command (current-buffer) 'async nil "status" files)