[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 67b9b4b 03/36: Issue #24: updated traverse function
From: |
Alexey Veretennikov |
Subject: |
[elpa] master 67b9b4b 03/36: Issue #24: updated traverse function |
Date: |
Wed, 27 Jan 2016 23:50:49 +0000 |
branch: master
commit 67b9b4b6a1e42412bfad6bf9858a66f11e0f3e49
Author: Alexey Veretennikov <address@hidden>
Commit: Alexey Veretennikov <address@hidden>
Issue #24: updated traverse function
---
ztree-diff-model.el | 125 +++++++++++++++++++++-----------------------------
1 files changed, 53 insertions(+), 72 deletions(-)
diff --git a/ztree-diff-model.el b/ztree-diff-model.el
index 7bec461..96b6ce3 100644
--- a/ztree-diff-model.el
+++ b/ztree-diff-model.el
@@ -162,13 +162,8 @@ Filters out . and .."
(when (and left right
(file-exists-p left)
(file-exists-p right))
- (if isdir
- (let ((traverse (ztree-diff-node-traverse
- node
- left
- right)))
- (ztree-diff-node-set-different node (car traverse))
- (ztree-diff-node-set-children node (cdr traverse)))
+ (if isdir ;; traverse directory
+ (ztree-diff-node-traverse node)
;; node is a file
(ztree-diff-node-set-different
node
@@ -233,15 +228,24 @@ Argument SIDE either 'left or 'right side."
old)
old))
-(defun ztree-diff-node-traverse (parent path1 path2)
+(defun ztree-diff-node-traverse (parent)
"Traverse 2 paths creating the list nodes with PARENT defined and diff
status.
Function traversing 2 paths PATH1 and PATH2 returning the list where the
first element is the difference status (nil, 'diff, 'new') and
the rest is the combined list of nodes."
- (let ((list1 (ztree-directory-files path1))
- (list2 (ztree-directory-files path2))
- (different-dir nil)
- (result nil))
+ (let* ((path1 (ztree-diff-node-left-path parent))
+ (path2 (ztree-diff-node-right-path parent))
+ (list1 (ztree-directory-files path1)) ;; left list of liles
+ (list2 (ztree-directory-files path2)) ;; right list of files
+ (diff-parent nil) ;; status of this node
+ (children nil) ;; children
+ ;; helper function to find if the same file exists
+ ;; on the other side
+ (find-other-file (lambda (list shortname is-dir)
+ (ztree-find list
+ (lambda (x) (and (string-equal
(ztree-file-short-name x)
+
shortname)
+ (eq is-dir
(file-directory-p x))))))))
(ztree-diff-model-update-wait-message)
;; first - adding all entries from left directory
(dolist (file1 list1)
@@ -249,48 +253,35 @@ the rest is the combined list of nodes."
;; we are creating the node
(let* ((simple-name (ztree-file-short-name file1))
(isdir (file-directory-p file1))
- (children nil)
- (different nil)
;; create the current node to be set as parent to
;; subdirectories
- (node (ztree-diff-node-create parent file1 nil simple-name
simple-name nil nil))
- ;; 1. find if the file is in the second directory and the type
- ;; is the same - i.e. both are directories or both are files
- (file2 (ztree-find list2
- #'(lambda (x) (and (string-equal
(ztree-file-short-name x)
- simple-name)
- (eq isdir (file-directory-p
x)))))))
- ;; 2. if it is not in the second directory, add it as a node
- (if (not file2)
- (progn
- ;; 2.1 if it is a directory, add the whole subtree
- (when (file-directory-p file1)
- (setq children (ztree-diff-model-subtree node file1 'left)))
- ;; 2.2 update the difference status for this entry
- (setq different 'new))
- ;; 3. if it is found in second directory and of the same type
- ;; 3.1 if it is a file
- (if (not (file-directory-p file1))
- ;; 3.1.1 set difference status to this entry
- (setq different (if (ztree-diff-model-files-equal file1 file2)
nil 'diff))
- ;; 3.2 if it is the directory
- ;; 3.2.1 get the result of the directories comparison together
with status
- (let ((traverse (ztree-diff-node-traverse node file1 file2)))
- ;; 3.2.2 update the difference status for whole comparison from
- ;; difference result from the 2 subdirectories comparison
- (setq different (car traverse))
- ;; 3.2.3 set the children list from the 2 subdirectories
comparison
- (setq children (cdr traverse)))))
- ;; update calculated parameters of the node
+ ;; new by default - will be overriden below if necessary
+ (node (ztree-diff-node-create parent file1 nil simple-name
simple-name nil 'new))
+ ;; find if the file is in the second directory and the type
+ ;; is the same - i.e. both are directories or both are files
+ (file2 (funcall find-other-file list2 simple-name isdir)))
+ ;; entry set right path if found or nil otherwise
(ztree-diff-node-set-right-path node file2)
- (ztree-diff-node-set-children node children)
- (ztree-diff-node-set-different node different)
- ;; 2.3 update difference status for the whole comparison
+ (cond
+ ;; when exist just on a left side and is a directory, add all
+ ((and (file-directory-p file1) (not file2))
+ (ztree-diff-node-set-children node
+ (ztree-diff-model-subtree node file1
'left)))
+ ;; if exists on both sides and it is a file, compare
+ ((and file2 (not (file-directory-p file1)))
+ (ztree-diff-node-set-different node
+ (if (ztree-diff-model-files-equal
file1 file2) nil 'diff)))
+ ;; if exists on both sides and it is a directory, traverse further
+ ((and file2 (file-directory-p file1))
+ (ztree-diff-node-traverse node)))
+ ;; update difference status for the whole comparison
;; depending if the node should participate in overall result
(unless (ztree-diff-model-ignore-p node)
- (setq different-dir (ztree-diff-model-update-diff different-dir
different)))
+ (setq diff-parent
+ (ztree-diff-model-update-diff diff-parent
+ (ztree-diff-node-different
node))))
;; push the created node to the result list
- (push node result)))
+ (push node children)))
;; second - adding entries from the right directory which are not present
;; in the left directory
(dolist (file2 list2)
@@ -298,30 +289,26 @@ the rest is the combined list of nodes."
;; we are creating the node
(let* ((simple-name (ztree-file-short-name file2))
(isdir (file-directory-p file2))
- (children nil)
;; create the node to be added to the results list
(node (ztree-diff-node-create parent nil file2 simple-name
simple-name nil 'new))
- ;; 1. find if the file is in the first directory and the type
- ;; is the same - i.e. both are directories or both are files
- (file1 (ztree-find list1
- #'(lambda (x) (and (string-equal
(ztree-file-short-name x)
- simple-name)
- (eq isdir (file-directory-p
x)))))))
+ ;; find if the file is in the first directory and the type
+ ;; is the same - i.e. both are directories or both are files
+ (file1 (funcall find-other-file list1 simple-name isdir)))
;; if it is not in the first directory, add it as a node
(unless file1
;; if it is a directory, set the whole subtree to children
(when (file-directory-p file2)
- (setq children (ztree-diff-model-subtree node file2 'right)))
- ;; set calculated children to the node
- (ztree-diff-node-set-children node children)
+ (ztree-diff-node-set-children node (ztree-diff-model-subtree node
file2 'right)))
;; update the different status for the whole comparison
;; depending if the node should participate in overall result
(unless (ztree-diff-model-ignore-p node)
- (setq different-dir (ztree-diff-model-update-diff different-dir
'new)))
+ (setq diff-parent (ztree-diff-model-update-diff diff-parent 'new)))
;; push the created node to the result list
- (push node result))))
- ;; result is a pair: difference status and nodes list
- (cons different-dir result)))
+ (push node children))))
+ ;; finally set different status based on all children
+ (ztree-diff-node-set-different parent diff-parent)
+ ;; and set children
+ (ztree-diff-node-set-children parent children)))
(defun ztree-diff-model-create (dir1 dir2 &optional ignore-p)
"Create a node based on DIR1 and DIR2.
@@ -339,10 +326,8 @@ from comparison."
(ztree-file-short-name dir1)
(ztree-file-short-name dir2)
nil
- nil))
- (traverse (ztree-diff-node-traverse model dir1 dir2)))
- (ztree-diff-node-set-children model (cdr traverse))
- (ztree-diff-node-set-different model (car traverse))
+ nil)))
+ (ztree-diff-node-traverse model)
(message "Done.")
model))
@@ -350,12 +335,8 @@ from comparison."
"Refresh the NODE."
(setq ztree-diff-model-wait-message
(concat "Updating " (ztree-diff-node-short-name node) " ..."))
- (let ((traverse (ztree-diff-node-traverse node
- (ztree-diff-node-left-path node)
- (ztree-diff-node-right-path
node))))
- (ztree-diff-node-set-children node (cdr traverse))
- (ztree-diff-node-set-different node (car traverse))
- (message "Done.")))
+ (ztree-diff-node-traverse node)
+ (message "Done."))
- [elpa] master updated (e7f3aa4 -> a136ff8), Alexey Veretennikov, 2016/01/27
- [elpa] master 4e112f8 04/36: Updated add-tree method, Alexey Veretennikov, 2016/01/27
- [elpa] master ac0834d 05/36: Updated readme: added information about contributing, Alexey Veretennikov, 2016/01/27
- [elpa] master 5603c70 02/36: Updated README to include new variable introduced in issue #23, Alexey Veretennikov, 2016/01/27
- [elpa] master c6c9257 01/36: Implemented issue #23: Add optional unicode tree drawing facility, Alexey Veretennikov, 2016/01/27
- [elpa] master c75719f 10/36: Replaced hardcoded diff with diff-command from diff.el, Alexey Veretennikov, 2016/01/27
- [elpa] master 418af99 08/36: Added face for ignored files, Alexey Veretennikov, 2016/01/27
- [elpa] master 45b6921 09/36: Updated print function, Alexey Veretennikov, 2016/01/27
- [elpa] master 04b29c8 06/36: Updated readme, Alexey Veretennikov, 2016/01/27
- [elpa] master 67b9b4b 03/36: Issue #24: updated traverse function,
Alexey Veretennikov <=
- [elpa] master 4a935ee 07/36: Reshuffled readme, Alexey Veretennikov, 2016/01/27
- [elpa] master 6018029 11/36: Started updating diff logic to include ignored files, Alexey Veretennikov, 2016/01/27
- [elpa] master c227ed8 12/36: Added debug output and some other changes, Alexey Veretennikov, 2016/01/27
- [elpa] master 64d3960 13/36: Added face for ignored files, Alexey Veretennikov, 2016/01/27
- [elpa] master 45dda44 14/36: Started updating diff logic to include ignored files, Alexey Veretennikov, 2016/01/27
- [elpa] master 2dc412f 15/36: Added debug output and some other changes, Alexey Veretennikov, 2016/01/27
- [elpa] master 9408ca1 17/36: Fixed ztree-node-is-visible, Alexey Veretennikov, 2016/01/27
- [elpa] master eea3c2b 19/36: added comments, Alexey Veretennikov, 2016/01/27
- [elpa] master cef7d95 20/36: Functions with errors still:, Alexey Veretennikov, 2016/01/27
- [elpa] master 653a7f1 21/36: Fixed ignored files, Alexey Veretennikov, 2016/01/27