diff --git a/emacs.el b/emacs.el index 4f51c9c..270c200 100644 --- a/emacs.el +++ b/emacs.el @@ -1,6 +1,6 @@ ;;; emacs.el --- 10sr emacs initialization -;; Time-stamp: <2018-10-16 13:22:43 JST 10sr> +;; Time-stamp: <2018-10-16 14:45:32 JST 10sr> ;;; Code: @@ -2552,11 +2552,14 @@ Returns property list like (:mode MODE :type TYPE :object OBJECT :file FILE)." (interactive) (let ((info (git-walktree--parse-lstree-line (buffer-substring-no-properties (point-at-bol) (point-at-eol))))) + ;; TODO: Open commitish when currently on commitish like symbol (if info (switch-to-buffer (if (string= (plist-get info :type) "commit") + ;; For submodule cd to that directory and intialize + ;; TODO: Provide way to go back to known "parent" repository (with-temp-buffer (cd (plist-get info :file)) (git-walktree--open-noselect (plist-get info @@ -2646,13 +2649,49 @@ This function do nothing when current line is not ls-tree output." (defvar git-walktree-tree-face 'git-walktree-tree-face "Face used for tree objects.") +(defvar git-walktree-known-child-revisions '() + "List of already known child reivions of currnet buffer in string format.") +(make-variable-buffer-local 'git-walktree-known-child-revisions) + +(defun git-walktree-parent-revision () + "Open parent revision of current path. +If given path is not found in the parent revision try to go up path." + (interactive)) + +(defun git-walktree--is-a-merge-commit (commitish) + "Return non-nil if COMMITISH is a merge commit." + (let ((type (git-walktree--git-plumbing "cat-file" + "-t" + commitish))) + (cl-assert (string= type "commit"))) + (with-temp-buffer + (let ((status (call-process git-walktree-git-executable + nil + t + nil + "cat-file" + "-p" + commitish))) + (unless (eq 0 + status) + (error "Faild to run git %S:\n%s" + (list "cat-file" "-p" commitish) + (buffer-substring-no-properties (point-min) + (point-max)))) + (goto-char (point-min)) + (save-match-data + (> (count-matches "^parent") 1))))) +;; (git-walktree--is-a-merge-commit "ae4b80f") + (defvar git-walktree-mode-map (let ((map (make-sparse-keymap))) - ;; TODO: Add git-walktree-parent-revision (define-key map "n" 'git-walktree-mode-next-line) (define-key map "p" 'git-walktree-mode-previous-line) (define-key map (kbd "C-n") 'git-walktree-mode-next-line) (define-key map (kbd "C-p") 'git-walktree-mode-previous-line) + ;; TODO: Review keybind + (define-key map "N" 'git-walktree-parent-revision) + (define-key map "P" 'git-walktree-known-child-revision) (define-key map "^" 'git-walktree-up) (define-key map (kbd "C-m") 'git-walktree-mode-open-this) map))