[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/vlf 5d30eb4 206/310: Use single ediff pass to adjust bo
From: |
Stefan Monnier |
Subject: |
[elpa] externals/vlf 5d30eb4 206/310: Use single ediff pass to adjust borders. Protect against user |
Date: |
Sat, 28 Nov 2020 00:33:16 -0500 (EST) |
branch: externals/vlf
commit 5d30eb4826e2e2c04684b94fc4db08cd46d6d8c7
Author: Andrey Kotlarski <m00naticus@gmail.com>
Commit: Andrey Kotlarski <m00naticus@gmail.com>
Use single ediff pass to adjust borders. Protect against user
interruption while searching for difference.
---
vlf-ediff.el | 116 +++++++++++++++++++++++++++++++++++------------------------
1 file changed, 70 insertions(+), 46 deletions(-)
diff --git a/vlf-ediff.el b/vlf-ediff.el
index a3c8aa5..76c5111 100644
--- a/vlf-ediff.el
+++ b/vlf-ediff.el
@@ -157,6 +157,7 @@ logical chunks in case there is no difference at the
current ones."
(set-buffer buffer-A)
(setq buffer-A (current-buffer)) ;names change, so reference by buffer object
(let ((end-A (= vlf-start-pos vlf-end-pos))
+ (chunk-A (cons vlf-start-pos vlf-end-pos))
(point-max-A (point-max))
(min-file-size vlf-file-size)
(forward-p (eq next-func 'vlf-next-chunk)))
@@ -164,55 +165,79 @@ logical chunks in case there is no difference at the
current ones."
(setq buffer-B (current-buffer)
min-file-size (min min-file-size vlf-file-size))
(let ((end-B (= vlf-start-pos vlf-end-pos))
+ (chunk-B (cons vlf-start-pos vlf-end-pos))
+ (done nil)
(reporter (make-progress-reporter
"Searching for difference..."
(if forward-p vlf-start-pos
(- min-file-size vlf-end-pos))
min-file-size)))
- (while (and (or (not end-A) (not end-B))
- (or (zerop (compare-buffer-substrings
- buffer-A (point-min) point-max-A
- buffer-B (point-min) (point-max)))
- (with-current-buffer ediff-buffer
- (ediff-update-diffs)
- (when (and (not end-A) (not end-B))
- (vlf-ediff-adjust buffer-A buffer-B)
- (or (zerop ediff-number-of-differences)
- (vlf-ediff-adjust buffer-A buffer-B t)))
- (zerop ediff-number-of-differences))))
- (funcall next-func)
- (setq end-B (= vlf-start-pos vlf-end-pos))
- (with-current-buffer buffer-A
- (funcall next-func)
- (setq end-A (= vlf-start-pos vlf-end-pos)
- point-max-A (point-max)))
- (progress-reporter-update reporter
- (if forward-p vlf-end-pos
- (- vlf-file-size vlf-start-pos))))
- (progress-reporter-done reporter)
- (if (or (not end-A) (not end-B))
- (progn (vlf-update-buffer-name)
- (set-buffer buffer-A)
- (vlf-update-buffer-name))
- (if forward-p
- (let ((max-file-size vlf-file-size))
- (vlf-move-to-chunk (- max-file-size vlf-batch-size)
- max-file-size)
- (set-buffer buffer-A)
- (setq max-file-size (max max-file-size vlf-file-size))
- (vlf-move-to-chunk (- max-file-size vlf-batch-size)
- max-file-size))
- (vlf-beginning-of-file)
+ (unwind-protect
+ (progn
+ (while (and (or (not end-A) (not end-B))
+ (or (zerop (compare-buffer-substrings
+ buffer-A (point-min) point-max-A
+ buffer-B (point-min) (point-max)))
+ (with-current-buffer ediff-buffer
+ (ediff-update-diffs)
+ (and (not end-A) (not end-B)
+ (vlf-ediff-refine buffer-A
+ buffer-B))
+ (zerop ediff-number-of-differences))))
+ (funcall next-func)
+ (setq end-B (= vlf-start-pos vlf-end-pos))
+ (with-current-buffer buffer-A
+ (funcall next-func)
+ (setq end-A (= vlf-start-pos vlf-end-pos)
+ point-max-A (point-max)))
+ (progress-reporter-update reporter
+ (if forward-p vlf-end-pos
+ (- vlf-file-size
+ vlf-start-pos))))
+ (progress-reporter-done reporter)
+ (if (or (not end-A) (not end-B))
+ (progn (vlf-update-buffer-name)
+ (set-buffer buffer-A)
+ (vlf-update-buffer-name))
+ (if forward-p
+ (let ((max-file-size vlf-file-size))
+ (vlf-move-to-chunk (- max-file-size vlf-batch-size)
+ max-file-size)
+ (set-buffer buffer-A)
+ (setq max-file-size (max max-file-size
+ vlf-file-size))
+ (vlf-move-to-chunk (- max-file-size
+ vlf-batch-size)
+ max-file-size))
+ (vlf-beginning-of-file)
+ (set-buffer buffer-A)
+ (vlf-beginning-of-file))
+ (set-buffer ediff-buffer)
+ (ediff-update-diffs)
+ (if (or (not forward-p)
+ (and (not end-A) (not end-B)))
+ (vlf-ediff-refine buffer-A buffer-B)))
+ (setq done t))
+ (unless done
(set-buffer buffer-A)
- (vlf-beginning-of-file))
- (set-buffer ediff-buffer)
- (ediff-update-diffs)
- (when (or (not forward-p)
- (and (not end-A) (not end-B)))
- (or (zerop ediff-number-of-differences)
- (vlf-ediff-adjust buffer-A buffer-B))
- (or (zerop ediff-number-of-differences)
- (vlf-ediff-adjust buffer-A buffer-B t)))))))
+ (set-buffer-modified-p nil)
+ (vlf-move-to-chunk (car chunk-A) (cdr chunk-A) t)
+ (set-buffer buffer-B)
+ (set-buffer-modified-p nil)
+ (vlf-move-to-chunk (car chunk-B) (cdr chunk-B) t)
+ (set-buffer ediff-buffer)
+ (ediff-update-diffs)
+ (vlf-ediff-refine buffer-A buffer-B))))))
+
+(defun vlf-ediff-refine (buffer-A buffer-B)
+ "Try to minimize differences between BUFFER-A and BUFFER-B.
+This can happen if first or last difference is at the start/end of
+buffer."
+ (or (zerop ediff-number-of-differences)
+ (let ((adjust-p (vlf-ediff-adjust buffer-A buffer-B)))
+ (setq adjust-p (or (vlf-ediff-adjust buffer-A buffer-B t)
+ adjust-p))
+ (if adjust-p (ediff-update-diffs)))))
(defun vlf-ediff-adjust (buf-A buf-B &optional end)
"Additionally adjust buffer borders for BUF-A and BUF-B.
@@ -221,8 +246,7 @@ Adjust beginning if END is nil."
(diff-A (ediff-get-diff-overlay diff-num 'A))
(diff-B (ediff-get-diff-overlay diff-num 'B))
diff-A-str diff-B-str adjust-p)
- (save-excursion
- (set-buffer buf-A)
+ (with-current-buffer buf-A
(setq adjust-p (if end (= (overlay-end diff-A) (point-max))
(= (overlay-start diff-A) (point-min)))
diff-A-str (and adjust-p (buffer-substring-no-properties
@@ -248,7 +272,7 @@ Adjust beginning if END is nil."
(or (funcall adjust-func diff-B-str diff-A-str buf-A)
(setq adjust-p nil)))
(t (setq adjust-p nil))))))
- (if adjust-p (ediff-update-diffs))))
+ adjust-p))
(defun vlf-ediff-adjust-start (diff-short diff-long vlf-buffer)
"Remove difference between DIFF-SHORT and DIFF-LONG from beginning\
- [elpa] externals/vlf 117935d 200/310: Add progress reporter when searching for difference., (continued)
- [elpa] externals/vlf 117935d 200/310: Add progress reporter when searching for difference., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf bfcbfd3 132/310: Make error message more descriptive., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 28646fb 148/310: Reduce scope of vlf-with-undo-disabled usages., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 72fec35 162/310: Update README and bump version., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 65b4d74 170/310: Refactor vlf-write., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 099adab 171/310: Fix abort-if-file-too-large advice not to activate VLF in case of empty, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf c58d0d8 180/310: Shift buffer-undo-list elements when chunk beginning moves., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 4f99eaa 183/310: Fixes to tiny chunk moves., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 7794b2c 185/310: Merge branch 'shift-undo' into chunk-move, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf d7766f2 209/310: Update documentation and mark autoloaded functions as interactive., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 5d30eb4 206/310: Use single ediff pass to adjust borders. Protect against user,
Stefan Monnier <=
- [elpa] externals/vlf ffac697 217/310: Keep undo list after occur or unsuccessful line search., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf b05255b 220/310: Add hooks to run around chunk moves and batch operations. Don't err, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 557d751 236/310: Be more precise on restoring hexl-mode after chunk update has been, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf ece554a 231/310: Wording., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 069b2f5 240/310: Replace operations with respective vlf-tune wrappers., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf fb05030 241/310: Add basic tune strategies., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf e18a05b 247/310: Add linear search for tuning and prefer smaller batches., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 48a014f 250/310: Fix write measuring and endless loop in nearby approximation., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf ee7409b 254/310: Tune batch size in more cases., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 5651ee3 252/310: Rename vlf-tune-optimal to vlf-tune-batch., Stefan Monnier, 2020/11/28