| @@ -2366,8 +2366,12 @@ It also copy text overlays." | |||||
| (cl-assert (member type | (cl-assert (member type | ||||
| '("commit" "tree"))) | '("commit" "tree"))) | ||||
| (with-current-buffer buf | (with-current-buffer buf | ||||
| (unless (string= treeish | |||||
| git-walktree-object-id) | |||||
| (unless (and (string= treeish | |||||
| git-walktree-object-id) | |||||
| (or (string= committish | |||||
| git-walktree-current-committish) | |||||
| (eq committish | |||||
| git-walktree-current-committish))) | |||||
| (buffer-disable-undo) | (buffer-disable-undo) | ||||
| ;; For running git command go back to repository root | ;; For running git command go back to repository root | ||||
| (cd git-walktree-repository-root) | (cd git-walktree-repository-root) | ||||
| @@ -2480,7 +2484,6 @@ Result will be inserted into current buffer." | |||||
| )) | )) | ||||
| buf)) | buf)) | ||||
| ;; TODO: Fix name | |||||
| (defun git-walktree--open-noselect-safe-path (committish &optional path) | (defun git-walktree--open-noselect-safe-path (committish &optional path) | ||||
| "Open git object of COMMITTISH:PATH. | "Open git object of COMMITTISH:PATH. | ||||
| If PATH not found in COMMITTISH tree, go up path and try again until found. | If PATH not found in COMMITTISH tree, go up path and try again until found. | ||||
| @@ -2499,7 +2502,7 @@ When PATH is omitted or nil, it is calculated from current file or directory." | |||||
| (cl-assert (not (string-match "\\`/" path))) | (cl-assert (not (string-match "\\`/" path))) | ||||
| (cl-assert (not (string-match "/\\'" path))) | (cl-assert (not (string-match "/\\'" path))) | ||||
| (let ((obj nil)) | |||||
| (let ((obj (git-walktree--resolve-object committish path))) | |||||
| (while (not obj) | (while (not obj) | ||||
| (setq path | (setq path | ||||
| (git-walktree--parent-directory path)) | (git-walktree--parent-directory path)) | ||||
| @@ -2510,7 +2513,6 @@ When PATH is omitted or nil, it is calculated from current file or directory." | |||||
| obj))) | obj))) | ||||
| ;; TODO: Store view history | ;; TODO: Store view history | ||||
| ;; TODO: Open current file or directory if available | |||||
| (defun git-walktree--open-noselect (committish path object) | (defun git-walktree--open-noselect (committish path object) | ||||
| "Open git tree buffer of COMMITTISH. | "Open git tree buffer of COMMITTISH. | ||||
| When PATH was given and non-nil open that, otherwise open root tree. | When PATH was given and non-nil open that, otherwise open root tree. | ||||
| @@ -2568,8 +2570,6 @@ When PATH was given and non-nil open that, otherwise open root tree. | |||||
| When OBJECT was given and non-nil, assume that is the object of COMMITTISH:PATH without | When OBJECT was given and non-nil, assume that is the object of COMMITTISH:PATH without | ||||
| checking it." | checking it." | ||||
| (interactive (list (magit-read-branch-or-commit "Revision: "))) | (interactive (list (magit-read-branch-or-commit "Revision: "))) | ||||
| ;; (setq path (or path | |||||
| ;; (git-walktree--path-in-repository (directory-file-name default-directory)))) | |||||
| (switch-to-buffer (git-walktree--open-noselect committish path object))) | (switch-to-buffer (git-walktree--open-noselect committish path object))) | ||||
| (defalias 'git-walktree 'git-walktree-open) | (defalias 'git-walktree 'git-walktree-open) | ||||
| @@ -2659,7 +2659,6 @@ Returns property list like (:mode MODE :type TYPE :object OBJECT :file FILE)." | |||||
| (interactive) | (interactive) | ||||
| (let ((info (git-walktree--parse-lstree-line (buffer-substring-no-properties (point-at-bol) | (let ((info (git-walktree--parse-lstree-line (buffer-substring-no-properties (point-at-bol) | ||||
| (point-at-eol))))) | (point-at-eol))))) | ||||
| ;; TODO: Open committish when currently on committish like symbol | |||||
| (if info | (if info | ||||
| (switch-to-buffer | (switch-to-buffer | ||||
| (if (string= (plist-get info | (if (string= (plist-get info | ||||
| @@ -2796,7 +2795,6 @@ When collection has just one element, return the first element without asking." | |||||
| nil | nil | ||||
| t))) | t))) | ||||
| ;; TODO: Fix to work on subdirectory | |||||
| (defun git-walktree-parent-revision () | (defun git-walktree-parent-revision () | ||||
| "Open parent revision of current path. | "Open parent revision of current path. | ||||
| If current path was not found in the parent revision try to go up path." | If current path was not found in the parent revision try to go up path." | ||||
| @@ -2813,18 +2811,10 @@ If current path was not found in the parent revision try to go up path." | |||||
| (message "This revision has no parent revision") | (message "This revision has no parent revision") | ||||
| (let* ((parent (git-walktree--choose-committish "This revision has multiple parents. Which to open? (%s) " | (let* ((parent (git-walktree--choose-committish "This revision has multiple parents. Which to open? (%s) " | ||||
| parents)) | parents)) | ||||
| (path git-walktree-current-path) | |||||
| (obj (git-walktree--resolve-object parent path))) | |||||
| (path git-walktree-current-path)) | |||||
| (cl-assert path) | (cl-assert path) | ||||
| (while (not obj) | |||||
| (setq path | |||||
| (git-walktree--parent-directory path)) | |||||
| (setq obj | |||||
| (git-walktree--resolve-object parent path))) | |||||
| (switch-to-buffer (git-walktree--open-noselect parent | |||||
| path | |||||
| obj)) | |||||
| )))) | |||||
| (switch-to-buffer (git-walktree--open-noselect-safe-path parent | |||||
| path)))))) | |||||
| (defun git-walktree--parent-commitid (committish) | (defun git-walktree--parent-commitid (committish) | ||||
| "Return list of parent commits of COMMITTISH in sha1 string." | "Return list of parent commits of COMMITTISH in sha1 string." | ||||
| @@ -2851,17 +2841,10 @@ If current path was not found in the parent revision try to go up path." | |||||
| (message "There are no known child revision") | (message "There are no known child revision") | ||||
| (let* ((child (git-walktree--choose-committish "There are multiple known childrens. Which to open? (%s)" | (let* ((child (git-walktree--choose-committish "There are multiple known childrens. Which to open? (%s)" | ||||
| children)) | children)) | ||||
| (path git-walktree-current-path) | |||||
| (obj (git-walktree--resolve-object child path))) | |||||
| (path git-walktree-current-path)) | |||||
| (cl-assert 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)))))) | |||||
| (switch-to-buffer (git-walktree--open-noselect-safe-path child | |||||
| path)))))) | |||||
| (defvar git-walktree-mode-map | (defvar git-walktree-mode-map | ||||
| (let ((map (make-sparse-keymap))) | (let ((map (make-sparse-keymap))) | ||||