diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 6c814b195..fcc53e2e3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -191,7 +191,7 @@ (:desc "git" :prefix "g" :desc "Magit blame" :n "b" #'magit-blame :desc "Magit commit" :n "c" #'magit-commit - :desc "Magit clone" :n "C" #'magit-clone + :desc "Magit clone" :n "C" #'+magit/clone :desc "Magit dispatch" :n "d" #'magit-dispatch-popup :desc "Magit find-file" :n "f" #'magit-find-file :desc "Magit status" :n "g" #'magit-status diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index c99088050..925032f49 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -20,3 +20,34 @@ (kill-process process) (kill-buffer buf))))))) +(defvar +magit-clone-history nil + "History for `+magit/clone' prompt.") +;;;###autoload +(defun +magit/clone (url-or-repo dir) + "Delegates to `magit-clone' or `magithub-clone' depending on the repo url +format." + (interactive + (progn + (require 'magithub) + (let* ((user (ghubp-username)) + (repo (read-from-minibuffer + "Clone repository (user/repo or url): " + (if user (concat user "/")) + nil nil '+magit-clone-history)) + (name (car (last (split-string repo "/" t))))) + (list repo + (read-directory-name + "Destination: " + magithub-clone-default-directory + name nil name))))) + (require 'magithub) + (if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" url-or-repo) + (let ((repo `((owner (login . ,(match-string 1 url-or-repo))) + (name . ,(match-string 2 url-or-repo))))) + (and (or (magithub-request + (ghubp-get-repos-owner-repo repo)) + (let-alist repo + (user-error "Repository %s/%s does not exist" + .owner.login .name))) + (magithub-clone repo dir))) + (magit-clone url-or-repo dir)))