Function: vc-transfer-file
vc-transfer-file is an autoloaded and byte-compiled function defined
in vc.el.gz.
Signature
(vc-transfer-file FILE NEW-BACKEND)
Documentation
Transfer FILE to another version control system NEW-BACKEND.
If NEW-BACKEND has a higher precedence than FILE's current backend
(i.e. it comes earlier in vc-handled-backends), then register FILE in
NEW-BACKEND, using the revision number from the current backend as the
base level. If NEW-BACKEND has a lower precedence than the current
backend, then commit all changes that were made under the current
backend to NEW-BACKEND, and unregister FILE from the current backend.
(If FILE is not yet registered under NEW-BACKEND, register it.)
Source Code
;; Defined in /usr/src/emacs/lisp/vc/vc.el.gz
;;;###autoload
(defun vc-transfer-file (file new-backend)
"Transfer FILE to another version control system NEW-BACKEND.
If NEW-BACKEND has a higher precedence than FILE's current backend
\(i.e. it comes earlier in `vc-handled-backends'), then register FILE in
NEW-BACKEND, using the revision number from the current backend as the
base level. If NEW-BACKEND has a lower precedence than the current
backend, then commit all changes that were made under the current
backend to NEW-BACKEND, and unregister FILE from the current backend.
\(If FILE is not yet registered under NEW-BACKEND, register it.)"
(let* ((old-backend (vc-backend file))
(edited (memq (vc-state file) '(edited needs-merge)))
(registered (vc-call-backend new-backend 'registered file))
(move
(and registered ; Never move if not registered in new-backend yet.
;; move if new-backend comes later in vc-handled-backends
(or (memq new-backend (memq old-backend vc-handled-backends))
(y-or-n-p "Final transfer? "))))
(comment nil))
(when (eq old-backend new-backend)
(error "%s is the current backend of %s" new-backend file))
(if registered
(set-file-modes file (logior (file-modes file) 128))
;; `registered' might have switched under us.
(vc-change-backend file old-backend)
(let* ((rev (vc-working-revision file))
(modified-file (and edited (make-temp-file file)))
(unmodified-file (and modified-file (vc-version-backup-file file))))
;; Go back to the base unmodified file.
(unwind-protect
(progn
(when modified-file
(copy-file file modified-file 'ok-if-already-exists)
;; If we have a local copy of the unmodified file, handle that
;; here and not in vc-revert-file because we don't want to
;; delete that copy -- it is still useful for OLD-BACKEND.
(if unmodified-file
(copy-file unmodified-file file
'ok-if-already-exists 'keep-date)
(when (y-or-n-p "Get base revision from repository? ")
(vc-revert-file file))))
(vc-call-backend new-backend 'receive-file file rev))
(when modified-file
(vc-change-backend file new-backend)
(unless (eq (vc-checkout-model new-backend (list file)) 'implicit)
(vc-checkout file))
(rename-file modified-file file 'ok-if-already-exists)
(vc-file-setprop file 'vc-checkout-time nil)))))
(when move
(vc-change-backend file old-backend)
(setq comment (vc-call-backend old-backend 'comment-history file))
(vc-call-backend old-backend 'unregister file))
(vc-change-backend file new-backend)
(when (or move edited)
(vc-file-setprop file 'vc-state 'edited)
(vc-mode-line file new-backend)
(vc-checkin file new-backend comment (stringp comment)))))