diff options
Diffstat (limited to 'lisp/vc-svn.el')
-rw-r--r-- | lisp/vc-svn.el | 84 |
1 files changed, 46 insertions, 38 deletions
diff --git a/lisp/vc-svn.el b/lisp/vc-svn.el index ceb1df52eaf..ddecb89d77c 100644 --- a/lisp/vc-svn.el +++ b/lisp/vc-svn.el @@ -96,6 +96,10 @@ If you want to force an empty list of arguments, use t." (t ".svn")) "The name of the \".svn\" subdirectory or its equivalent.") +;;; Properties of the backend + +(defun vc-svn-revision-granularity () + 'repository) ;;; ;;; State-querying functions ;;; @@ -206,13 +210,19 @@ If you want to force an empty list of arguments, use t." ;;; State-changing functions ;;; -(defun vc-svn-register (file &optional rev comment) - "Register FILE into the SVN version-control system. -COMMENT can be used to provide an initial description of FILE. +(defun vc-svn-create-repo () + "Create a new SVN repository." + (vc-do-command nil 0 "svnadmin" '("create" "SVN")) + (vc-do-command nil 0 "svn" '(".") + "checkout" (concat "file://" default-directory "SVN"))) + +(defun vc-svn-register (files &optional rev comment) + "Register FILES into the SVN version-control system. +The COMMENT argument is ignored This does an add but not a commit. `vc-register-switches' and `vc-svn-register-switches' are passed to the SVN command (in that order)." - (apply 'vc-svn-command nil 0 file "add" (vc-switches 'SVN 'register))) + (apply 'vc-svn-command nil 0 files "add" (vc-switches 'SVN 'register))) (defun vc-svn-responsible-p (file) "Return non-nil if SVN thinks it is responsible for FILE." @@ -225,10 +235,11 @@ the SVN command (in that order)." "Return non-nil if FILE could be registered in SVN. This is only possible if SVN is responsible for FILE's directory.") -(defun vc-svn-checkin (file rev comment) +(defun vc-svn-checkin (files rev comment) "SVN-specific version of `vc-backend-checkin'." + (if rev (error "Committing to a specific revision is unsupported in SVN.")) (let ((status (apply - 'vc-svn-command nil 1 file "ci" + 'vc-svn-command nil 1 files "ci" (nconc (list "-m" comment) (vc-switches 'SVN 'checkin))))) (set-buffer "*vc*") (goto-char (point-min)) @@ -236,7 +247,8 @@ This is only possible if SVN is responsible for FILE's directory.") ;; Check checkin problem. (cond ((search-forward "Transaction is out of date" nil t) - (vc-file-setprop file 'vc-state 'needs-merge) + (mapc (lambda (file) (vc-file-setprop file 'vc-state 'needs-merge)) + files) (error (substitute-command-keys (concat "Up-to-date check failed: " "type \\[vc-next-action] to merge in changes")))) @@ -252,6 +264,7 @@ This is only possible if SVN is responsible for FILE's directory.") )) (defun vc-svn-find-version (file rev buffer) + "SVN-specific retrieval of a specified version into a buffer." (apply 'vc-svn-command buffer 0 file "cat" @@ -362,53 +375,41 @@ The changes are between FIRST-VERSION and SECOND-VERSION." ;;; History functions ;;; -(defun vc-svn-print-log (file &optional buffer) - "Get change log associated with FILE." +(defun vc-svn-print-log (files &optional buffer) + "Get change log(s) associated with FILES." (save-current-buffer (vc-setup-buffer buffer) (let ((inhibit-read-only t)) (goto-char (point-min)) ;; Add a line to tell log-view-mode what file this is. - (insert "Working file: " (file-relative-name file) "\n")) + (insert "Working file(s): " (vc-delistify (mapcar 'file-relative-name files)) "\n")) (vc-svn-command buffer - (if (and (vc-stay-local-p file) (fboundp 'start-process)) 'async 0) - file "log" + (if (and (= (length files) 1) (vc-stay-local-p (car files)) (fboundp 'start-process)) 'async 0) + files "log" ;; By default Subversion only shows the log upto the working version, ;; whereas we also want the log of the subsequent commits. At least ;; that's what the vc-cvs.el code does. "-rHEAD:0"))) -(defun vc-svn-diff (file &optional oldvers newvers buffer) - "Get a difference report using SVN between two versions of FILE." - (unless buffer (setq buffer "*vc-diff*")) - (if (and oldvers (equal oldvers (vc-workfile-version file))) - ;; Use nil rather than the current revision because svn handles it - ;; better (i.e. locally). - (setq oldvers nil)) - (if (string= (vc-workfile-version file) "0") - ;; This file is added but not yet committed; there is no master file. - (if (or oldvers newvers) - (error "No revisions of %s exist" file) - ;; We regard this as "changed". - ;; Diff it against /dev/null. - ;; Note: this is NOT a "svn diff". - (apply 'vc-do-command buffer - 1 "diff" file - (append (vc-switches nil 'diff) '("/dev/null"))) - ;; Even if it's empty, it's locally modified. - 1) - (let* ((switches +(defun vc-svn-wash-log () + "Remove all non-comment information from log output." + ;; FIXME: not implemented for SVN + nil) + +(defun vc-svn-diff (files &optional oldvers newvers buffer) + "Get a difference report using SVN between two versions of fileset FILES." + (let* ((switches (if vc-svn-diff-switches (vc-switches 'SVN 'diff) (list "-x" (mapconcat 'identity (vc-switches nil 'diff) " ")))) (async (and (not vc-disable-async-diff) - (vc-stay-local-p file) + (vc-stay-local-p files) (or oldvers newvers) ; Svn diffs those locally. (fboundp 'start-process)))) (apply 'vc-svn-command buffer (if async 'async 0) - file "diff" + files "diff" (append switches (when oldvers @@ -417,7 +418,7 @@ The changes are between FIRST-VERSION and SECOND-VERSION." (if async 1 ; async diff => pessimistic assumption ;; For some reason `svn diff' does not return a useful ;; status w.r.t whether the diff was empty or not. - (buffer-size (get-buffer buffer)))))) + (buffer-size (get-buffer buffer))))) (defun vc-svn-diff-tree (dir &optional rev1 rev2) "Diff all files at and below DIR." @@ -464,11 +465,16 @@ NAME is assumed to be a URL." ;;; Internal functions ;;; -(defun vc-svn-command (buffer okstatus file &rest flags) +(defcustom vc-svn-program "svn" + "Name of the svn executable." + :type 'string + :group 'vc) + +(defun vc-svn-command (buffer okstatus file-or-list &rest flags) "A wrapper around `vc-do-command' for use in vc-svn.el. The difference to vc-do-command is that this function always invokes `svn', and that it passes `vc-svn-global-switches' to it before FLAGS." - (apply 'vc-do-command buffer okstatus "svn" file + (apply 'vc-do-command buffer okstatus vc-svn-program file-or-list (if (stringp vc-svn-global-switches) (cons vc-svn-global-switches flags) (append vc-svn-global-switches @@ -487,7 +493,9 @@ and that it passes `vc-svn-global-switches' to it before FLAGS." ;; Old `svn' used name="svn:this_dir", newer use just name="". (concat "name=\"\\(?:svn:this_dir\\)?\"[\n\t ]*" "\\(?:[-a-z]+=\"[^\"]*\"[\n\t ]*\\)*?" - "url=\"\\([^\"]+\\)\"") nil t) + "url=\"\\(?1:[^\"]+\\)\"" + ;; Yet newer ones don't use XML any more. + "\\|^\ndir\n[0-9]+\n\\(?1:.*\\)") nil t) ;; This is not a hostname but a URL. This may actually be considered ;; as a feature since it allows vc-svn-stay-local to specify different ;; behavior for different modules on the same server. |