From b5d65f63ed9d5f51d37101c073eb7ee0cff0010b Mon Sep 17 00:00:00 2001 From: 10sr <8.slashes@gmail.com> Date: Wed, 17 Oct 2018 15:17:41 +0900 Subject: [PATCH] Fix parent - child --- emacs.el | 69 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/emacs.el b/emacs.el index c1f6ee8..b7bed9d 100644 --- a/emacs.el +++ b/emacs.el @@ -1,6 +1,6 @@ ;;; 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: @@ -2283,6 +2283,7 @@ use for the buffer. It defaults to \"*recetf-show*\"." (defun git-walktree--create-buffer (commitish name type) "Create and return buffer for COMMITISH:NAME. TYPE is target object type." + ;; TODO: Give buffer name as an argument (let* ((root (git-walktree--git-plumbing "rev-parse" "--show-toplevel")) (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 "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 (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 path 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) "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 () "Open known revision of current path." (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 (let ((map (make-sparse-keymap)))