Function: package-vc--clone
package-vc--clone is a byte-compiled function defined in
package-vc.el.gz.
Signature
(package-vc--clone PKG-DESC PKG-SPEC DIR REV)
Documentation
Clone the package PKG-DESC whose spec is PKG-SPEC into the directory DIR.
REV specifies a specific revision to checkout. This overrides the :branch attribute in PKG-SPEC.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/package-vc.el.gz
(defun package-vc--clone (pkg-desc pkg-spec dir rev)
"Clone the package PKG-DESC whose spec is PKG-SPEC into the directory DIR.
REV specifies a specific revision to checkout. This overrides the `:branch'
attribute in PKG-SPEC."
(pcase-let* ((name (package-desc-name pkg-desc))
((map :url :branch) pkg-spec))
;; Clone the repository into `repo-dir' if necessary
(unless (file-exists-p dir)
(make-directory (file-name-directory dir) t)
(let ((backend (or (plist-get pkg-spec :vc-backend)
(vc-guess-url-backend url)
(plist-get (alist-get (package-desc-archive pkg-desc)
package-vc--archive-data-alist
nil nil #'string=)
:vc-backend)
package-vc-default-backend)))
(unless (vc-clone url backend dir
(or (and (not (eq rev :last-release)) rev) branch))
(error "Failed to clone %s from %s" name url))))
(when package-vc-register-as-project
(let ((default-directory dir))
(require 'project)
(project-remember-projects-under dir)))
;; Check out the latest release if requested
(when (eq rev :last-release)
(if-let* ((release-rev (package-vc--release-rev pkg-desc)))
(progn
(vc-retrieve-tag dir release-rev)
(when-let* ((vers (version-to-list
(lm-package-version (package-vc--main-file pkg-desc))))
(prev-desc (package-get-descriptor
name 'installed
(lambda (desc)
(version-list-= (package-desc-version desc)
vers))))
(_ (yes-or-no-p "Copy files from previous installation?")))
(let* ((remove (seq-remove
#'file-exists-p
(let ((default-directory dir))
(mapcar #'expand-file-name '("README-elpa"))))))
(copy-directory
(file-name-as-directory (package-desc-dir prev-desc))
(file-name-as-directory dir)
nil 'parents 'copy-contents)
(mapc #'delete-file remove))))
(message "No release revision was found, continuing...")))))