branch: elpa-admin commit 525076114bce71d13ebaec8de3fd587912f37907 Author: Stefan Monnier <monn...@iro.umontreal.ca> Commit: Stefan Monnier <monn...@iro.umontreal.ca>
* admin/archive-contents.el: Use `git worktree` for externals * admin/archive-contents.el (archive--use-worktree): New var. (archive--use-worktree-p): New function. (archive--external-package-sync): Use it to use `git worktree` when available. (archive--external-package-sync): Don't `git fetch` if this is a worktree. Shorten the output when it's a single line. --- admin/archive-contents.el | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/admin/archive-contents.el b/admin/archive-contents.el index af156b9..322eef9 100644 --- a/admin/archive-contents.el +++ b/admin/archive-contents.el @@ -607,9 +607,19 @@ Rename DIR/ to PKG-VERS/, and return the descriptor." (defun archive--pull (dirname) (let ((default-directory (archive--dirname dirname))) (with-temp-buffer - (message "Running git pull in %S" default-directory) - (archive-call t "git" "pull") - (message "Updated %s:\n%s" dirname (buffer-string))))) + (cond + ((file-directory-p ".git") + (message "Running git pull in %S" default-directory) + (archive-call t "git" "pull")) + ((file-exists-p ".git") + (message "Updating worktree in %S" default-directory) + (archive-call t "git" "merge")) + (t (error "No .git in %S" default-directory))) + (message "Updated %s:%s%s" dirname + (if (and (eobp) (bolp) + (eq (line-beginning-position 0) (point-min))) + " " "\n") + (buffer-string))))) ;;; Maintain external packages. @@ -688,6 +698,15 @@ If WITH-CORE is non-nil, it means we manage :core packages as well." ;; (delete-directory dir 'recursive t)))) ))))) +(defvar archive--use-worktree nil) +(defun archive--use-worktree-p () + (unless archive--use-worktree + (setq archive--use-worktree + (list + (ignore-errors + (zerop (call-process "git" nil nil nil "worktree" "--help")))))) + (car archive--use-worktree)) + (defun archive--external-package-sync (name) "Sync external package named NAME." (let ((default-directory (expand-file-name "packages/"))) @@ -695,14 +714,17 @@ If WITH-CORE is non-nil, it means we manage :core packages as well." (let* ((branch (concat "externals/" name)) (output (with-temp-buffer - ;; FIXME: Use `git worktree'! - (archive-call t "git" "clone" - "--reference" ".." "--single-branch" - "--branch" branch - archive--elpa-git-url name) + (if (archive--use-worktree-p) + (archive-call t "git" "worktree" "add" + "-b" branch + name (concat "origin/" branch)) + (archive-call t "git" "clone" + "--reference" ".." "--single-branch" + "--branch" branch + archive--elpa-git-url name)) (buffer-string)))) (message "Cloning branch %s:\n%s" name output))) - ((not (file-directory-p (concat name "/.git"))) + ((not (file-exists-p (concat name "/.git"))) (message "%s is in the way of an external, please remove!" name)) (t (archive--pull name)))))