about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-worktree.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-worktree.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-worktree.el173
1 files changed, 173 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-worktree.el b/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-worktree.el
new file mode 100644
index 0000000000..a0b94a94c8
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-worktree.el
@@ -0,0 +1,173 @@
+;;; magit-worktree.el --- worktree support  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2010-2018  The Magit Project Contributors
+;;
+;; You should have received a copy of the AUTHORS.md file which
+;; lists all contributors.  If not, see http://magit.vc/authors.
+
+;; Author: Jonas Bernoulli <jonas@bernoul.li>
+;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
+
+;; Magit is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; Magit is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+;; License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Magit.  If not, see http://www.gnu.org/licenses.
+
+;;; Commentary:
+
+;; This library implements support for `git-worktree'.
+
+;;; Code:
+
+(require 'magit)
+
+;;; Commands
+
+;;;###autoload (autoload 'magit-worktree-popup "magit-worktree" nil t)
+(magit-define-popup magit-worktree-popup
+  "Popup console for worktree commands."
+  :man-page "git-worktree"
+  :actions  '((?b "Create new worktree"            magit-worktree-checkout)
+              (?c "Create new branch and worktree" magit-worktree-branch)
+              (?p "Create new worktree from pull-request"
+                  magit-worktree-checkout-pull-request)
+              (?k "Delete worktree"                magit-worktree-delete)
+              (?g "Show status for worktree"       magit-worktree-status))
+  :max-action-columns 1)
+
+;;;###autoload
+(defun magit-worktree-checkout (path branch)
+  "Checkout BRANCH in a new worktree at PATH."
+  (interactive
+   (let ((branch (magit-read-local-branch-or-commit "Checkout")))
+     (list (read-directory-name (format "Checkout %s in new worktree: " branch))
+           branch)))
+  (magit-run-git "worktree" "add" (expand-file-name path) branch)
+  (magit-diff-visit-directory path))
+
+(defun magit-worktree-checkout-pull-request (path pr)
+  "Create, configure and checkout a new worktree from a pull-request.
+This is like `magit-checkout-pull-request', except that it
+also creates a new worktree. Please see the manual for more
+information."
+  (interactive
+   (let ((pr (magit-read-pull-request "Checkout pull request")))
+     (let-alist pr
+       (let ((path (let ((branch (magit--pullreq-branch pr t)))
+                     (read-directory-name
+                      (format "Checkout #%s as `%s' in new worktree: "
+                              .number branch)
+                      (file-name-directory
+                       (directory-file-name default-directory))
+                      nil nil
+                      (if (string-match-p "\\`pr-[0-9]+\\'" branch)
+                          (number-to-string .number)
+                        (format "%s-%s" .number .head.ref))))))
+         (when (equal path "")
+           (user-error "The empty string isn't a valid path"))
+         (list path pr)))))
+  (when (and (file-exists-p path)
+             (not (and (file-directory-p path)
+                       (= (length (directory-files "/tmp/testing/")) 2))))
+    (user-error "%s already exists and isn't empty" path))
+  (magit-worktree-checkout path
+                           (let ((inhibit-magit-refresh t))
+                             (magit-branch-pull-request pr))))
+
+;;;###autoload
+(defun magit-worktree-branch (path branch start-point &optional force)
+  "Create a new BRANCH and check it out in a new worktree at PATH."
+  (interactive
+   `(,(read-directory-name "Create worktree: ")
+     ,@(butlast (magit-branch-read-args "Create and checkout branch"))
+     ,current-prefix-arg))
+  (magit-run-git "worktree" "add" (if force "-B" "-b")
+                 branch (expand-file-name path) start-point)
+  (magit-diff-visit-directory path))
+
+(defun magit-worktree-delete (worktree)
+  "Delete a worktree, defaulting to the worktree at point.
+The primary worktree cannot be deleted."
+  (interactive
+   (list (magit-completing-read "Delete worktree"
+                                (cdr (magit-list-worktrees))
+                                nil t nil nil
+                                (magit-section-when (worktree)))))
+  (if (file-directory-p (expand-file-name ".git" worktree))
+      (user-error "Deleting %s would delete the shared .git directory" worktree)
+    (let ((primary (file-name-as-directory (caar (magit-list-worktrees)))))
+      (magit-confirm-files (if magit-delete-by-moving-to-trash 'trash 'delete)
+                           (list "worktree"))
+      (when (file-exists-p worktree)
+        (let ((delete-by-moving-to-trash magit-delete-by-moving-to-trash))
+          (delete-directory worktree t magit-delete-by-moving-to-trash)))
+      (if (file-exists-p default-directory)
+          (magit-run-git "worktree" "prune")
+        (let ((default-directory primary))
+          (magit-run-git "worktree" "prune"))
+        (when (derived-mode-p 'magit-status-mode)
+          (kill-buffer)
+          (magit-status-internal primary))))))
+
+(defun magit-worktree-status (worktree)
+  "Show the status for the worktree at point.
+If there is no worktree at point, then read one in the
+minibuffer.  If the worktree at point is the one whose
+status is already being displayed in the current buffer,
+then show it in Dired instead."
+  (interactive
+   (list (or (magit-section-when (worktree))
+             (magit-completing-read
+              "Show status for worktree"
+              (cl-delete (directory-file-name (magit-toplevel))
+                         (magit-list-worktrees)
+                         :test #'equal :key #'car)))))
+  (magit-diff-visit-directory worktree))
+
+;;; Sections
+
+(defvar magit-worktree-section-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [remap magit-visit-thing]  'magit-worktree-status)
+    (define-key map [remap magit-delete-thing] 'magit-worktree-delete)
+    map)
+  "Keymap for `worktree' sections.")
+
+(defun magit-insert-worktrees ()
+  "Insert sections for all worktrees.
+If there is only one worktree, then insert nothing."
+  (let ((worktrees (magit-list-worktrees)))
+    (when (> (length worktrees) 1)
+      (magit-insert-section (worktrees)
+        (magit-insert-heading "Worktrees:")
+        (let* ((cols
+                (mapcar (pcase-lambda (`(,path ,barep ,commit ,branch))
+                          (cons (cond
+                                 (branch (propertize branch
+                                                     'face 'magit-branch-local))
+                                 (commit (propertize (magit-rev-abbrev commit)
+                                                     'face 'magit-hash))
+                                 (barep  "(bare)"))
+                                path))
+                        worktrees))
+               (align (1+ (-max (--map (string-width (car it)) cols)))))
+          (pcase-dolist (`(,head . ,path) cols)
+            (magit-insert-section (worktree path)
+              (insert head)
+              (indent-to align)
+              (insert (let ((r (file-relative-name path))
+                            (a (abbreviate-file-name path)))
+                        (if (< (string-width r) (string-width a)) r a)))
+              (insert ?\n))))
+        (insert ?\n)))))
+
+(provide 'magit-worktree)
+;;; magit-worktree.el ends here