| @@ -1,6 +1,6 @@ | |||||
| ;;; emacs.el --- 10sr emacs initialization | ;;; emacs.el --- 10sr emacs initialization | ||||
| ;; Time-stamp: <2018-10-17 14:19:04 JST 10sr> | |||||
| ;; Time-stamp: <2018-10-17 15:16:49 JST 10sr> | |||||
| ;;; Code: | ;;; Code: | ||||
| @@ -2283,6 +2283,7 @@ use for the buffer. It defaults to \"*recetf-show*\"." | |||||
| (defun git-walktree--create-buffer (commitish name type) | (defun git-walktree--create-buffer (commitish name type) | ||||
| "Create and return buffer for COMMITISH:NAME. | "Create and return buffer for COMMITISH:NAME. | ||||
| TYPE is target object type." | TYPE is target object type." | ||||
| ;; TODO: Give buffer name as an argument | |||||
| (let* ((root (git-walktree--git-plumbing "rev-parse" | (let* ((root (git-walktree--git-plumbing "rev-parse" | ||||
| "--show-toplevel")) | "--show-toplevel")) | ||||
| (commitish-display (git-walktree--commitish-fordisplay commitish)) | (commitish-display (git-walktree--commitish-fordisplay commitish)) | ||||
| @@ -2676,13 +2677,24 @@ This function do nothing when current line is not ls-tree output." | |||||
| (defvar git-walktree-tree-face 'git-walktree-tree-face | (defvar git-walktree-tree-face 'git-walktree-tree-face | ||||
| "Face used for tree objects.") | "Face used for tree objects.") | ||||
| ;; TODO: Store as global hash object | |||||
| (defvar git-walktree-known-child-revisions '() | |||||
| "List of already known child reivions of currnet buffer in sha1 string.") | |||||
| (make-variable-buffer-local 'git-walktree-known-child-revisions) | |||||
| (put 'git-walktree-known-child-revisions | |||||
| 'permanent-local | |||||
| t) | |||||
| (defvar git-walktree-known-child-revisions (make-hash-table :test 'equal) | |||||
| "Hash of already known pair of commitid -> list of child commitid.") | |||||
| (defun git-walktree--put-child (parent child) | |||||
| "Register PARENT and CHILD relationship. | |||||
| PARENT should be a full SHA-1 object name." | |||||
| ;; Any way to check if PARENT is a full SHA-1 object name? | |||||
| (let ((current (gethash parent git-walktree-known-child-revisions))) | |||||
| (unless (member child current) | |||||
| (puthash parent | |||||
| (cons child | |||||
| current) | |||||
| git-walktree-known-child-revisions)))) | |||||
| (defun git-walktree--get-children (parent) | |||||
| "Get known children list of PARENT commit. | |||||
| PARENT should be a full SHA-1 object name." | |||||
| (gethash parent git-walktree-known-child-revisions)) | |||||
| ;; Delete this function | ;; Delete this function | ||||
| (defun git-walktree--parent-revision-1 (revision) | (defun git-walktree--parent-revision-1 (revision) | ||||
| @@ -2708,8 +2720,8 @@ This function does the following things: | |||||
| (with-current-buffer (switch-to-buffer (git-walktree--open-noselect revision | (with-current-buffer (switch-to-buffer (git-walktree--open-noselect revision | ||||
| path | path | ||||
| obj)) | obj)) | ||||
| (add-to-list 'git-walktree-known-child-revisions | |||||
| child-revision)))) | |||||
| (git-walktree--put-child revision | |||||
| child-revision)))) | |||||
| (defun git-walktree--completing-read-commitish (prompt-format collection) | (defun git-walktree--completing-read-commitish (prompt-format collection) | ||||
| "Emit PROMPT-FORMAT and ask user to which commitish of COLLECTION to use. | "Emit PROMPT-FORMAT and ask user to which commitish of COLLECTION to use. | ||||
| @@ -2764,23 +2776,26 @@ If current path was not found in the parent revision try to go up path." | |||||
| (defun git-walktree-known-child-revision () | (defun git-walktree-known-child-revision () | ||||
| "Open known revision of current path." | "Open known revision of current path." | ||||
| (interactive) | (interactive) | ||||
| (message "%S" git-walktree-known-child-revisions) | |||||
| (if (< (length git-walktree-known-child-revisions) | |||||
| 1) | |||||
| (message "There are no known child revision") | |||||
| (let* ((child (git-walktree--completing-read-commitish "There are multiple known childrens. Which to open? (%s)" | |||||
| git-walktree-known-child-revisions)) | |||||
| (path git-walktree-current-path) | |||||
| (obj (git-walktree--resolve-object child path))) | |||||
| (cl-assert path) | |||||
| (while (not obj) | |||||
| (setq path | |||||
| (git-walktree--parent-directory path)) | |||||
| (setq obj | |||||
| (git-walktree--resolve-object child path))) | |||||
| (switch-to-buffer (git-walktree--open-noselect child | |||||
| path | |||||
| obj))))) | |||||
| (let* ((commitid (git-walktree--git-plumbing "rev-parse" | |||||
| git-walktree-current-commitish)) | |||||
| (children (git-walktree--get-children commitid))) | |||||
| (message "%S" children) | |||||
| (if (< (length children) | |||||
| 1) | |||||
| (message "There are no known child revision") | |||||
| (let* ((child (git-walktree--completing-read-commitish "There are multiple known childrens. Which to open? (%s)" | |||||
| children)) | |||||
| (path git-walktree-current-path) | |||||
| (obj (git-walktree--resolve-object child path))) | |||||
| (cl-assert path) | |||||
| (while (not obj) | |||||
| (setq path | |||||
| (git-walktree--parent-directory path)) | |||||
| (setq obj | |||||
| (git-walktree--resolve-object child path))) | |||||
| (switch-to-buffer (git-walktree--open-noselect child | |||||
| path | |||||
| obj)))))) | |||||
| (defvar git-walktree-mode-map | (defvar git-walktree-mode-map | ||||
| (let ((map (make-sparse-keymap))) | (let ((map (make-sparse-keymap))) | ||||