branch: master commit 20d821772b17e4b4d3809de63b2895bbed1f788f Author: Alexey Veretennikov <alexey.veretenni...@gmail.com> Commit: Alexey Veretennikov <alexey.veretenni...@gmail.com>
Implemented directory copying --- ztree-diff-model.el | 34 +++++++++++++++++++ ztree-diff.el | 91 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 97 insertions(+), 28 deletions(-) diff --git a/ztree-diff-model.el b/ztree-diff-model.el index 38cbac7..ab5a42c 100644 --- a/ztree-diff-model.el +++ b/ztree-diff-model.el @@ -66,6 +66,14 @@ (if (and left right) 'both (if left 'left 'right)))) +(defun ztree-diff-node-equal (node1 node2) + (and (string-equal (ztree-diff-node-short-name node1) + (ztree-diff-node-short-name node2)) + (string-equal (ztree-diff-node-left-path node1) + (ztree-diff-node-left-path node2)) + (string-equal (ztree-diff-node-right-path node1) + (ztree-diff-node-right-path node1)))) + (defun ztree-diff-model-files-equal (file1 file2) "Compare files using external diff. Returns t if equal" (let ((diff-output (shell-command-to-string (concat "diff -q" " " file1 " " file2)))) @@ -105,6 +113,21 @@ result))) result)) +(defun ztree-diff-node-update-diff-from-children (node) + (let ((children (ztree-diff-node-children node)) + (diff nil)) + (dolist (child children) + (setq diff + (ztree-diff-model-update-diff + diff + (ztree-diff-node-different child)))) + (ztree-diff-node-set-different node diff))) + +(defun ztree-diff-node-update-all-parents-diff (node) + (let ((parent node)) + (while (setq parent (ztree-diff-node-parent parent)) + (ztree-diff-node-update-diff-from-children parent)))) + (defun ztree-diff-model-update-diff (old new) (if new @@ -218,5 +241,16 @@ the rest is the combined list of nodes" (message "Done.") model)) +(defun ztree-diff-model-update-node (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."))) + + (provide 'ztree-diff-model) diff --git a/ztree-diff.el b/ztree-diff.el index 00e9067..ebc93d4 100644 --- a/ztree-diff.el +++ b/ztree-diff.el @@ -126,9 +126,60 @@ including . and ..") " on left and right side are identical")) (ediff left right))))) - ;; (let ((parent (ztree-diff-node-parent node))) - ;; (when parent - ;; (message (ztree-diff-node-short-name parent))))) + +(defun ztree-diff-copy-file (node source-path destination-path copy-to-right) + (let ((target-path (concat + (file-name-as-directory destination-path) + (file-name-nondirectory + (directory-file-name source-path))))) + (let ((err (condition-case error-trap + (progn + ;; don't ask for overwrite + ;; keep time stamp + (copy-file source-path target-path t t) + nil) + (error error-trap)))) + ;; error message if failed + (if err (message (concat "Error: " (nth 2 err))) + (progn ; otherwise: + ;; assuming all went ok when left and right nodes are the same + ;; set both as not different + (ztree-diff-node-set-different node nil) + ;; update left/right paths + (if copy-to-right + (ztree-diff-node-set-right-path node target-path) + (ztree-diff-node-set-left-path node target-path)) + (ztree-diff-node-update-all-parents-diff node) + (ztree-refresh-buffer (line-number-at-pos))))))) + + +(defun ztree-diff-copy-dir (node source-path destination-path copy-to-right) + (let* ((src-path (file-name-as-directory source-path)) + (target-path (file-name-as-directory destination-path)) + (target-full-path (concat + target-path + (file-name-nondirectory + (directory-file-name source-path))))) + (let ((err (condition-case error-trap + (progn + ;; keep time stamp + ;; ask for overwrite + (copy-directory src-path target-path t t) + nil) + (error error-trap)))) + ;; error message if failed + (if err (message (concat "Error: " (nth 1 err))) + (progn + (message target-full-path) + (if copy-to-right + (ztree-diff-node-set-right-path node + target-full-path) + (ztree-diff-node-set-left-path node + target-full-path)) + (ztree-diff-model-update-node node) + (ztree-diff-node-update-all-parents-diff node) + (ztree-refresh-buffer (line-number-at-pos))))))) + (defun ztree-diff-copy () (interactive) @@ -166,30 +217,14 @@ including . and ..") (if copy-to-right "RIGHT" "LEFT") destination-path))) (if (file-directory-p source-path) - nil ; TODO: implement directory copy - (let ((target-path (concat - (file-name-as-directory destination-path) - (file-name-nondirectory - (directory-file-name source-path))))) - (let ((err (condition-case error-trap - (progn - ;; ask for overwrite - ;; keep time stamp - (copy-file source-path target-path 1 t) - nil) - (error error-trap)))) - ;; error message if failed - (if err (message (concat "Error: " (nth 2 err))) - (progn ; otherwise: - ;; assuming all went ok when left and right nodes are the same - ;; set both as not different - (ztree-diff-node-set-different node nil) - ;; update left/right paths - (if copy-to-right - (ztree-diff-node-set-right-path node target-path) - (ztree-diff-node-set-left-path node target-path)) - (ztree-refresh-buffer (line-number-at-pos))))))))))))) - + (ztree-diff-copy-dir node + source-path + destination-path + copy-to-right) + (ztree-diff-copy-file node + source-path + destination-path + copy-to-right)))))))) (defun ztree-diff (dir1 dir2) "Creates an interactive buffer with the directory tree of the path given" @@ -203,7 +238,7 @@ including . and ..") 'ztree-diff-insert-buffer-header 'ztree-diff-node-short-name 'ztree-diff-node-is-directory - 'equal + 'ztree-diff-node-equal 'ztree-diff-node-children 'ztree-diff-node-face 'ztree-diff-node-action