emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

vc-update for bzr etc.


From: Chong Yidong
Subject: vc-update for bzr etc.
Date: Sun, 21 Nov 2010 10:43:22 -0500

[I sent this yesterday, but the message didn't show up; resending.]

>From vc.el:

;; - vc-update/vc-merge should deal with VC systems that don't
;;   update/merge on a file basis, but on a whole repository basis.
;;   vc-update and vc-merge assume the arguments are always files,
;;   they don't deal with directories.  Make sure the *vc-dir* buffer
;;   is updated after these operations.
;;   At least bzr, git and hg should benefit from this.

Here's a quick stab at this.  If a backend defines vc-BACK-merge-news
(svn and cvs), vc-update tries a per-file update unless a prefix
argument is supplied.  Otherwise, it tries vc-BACK-update-repository, a
new VC backend function.  Included is an implementation for bzr,
vc-bzr-update-repository, which runs asynchronously and outputs to a
*vc-update* buffer (currently Fundamental mode, but can be improved).

Thoughts?  Any subtleties here that I'm missing?


=== modified file 'lisp/vc/vc-bzr.el'
*** lisp/vc/vc-bzr.el   2010-11-09 20:07:10 +0000
--- lisp/vc/vc-bzr.el   2010-11-21 00:55:37 +0000
***************
*** 236,241 ****
--- 236,253 ----
      (when rootdir
           (file-relative-name filename* rootdir))))
  
+ (defun vc-bzr-update-repository ()
+   "Update the current Bzr repository."
+   (let ((buf (get-buffer-create "*vc-update*"))
+       (dir default-directory))
+     (display-buffer buf)
+     (with-current-buffer buf
+       (goto-char (point-max))
+       (unless (eq (point) (point-min))
+       (insert "\n"))
+       (insert "Running \"bzr update\" for \"" dir "\"...\n")
+       (vc-bzr-command "update" t 'async nil))))
+ 
  (defun vc-bzr-status (file)
    "Return FILE status according to Bzr.
  Return value is a cons (STATUS . WARNING), where WARNING is a

=== modified file 'lisp/vc/vc.el'
*** lisp/vc/vc.el       2010-11-12 13:44:46 +0000
--- lisp/vc/vc.el       2010-11-21 01:25:39 +0000
***************
*** 2274,2308 ****
  (define-obsolete-function-alias 'vc-revert-buffer 'vc-revert "23.1")
  
  ;;;###autoload
! (defun vc-update ()
!   "Update the current fileset's files to their tip revisions.
! For each one that contains no changes, and is not locked, then this simply
! replaces the work file with the latest revision on its branch.  If the file
! contains changes, and the backend supports merging news, then any recent
! changes from the current branch are merged into the working file."
!   (interactive)
!   (let* ((vc-fileset (vc-deduce-fileset))
         (backend (car vc-fileset))
         (files (cadr vc-fileset)))
!     (save-some-buffers          ; save buffers visiting files
!      nil (lambda ()
!            (and (buffer-modified-p)
!                 (let ((file (buffer-file-name)))
!                   (and file (member file files))))))
!     (dolist (file files)
!       (if (vc-up-to-date-p file)
!         (vc-checkout file nil t)
!       (if (eq (vc-checkout-model backend (list file)) 'locking)
!           (if (eq (vc-state file) 'edited)
!               (error "%s"
!                      (substitute-command-keys
!                       "File is locked--type \\[vc-revert] to discard 
changes"))
!             (error "Unexpected file state (%s) -- type %s"
!                    (vc-state file)
!                    (substitute-command-keys
!                     "\\[vc-next-action] to correct")))
!           (vc-maybe-resolve-conflicts
!            file (vc-call-backend backend 'merge-news file)))))))
  
  (defun vc-version-backup-file (file &optional rev)
    "Return name of backup file for revision REV of FILE.
--- 2274,2321 ----
  (define-obsolete-function-alias 'vc-revert-buffer 'vc-revert "23.1")
  
  ;;;###autoload
! (defun vc-update (&optional arg)
!   "Update the current fileset or repository.
! If the version control system supports only repository-wide
! updates, update the repository.
! 
! Otherwise, if prefix ARG is omitted or nil, update the files in
! the current fileset to their tip revisions.  For each file that
! contains no changes, and is not locked, then this simply replaces
! the work file with the latest revision on its branch.  If the
! file contains changes, and the backend supports merging news,
! then any recent changes from the current branch are merged into
! the working file.  If ARG is non-nil, update the entire
! repository instead."
!   (interactive "P")
!   (when buffer-file-name (vc-buffer-sync t))
!   (let* ((vc-fileset (vc-deduce-fileset t))
         (backend (car vc-fileset))
         (files (cadr vc-fileset)))
!     (cond
!      ;; If VCS has `merge-news' functionality (CVS and SVN), use it.
!      ((and (vc-find-backend-function backend 'merge-news)
!          (not arg))
!       (save-some-buffers ; save buffers visiting files
!        nil (lambda ()
!            (and (buffer-modified-p)
!                 (let ((file (buffer-file-name)))
!                   (and file (member file files))))))
!       (dolist (file files)
!       (if (vc-up-to-date-p file)
!           (vc-checkout file nil t)
!         (vc-maybe-resolve-conflicts
!          file (vc-call-backend backend 'merge-news file)))))
!      ;; Otherwise, try updating the entire repository.
!      ((or arg (vc-find-backend-function backend 'update-repository))
!       (vc-call-backend backend 'update-repository))
!      ;; For a locking VCS, check out each file.
!      ((eq (vc-checkout-model backend files) 'locking)
!       (dolist (file files)
!       (if (vc-up-to-date-p file)
!           (vc-checkout file nil t))))
!      (t
!       (error "VC update is unsupported for `%s'" backend)))))
  
  (defun vc-version-backup-file (file &optional rev)
    "Return name of backup file for revision REV of FILE.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]