branch: master commit cef7d9520a012223453d2ceb0a9dcffec160889b Author: Alexey Veretennikov <alexey.veretenni...@afconsult.com> Commit: Alexey Veretennikov <alexey.veretenni...@afconsult.com>
Functions with errors still: ztree-diff-model-partial-rescan ztree-diff-delete-file and probably (need to test) ztree-diff-copy --- ztree-diff-model.el | 45 ++++++++++++++++++++++++--------------------- ztree-diff.el | 17 +++++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/ztree-diff-model.el b/ztree-diff-model.el index 984834c..dbcc713 100644 --- a/ztree-diff-model.el +++ b/ztree-diff-model.el @@ -79,8 +79,6 @@ (funcall string-or-nil (ztree-diff-node-different x))))) (concat "Node: " (ztree-diff-node-short-name node) "\n" - ;; " * Parent: " (let ((parent (ztree-diff-node-parent node))) - ;; (if parent (ztree-diff-node-short-name parent) "nil")) " * Parent: " (funcall string-or-nil (ztree-diff-node-parent node)) "\n" " * Status: " (funcall string-or-nil (ztree-diff-node-different node)) @@ -164,16 +162,25 @@ Filters out . and .." (isdir (ztree-diff-node-is-directory node)) (left (ztree-diff-node-left-path node)) (right (ztree-diff-node-right-path node))) - ;; if node is a directory - traverse - (when (and left right - (file-exists-p left) - (file-exists-p right)) - (if isdir ;; traverse directory - (ztree-diff-node-traverse node) - ;; node is a file - (ztree-diff-node-set-different - node - (ztree-diff-model-files-equal left right)))))) + (if (not parent) ;; if no parent - traverse + (ztree-diff-node-traverse node) + ;; verify if the node is not ignored by any chance + (when (or (ztree-diff-node-ignore-p node) + (eql (ztree-diff-node-different node) 'ignore)) + (ztree-diff-node-set-different node 'ignore)) + ;; if node is a directory - traverse + (when (and left right + (file-exists-p left) + (file-exists-p right)) + (if isdir ;; traverse directory + (ztree-diff-node-traverse node) + ;; node is a file + (ztree-diff-node-set-different + node + (if (ztree-diff-node-ignore-p node) 'ignore + (ztree-diff-model-files-equal left right))))) + ;; update all parents statuses + (ztree-diff-node-update-all-parents-diff node)))) (defun ztree-diff-model-subtree (parent path side diff) "Create a subtree with given PARENT for the given PATH. @@ -208,15 +215,11 @@ Argument DIFF different status to be assigned to all created nodes." (defun ztree-diff-node-update-diff-from-children (node) "Set the diff status for the NODE based on its children." ;(unless (eq (ztree-diff-node-different node 'ignore)) - (let ((children (ztree-diff-node-children node)) - (diff nil)) - (dolist (child children) - (unless (ztree-diff-model-ignore-p child) - (setq diff - (ztree-diff-model-update-diff - diff - (ztree-diff-node-different child))))) - (ztree-diff-node-set-different node diff))) ;) + (let ((diff (cl-reduce 'ztree-diff-model-update-diff + (ztree-diff-node-children node) + :initial-value 'same + :key 'ztree-diff-node-different))) + (ztree-diff-node-set-different node diff))) (defun ztree-diff-node-update-all-parents-diff (node) "Recursively update all parents diff status for the NODE." diff --git a/ztree-diff.el b/ztree-diff.el index 9e0f3f3..89bc2c5 100644 --- a/ztree-diff.el +++ b/ztree-diff.el @@ -184,10 +184,8 @@ By default paths starting with dot (like .git) are ignored") (if (not parent) (when ztree-diff-dirs-pair (ztree-diff (car ztree-diff-dirs-pair) (cdr ztree-diff-dirs-pair))) - (progn - (ztree-diff-model-partial-rescan common) - (ztree-diff-node-update-all-parents-diff node) - (ztree-refresh-buffer (line-number-at-pos)))))) + (ztree-diff-model-partial-rescan common) + (ztree-refresh-buffer (line-number-at-pos))))) (defun ztree-diff-partial-rescan () @@ -418,18 +416,17 @@ COPY-TO-RIGHT specifies which side of the NODE to update." ;; and update the parents with a new status ;; of this node (when (file-directory-p remove-path) - (ztree-diff-model-partial-rescan node) - (ztree-diff-node-update-all-parents-diff node))) + (ztree-diff-model-partial-rescan node))) ;; if everything ok (progn ;; remove the node from children (setq children (ztree-filter #'(lambda (x) (not (ztree-diff-node-equal x node))) children)) - (ztree-diff-node-set-children parent children)) - (ztree-diff-node-update-all-parents-diff node) - ;;(ztree-diff-model-partial-rescan node) - (ztree-refresh-buffer (line-number-at-pos)))))))))) + (ztree-diff-node-set-children parent children))) + (ztree-diff-node-update-all-parents-diff node) + ;;(ztree-diff-model-partial-rescan node) + (ztree-refresh-buffer (line-number-at-pos)))))))))