emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 2624d1e: * admin/archive-contents.el: Use `git worktree` f


From: Stefan Monnier
Subject: [elpa] master 2624d1e: * admin/archive-contents.el: Use `git worktree` for externals
Date: Sun, 23 Apr 2017 14:04:19 -0400 (EDT)

branch: master
commit 2624d1e30fd3744d30ef928343f557f6a898fb2b
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * 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)))))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]