From: Philip Kaludercic Date: Mon, 14 Feb 2022 11:33:11 +0000 (+0100) Subject: Add new command to clone a repository X-Git-Tag: emacs-29.0.90~1616^2~307^2~110 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=077c9badf9322845a8d2911e48392fa8f4c5939c;p=emacs.git Add new command to clone a repository * vc.el (vc-clone): Add command --- diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index a6124acadd2..fd0192fad2b 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -568,6 +568,11 @@ ;; containing FILE-OR-DIR. The optional REMOTE-NAME specifies the ;; remote (in Git parlance) whose URL is to be returned. It has ;; only a meaning for distributed VCS and is ignored otherwise. +;; +;; - clone (remote directory) +;; +;; Attempt to clone a REMOTE repository, into a local DIRECTORY. +;; Returns the symbol of the backend used if successful. ;;; Changes from the pre-25.1 API: ;; @@ -3233,6 +3238,27 @@ to provide the `find-revision' operation instead." (interactive) (vc-call-backend (vc-backend buffer-file-name) 'check-headers)) +(defun vc-clone (backend remote &optional directory) + "Use BACKEND to clone REMOTE into DIRECTORY. +If successful, returns the symbol of the backed used to clone. +If BACKEND is nil, iterate through every known backend in +`vc-handled-backends' until one succeeds." + (unless directory + (setq directory default-directory)) + (if backend + (progn + (unless (memq backend vc-handled-backends) + (error "Unknown VC backend %s" backend)) + (vc-call-backend backend 'clone remote directory) + backend) + (catch 'ok + (dolist (backend vc-handled-backends) + (ignore-error vc-not-supported + (when-let (res (vc-call-backend + backend 'clone + remote directory)) + (throw 'ok backend))))))) + ;; These things should probably be generally available