about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-bookmark.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-bookmark.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-bookmark.el366
1 files changed, 366 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-bookmark.el b/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-bookmark.el
new file mode 100644
index 000000000000..a2156a41620b
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-bookmark.el
@@ -0,0 +1,366 @@
+;;; magit-bookmark.el --- bookmark support for Magit  -*- 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: Yuri Khan <yuri.v.khan@gmail.com>
+;; 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:
+
+;; Support for bookmarks for most Magit buffers.
+
+;;; Code:
+
+(require 'magit)
+(require 'bookmark)
+
+;;; Supporting primitives
+
+(defun magit-bookmark--jump (bookmark fn &rest args)
+  "Handle a Magit BOOKMARK.
+
+This function will:
+
+1. Bind `default-directory' to the repository root directory
+   stored in the `filename' bookmark property.
+2. Invoke the function FN with ARGS as arguments.  This needs to
+   restore the buffer.
+3. Restore the expanded/collapsed status of top level sections
+   and the point position."
+  (declare (indent 2))
+  (let* ((default-directory (bookmark-get-filename bookmark)))
+    (if default-directory
+        (apply fn args)
+      (signal 'bookmark-error-no-filename (list 'stringp default-directory)))
+    (when (derived-mode-p 'magit-mode)
+      (when-let ((hidden-sections (bookmark-prop-get bookmark
+                                                     'magit-hidden-sections)))
+        (dolist (child (oref magit-root-section children))
+          (if (member (cons (oref child type)
+                            (oref child value))
+                      hidden-sections)
+              (magit-section-hide child)
+            (magit-section-show child)))))
+    (--when-let (bookmark-get-position bookmark)
+      (goto-char it))
+    (--when-let (bookmark-get-front-context-string bookmark)
+      (when (search-forward it (point-max) t)
+        (goto-char (match-beginning 0))))
+    (--when-let (bookmark-get-rear-context-string bookmark)
+      (when (search-backward it (point-min) t)
+        (goto-char (match-end 0))))
+    nil))
+
+(defun magit-bookmark--make-record (mode handler &optional make-props)
+  "Create a Magit bookmark.
+
+MODE specifies the expected major mode of current buffer.
+
+HANDLER should be a function that will be used to restore this
+buffer.
+
+MAKE-PROPS should be either nil or a function that will be called
+with `magit-refresh-args' as the argument list, and may return an
+alist whose every element has the form (PROP . VALUE) and
+specifies additional properties to store in the bookmark."
+  (declare (indent 1))
+  (unless (eq major-mode mode)
+    (user-error "Not in a %s buffer" mode))
+  (let ((bookmark (bookmark-make-record-default 'no-file)))
+    (bookmark-prop-set bookmark 'handler handler)
+    (bookmark-set-filename bookmark (magit-toplevel))
+    (when (derived-mode-p 'magit-mode)
+      (bookmark-prop-set
+       bookmark 'magit-hidden-sections
+       (--map (cons (oref it type)
+                    (oref it value))
+              (--filter (oref it hidden)
+                        (oref magit-root-section children)))))
+    (when make-props
+      (pcase-dolist (`(,prop . ,value) (apply make-props magit-refresh-args))
+        (bookmark-prop-set bookmark prop value)))
+    bookmark))
+
+;;; Status
+
+;;;###autoload
+(defun magit-bookmark--status-jump (bookmark)
+  "Handle a Magit status BOOKMARK."
+  (magit-bookmark--jump bookmark
+      (lambda () (magit-status-internal default-directory))))
+
+;;;###autoload
+(defun magit-bookmark--status-make-record ()
+  "Create a Magit status bookmark."
+  (magit-bookmark--make-record 'magit-status-mode
+    #'magit-bookmark--status-jump))
+
+;;; Refs
+
+;;;###autoload
+(defun magit-bookmark--refs-jump (bookmark)
+  "Handle a Magit refs BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-show-refs
+    (bookmark-prop-get bookmark 'magit-refs)
+    (bookmark-prop-get bookmark 'magit-args)))
+
+;;;###autoload
+(defun magit-bookmark--refs-make-record ()
+  "Create a Magit refs bookmark."
+  (magit-bookmark--make-record 'magit-refs-mode
+    #'magit-bookmark--refs-jump
+    (lambda (refs args)
+      `((magit-refs . ,refs)
+        (magit-args . ,args)))))
+
+;;; Log
+
+;;;###autoload
+(defun magit-bookmark--log-jump (bookmark)
+  "Handle a Magit log BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-log
+    (bookmark-prop-get bookmark 'magit-revs)
+    (bookmark-prop-get bookmark 'magit-args)
+    (bookmark-prop-get bookmark 'magit-files)))
+
+(defun magit-bookmark--log-make-name (buffer-name revs _args files)
+  "Generate the default name for a log bookmark."
+  (concat
+   buffer-name " " (mapconcat #'identity revs " ")
+   (and files
+        (concat " touching " (mapconcat #'identity files " ")))))
+
+;;;###autoload
+(defun magit-bookmark--log-make-record ()
+  "Create a Magit log bookmark."
+  (magit-bookmark--make-record 'magit-log-mode
+    #'magit-bookmark--log-jump
+    (lambda (revs args files)
+      `((defaults    . (,(magit-bookmark--log-make-name
+                          (buffer-name) revs args files)))
+        (magit-revs  . ,revs)
+        (magit-args  . ,args)
+        (magit-files . ,files)))))
+
+;;; Reflog
+
+;;;###autoload
+(defun magit-bookmark--reflog-jump (bookmark)
+  "Handle a Magit reflog BOOKMARK."
+  (magit-bookmark--jump bookmark
+      (lambda ()
+        (let ((magit-reflog-arguments (bookmark-prop-get bookmark 'magit-args)))
+          (magit-reflog (bookmark-prop-get bookmark 'magit-ref))))))
+
+(defun magit-bookmark--reflog-make-name (buffer-name ref)
+  "Generate the default name for a reflog bookmark."
+  (concat buffer-name " " ref))
+
+;;;###autoload
+(defun magit-bookmark--reflog-make-record ()
+  "Create a Magit reflog bookmark."
+  (magit-bookmark--make-record 'magit-reflog-mode
+    #'magit-bookmark--reflog-jump
+    (lambda (ref args)
+      `((defaults   . (,(magit-bookmark--reflog-make-name (buffer-name) ref)))
+        (magit-ref  . ,ref)
+        (magit-args . ,args)))))
+
+;;; Stashes
+
+;;;###autoload
+(defun magit-bookmark--stashes-jump (bookmark)
+  "Handle a Magit stash list BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-stash-list))
+
+;;;###autoload
+(defun magit-bookmark--stashes-make-record ()
+  "Create a Magit stash list bookmark."
+  (magit-bookmark--make-record 'magit-stashes-mode
+    #'magit-bookmark--stashes-jump))
+
+;;; Cherry
+
+;;;###autoload
+(defun magit-bookmark--cherry-jump (bookmark)
+  "Handle a Magit cherry BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-cherry
+    (bookmark-prop-get bookmark 'magit-head)
+    (bookmark-prop-get bookmark 'magit-upstream)))
+
+(defun magit-bookmark--cherry-make-name (buffer-name head upstream)
+  "Generate the default name for a cherry bookmark."
+  (concat buffer-name " " head " upstream " upstream))
+
+;;;###autoload
+(defun magit-bookmark--cherry-make-record ()
+  "Create a Magit cherry bookmark."
+  (magit-bookmark--make-record 'magit-cherry-mode
+    #'magit-bookmark--cherry-jump
+    (lambda (upstream head)
+      `((defaults       . (,(magit-bookmark--cherry-make-name
+                             (buffer-name) head upstream)))
+        (magit-head     . ,head)
+        (magit-upstream . ,upstream)))))
+
+;;; Diff
+
+;;;###autoload
+(defun magit-bookmark--diff-jump (bookmark)
+  "Handle a Magit diff BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-diff-setup
+    (bookmark-prop-get bookmark 'magit-rev-or-range)
+    (bookmark-prop-get bookmark 'magit-const)
+    (bookmark-prop-get bookmark 'magit-args)
+    (bookmark-prop-get bookmark 'magit-files)))
+
+(defun magit-bookmark--resolve (rev-or-range)
+  "Return REV-OR-RANGE with ref names resolved to commit hashes."
+  (pcase (magit-git-lines "rev-parse" rev-or-range)
+    (`(,rev)
+     (magit-rev-abbrev rev))
+    ((and `(,rev1 ,rev2)
+          (guard (/= ?^ (aref rev1 0)))
+          (guard (=  ?^ (aref rev2 0))))
+     (concat (magit-rev-abbrev (substring rev2 1))
+             ".."
+             (magit-rev-abbrev rev1)))
+    ((and `(,rev1 ,rev2 ,rev3)
+          (guard (/= ?^ (aref rev1 0)))
+          (guard (/= ?^ (aref rev2 0)))
+          (guard (=  ?^ (aref rev3 0))))
+     (ignore rev3)
+     (concat (magit-rev-abbrev rev1)
+             "..."
+             (magit-rev-abbrev rev2)))
+    (_
+     rev-or-range)))
+
+(defun magit-bookmark--diff-make-name
+    (buffer-name rev-or-range const _args files)
+  "Generate a default name for a diff bookmark."
+  (if (member "--no-index" const)
+      (apply #'format "*magit-diff %s %s" files)
+    (concat buffer-name " "
+            (cond (rev-or-range)
+                  ((member "--cached" const) "staged")
+                  (t                       "unstaged"))
+            (when files
+              (concat " in " (mapconcat #'identity files ", "))))))
+
+;;;###autoload
+(defun magit-bookmark--diff-make-record ()
+  "Create a Magit diff bookmark."
+  (magit-bookmark--make-record 'magit-diff-mode
+    #'magit-bookmark--diff-jump
+    (lambda (rev-or-range const args files)
+      (let ((resolved (magit-bookmark--resolve rev-or-range)))
+        `((defaults           . (,(magit-bookmark--diff-make-name
+                                   (buffer-name) resolved const args files)))
+          (magit-rev-or-range . ,resolved)
+          (magit-const        . ,const)
+          (magit-args         . ,args)
+          (magit-files        . ,files))))))
+
+;;; Revision
+
+;;;###autoload
+(defun magit-bookmark--revision-jump (bookmark)
+  "Handle a Magit revision BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-show-commit
+    (bookmark-prop-get bookmark 'magit-rev)
+    (bookmark-prop-get bookmark 'args)
+    (bookmark-prop-get bookmark 'files)))
+
+(defun magit-bookmark--revision-make-name (buffer-name rev _args files)
+  "Generate a default name for a revision bookmark."
+  (let ((subject (magit-rev-format "%s" rev)))
+    (concat buffer-name " "
+            (magit-rev-abbrev rev)
+            (cond (files   (concat " " (mapconcat #'identity files " ")))
+                  (subject (concat " " subject))))))
+
+;;;###autoload
+(defun magit-bookmark--revision-make-record ()
+  "Create a Magit revision bookmark."
+  ;; magit-refresh-args stores the revision in relative form.
+  ;; For bookmarks, the exact hash is more appropriate.
+  (magit-bookmark--make-record 'magit-revision-mode
+    #'magit-bookmark--revision-jump
+    (lambda (_rev _ args files)
+      `((defaults    . (,(magit-bookmark--revision-make-name
+                          (buffer-name) magit-buffer-revision-hash
+                          args files)))
+        (magit-rev   . ,magit-buffer-revision-hash)
+        (magit-args  . ,args)
+        (magit-files . ,files)))))
+
+;;; Stash
+
+;;;###autoload
+(defun magit-bookmark--stash-jump (bookmark)
+  "Handle a Magit stash BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-stash-show
+    (bookmark-prop-get bookmark 'magit-stash)
+    (bookmark-prop-get bookmark 'magit-args)
+    (bookmark-prop-get bookmark 'magit-files)))
+
+(defun magit-bookmark--stash-make-name (buffer-name stash _args files)
+  "Generate the default name for a stash bookmark."
+  (concat buffer-name " " stash " "
+          (if files
+              (mapconcat #'identity files " ")
+            (magit-rev-format "%s" stash))))
+
+;;;###autoload
+(defun magit-bookmark--stash-make-record ()
+  "Create a Magit stash bookmark."
+  (magit-bookmark--make-record 'magit-stash-mode
+    #'magit-bookmark--stash-jump
+    (lambda (stash _ args files)
+      `((defaults    . (,(magit-bookmark--stash-make-name
+                          (buffer-name)
+                          (magit-rev-abbrev magit-buffer-revision-hash)
+                          args files)))
+        (magit-stash . ,magit-buffer-revision-hash)
+        (magit-args  . ,args)
+        (magit-files . ,files)
+        (magit-hidden-sections
+         . ,(--map `(,(oref it type)
+                     . ,(replace-regexp-in-string (regexp-quote stash)
+                                                  magit-buffer-revision-hash
+                                                  (oref it value)))
+                   (--filter (oref it hidden)
+                             (oref magit-root-section children))))))))
+
+;;; Submodules
+
+;;;###autoload
+(defun magit-bookmark--submodules-jump (bookmark)
+  "Handle a Magit submodule list BOOKMARK."
+  (magit-bookmark--jump bookmark #'magit-list-submodules))
+
+;;;###autoload
+(defun magit-bookmark--submodules-make-record ()
+  "Create a Magit submodule list bookmark."
+  (magit-bookmark--make-record 'magit-submodule-list-mode
+    #'magit-bookmark--submodules-jump))
+
+(provide 'magit-bookmark)
+;;; magit-bookmark.el ends here