| @@ -1,6 +1,6 @@ | |||
| ;;; emacs.el --- 10sr emacs initialization | |||
| ;; Time-stamp: <2018-10-11 13:23:44 JST 10sr> | |||
| ;; Time-stamp: <2018-10-11 13:50:52 JST 10sr> | |||
| ;;; Code: | |||
| @@ -2246,13 +2246,51 @@ use for the buffer. It defaults to \"*recetf-show*\"." | |||
| :prefix "git-revision-" | |||
| :group 'tools) | |||
| (defun git-revision--open-tree (tree) | |||
| "Open git tree buffer of TREE.") | |||
| (defun git-revision--create-buffer (treeish) | |||
| "Create and return buffer for TREEISH." | |||
| (get-buffer-create "*GitRevision<TMP>*")) | |||
| (defun git-revision--open-tree (treeish) | |||
| "Open git tree buffer of TREEISH." | |||
| (let ((buf (git-revision--create-buffer treeish)) | |||
| (type (git-revision--git-plumbing "cat-file" | |||
| "-t" | |||
| treeish))) | |||
| (with-current-buffer buf | |||
| (erase-buffer) | |||
| (when (string= "commit" | |||
| type) | |||
| (git-revision--call-process nil | |||
| "show" | |||
| "--no-patch" | |||
| "--pretty=short" | |||
| treeish) | |||
| (insert "\n")) | |||
| (git-revision--call-process nil | |||
| "ls-tree" | |||
| treeish) | |||
| (git-revision-mode)) | |||
| buf)) | |||
| (defun git-revision--call-process (&optional infile &rest args) | |||
| "Call git command with input from INFILE and args ARGS. | |||
| Result will be inserted into current buffer." | |||
| (let ((status (apply 'call-process | |||
| git-revision-git-executable | |||
| infile | |||
| t | |||
| nil | |||
| args))) | |||
| (unless (eq 0 | |||
| status) | |||
| (error "Failed to call git process %S %S" | |||
| infile | |||
| args)))) | |||
| (defun git-revision-open (commitish) | |||
| "Open git tree buffer of COMMITISH." | |||
| (interactive (list (magit-read-branch-or-commit "Revision: "))) | |||
| (git-revision--open-tree (git-revision--resolve-treeish commitish))) | |||
| (pop-to-buffer (git-revision--open-tree commitish))) | |||
| (defcustom git-revision-git-executable "git" | |||
| "Git executable." | |||
| @@ -2271,7 +2309,7 @@ Returns first line of output without newline." | |||
| args))) | |||
| (unless (eq 0 | |||
| status) | |||
| (error "Faild to run git %S\n%s" | |||
| (error "Faild to run git %S:\n%s" | |||
| args | |||
| (buffer-substring-no-properties (point-min) | |||
| (point-max)))) | |||
| @@ -2280,29 +2318,17 @@ Returns first line of output without newline." | |||
| (goto-char (point-min)) | |||
| (point-at-eol)))))) | |||
| (defvar git-revision-mode-map | |||
| (let ((map (make-sparse-keymap))) | |||
| (define-key map "n" 'next-line) | |||
| (define-key map "p" 'previous-line) | |||
| map)) | |||
| (defun git-revision--resolve-treeish (commitish) | |||
| "Get treeish id from COMMITISH." | |||
| (cl-assert commitish) | |||
| (cl-assert (not (string= "" commitish))) | |||
| (with-temp-buffer | |||
| (let ((status (call-process git-revision-git-executable | |||
| nil | |||
| t | |||
| nil | |||
| "cat-file" | |||
| "-p" | |||
| commitish))) | |||
| (unless (eq 0 | |||
| status) | |||
| (error "Failed to run cat-file for %s" commitish)) | |||
| (goto-char (point-min)) | |||
| (save-match-data | |||
| (re-search-forward "^tree \\([0-9a-f]+\\)$") | |||
| (or (match-string 1) | |||
| (error "Failed to find treeish for %s" commitish)))))) | |||
| (define-derived-mode git-revision-mode special-mode "git-revision" | |||
| "Major-mode for `git-revision-open'.") | |||
| (git-revision--resolve-treeish "HEAD") | |||
| (require 'magit nil t) | |||
| (git-revision--git-plumbing "cat-file" "-t" "HEAD") | |||
| ;; Local Variables: | |||