emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/vlf df8c9ea 191/310: Detect change of file when loading


From: Stefan Monnier
Subject: [elpa] externals/vlf df8c9ea 191/310: Detect change of file when loading chunk and act more cautiously. Move
Date: Sat, 28 Nov 2020 00:33:13 -0500 (EST)

branch: externals/vlf
commit df8c9ea5dd9e0f520aeadaa8c8e5be1e817a0a69
Author: Andrey Kotlarski <m00naticus@gmail.com>
Commit: Andrey Kotlarski <m00naticus@gmail.com>

    Detect change of file when loading chunk and act more cautiously.  Move
    some functions around.
---
 vlf-base.el  | 42 ++++++++++++++++++++++++++++++++++++------
 vlf-write.el |  9 ++++-----
 vlf.el       | 27 ---------------------------
 3 files changed, 40 insertions(+), 38 deletions(-)

diff --git a/vlf-base.el b/vlf-base.el
index e78c199..de978ae 100644
--- a/vlf-base.el
+++ b/vlf-base.el
@@ -22,7 +22,8 @@
 ;; Boston, MA 02111-1307, USA.
 
 ;;; Commentary:
-;; This package provides basic chunk operations for VLF
+;; This package provides basic chunk operations for VLF,
+;; most notable being the `vlf-move-to-chunk' function.
 
 ;;; Code:
 
@@ -35,11 +36,38 @@
         (t ;; TODO: use (< emacs-minor-version 4) after 24.4 release
          (string-lessp emacs-version "24.3.5")))
   "Indicates whether partial decode codes are displayed.")
+(defun vlf-get-file-size (file)
+  "Get size in bytes of FILE."
+  (or (nth 7 (file-attributes file)) 0))
+
+(defun vlf-verify-size (&optional update-visited-time)
+  "Update file size information if necessary and visited file time.
+If non-nil, UPDATE-VISITED-TIME."
+  (unless (verify-visited-file-modtime (current-buffer))
+    (setq vlf-file-size (vlf-get-file-size buffer-file-truename))
+    (if update-visited-time
+        (set-visited-file-modtime))))
+
 (unless (fboundp 'file-size-human-readable)
   (defun file-size-human-readable (file-size)
     "Print FILE-SIZE in MB."
     (format "%.3fMB" (/ file-size 1048576.0))))
 
+(defun vlf-update-buffer-name ()
+  "Update the current buffer name."
+  (rename-buffer (format "%s(%d/%d)[%s]"
+                         (file-name-nondirectory buffer-file-name)
+                         (/ vlf-end-pos vlf-batch-size)
+                         (/ vlf-file-size vlf-batch-size)
+                         (file-size-human-readable vlf-batch-size))
+                 t))
+
+(defmacro vlf-with-undo-disabled (&rest body)
+  "Execute BODY with temporarily disabled undo."
+  `(let ((undo-list buffer-undo-list))
+     (setq buffer-undo-list t)
+     (unwind-protect (progn ,@body)
+       (setq buffer-undo-list undo-list))))
 
 (defun vlf-move-to-chunk (start end &optional minimal)
   "Move to chunk determined by START END.
@@ -69,13 +97,14 @@ bytes added to the end."
                                    buffer-file-coding-system t)))
                      vlf-end-pos)))
     (cond
-     ((and (= start vlf-start-pos) (= end edit-end))
-      (or modified (vlf-move-to-chunk-2 start end)))
-     ((or (<= edit-end start) (<= end vlf-start-pos))
+     ((or (< edit-end start) (< end vlf-start-pos)
+          (not (verify-visited-file-modtime (current-buffer))))
       (when (or (not modified)
                 (y-or-n-p "Chunk modified, are you sure? ")) ;full chunk 
renewal
         (set-buffer-modified-p nil)
         (vlf-move-to-chunk-2 start end)))
+     ((and (= start vlf-start-pos) (= end edit-end))
+      (or modified (vlf-move-to-chunk-2 start end)))
      ((or (and (<= start vlf-start-pos) (<= edit-end end))
           (not modified)
           (y-or-n-p "Chunk modified, are you sure? "))
@@ -135,12 +164,14 @@ bytes added to the end."
           (setq vlf-start-pos start
                 vlf-end-pos (+ end shift-end)))
         (set-buffer-modified-p modified)
+        (set-visited-file-modtime)
         (cons shift-start shift-end))))))
 
 (defun vlf-move-to-chunk-2 (start end)
-  "Unconditionally move to chunk determined by START END.
+  "Unconditionally move to chunk enclosed by START END bytes.
 Return number of bytes moved back for proper decoding and number of
 bytes added to the end."
+  (vlf-verify-size t)
   (setq vlf-start-pos (max 0 start)
         vlf-end-pos (min end vlf-file-size))
   (let (shifts)
@@ -156,7 +187,6 @@ bytes added to the end."
                       (point-max)))))
     (set-buffer-modified-p nil)
     (setq buffer-undo-list nil)
-    (set-visited-file-modtime)
     shifts))
 
 (defun vlf-insert-file-contents (start end adjust-start adjust-end
diff --git a/vlf-write.el b/vlf-write.el
index 9e45b9c..f473742 100644
--- a/vlf-write.el
+++ b/vlf-write.el
@@ -52,8 +52,7 @@ Save anyway? "))
              (let ((pos (point)))
                (if (< 0 size-change)
                    (vlf-file-shift-back size-change)
-                 (vlf-file-shift-forward (- size-change))
-                 (vlf-verify-size))
+                 (vlf-file-shift-forward (- size-change)))
                (vlf-move-to-chunk-2 vlf-start-pos
                                     (if (< (- vlf-end-pos vlf-start-pos)
                                            vlf-batch-size)
@@ -78,7 +77,7 @@ Save anyway? "))
        (progress-reporter-update reporter read-start-pos))
      ;; pad end with space
      (erase-buffer)
-     (vlf-verify-size)
+     (vlf-verify-size t)
      (insert-char 32 size-change))
     (write-region nil nil buffer-file-name (- vlf-file-size
                                               size-change) t)
@@ -88,7 +87,7 @@ Save anyway? "))
   "Read `vlf-batch-size' bytes from READ-POS and write them \
 back at WRITE-POS.  Return nil if EOF is reached, t otherwise."
   (erase-buffer)
-  (vlf-verify-size)
+  (vlf-verify-size t)
   (let ((read-end (+ read-pos vlf-batch-size)))
     (insert-file-contents-literally buffer-file-name nil
                                     read-pos
@@ -122,7 +121,7 @@ Done by saving content up front and then writing previous 
batch."
 Then write initial buffer content to file at WRITE-POS.
 If HIDE-READ is non nil, temporarily hide literal read content.
 Return nil if EOF is reached, t otherwise."
-  (vlf-verify-size)
+  (vlf-verify-size t)
   (let ((read-more (< read-pos vlf-file-size))
         (start-write-pos (point-min))
         (end-write-pos (point-max)))
diff --git a/vlf.el b/vlf.el
index 015f67a..137faca 100644
--- a/vlf.el
+++ b/vlf.el
@@ -107,13 +107,6 @@
     map)
   "Prefixed keymap for `vlf-mode'.")
 
-(defmacro vlf-with-undo-disabled (&rest body)
-  "Execute BODY with temporarily disabled undo."
-  `(let ((undo-list buffer-undo-list))
-     (setq buffer-undo-list t)
-     (unwind-protect (progn ,@body)
-       (setq buffer-undo-list undo-list))))
-
 (define-minor-mode vlf-mode
   "Mode to browse large files in."
   :lighter " VLF"
@@ -189,25 +182,6 @@ with the prefix argument DECREASE it is halved."
                          (* vlf-batch-size 2)))
   (vlf-move-to-batch vlf-start-pos))
 
-(defun vlf-update-buffer-name ()
-  "Update the current buffer name."
-  (rename-buffer (format "%s(%d/%d)[%s]"
-                         (file-name-nondirectory buffer-file-name)
-                         (/ vlf-end-pos vlf-batch-size)
-                         (/ vlf-file-size vlf-batch-size)
-                         (file-size-human-readable vlf-batch-size))
-                 t))
-
-(defun vlf-get-file-size (file)
-  "Get size in bytes of FILE."
-  (or (nth 7 (file-attributes file)) 0))
-
-(defun vlf-verify-size ()
-  "Update file size information if necessary and visited file time."
-  (unless (verify-visited-file-modtime (current-buffer))
-    (setq vlf-file-size (vlf-get-file-size buffer-file-truename))
-    (set-visited-file-modtime)))
-
 (defun vlf-insert-file (&optional from-end)
   "Insert first chunk of current file contents in current buffer.
 With FROM-END prefix, start from the back."
@@ -237,7 +211,6 @@ Ask for confirmation if NOCONFIRM is nil."
             (yes-or-no-p (format "Revert buffer from file %s? "
                                  buffer-file-name)))
     (set-buffer-modified-p nil)
-    (set-visited-file-modtime)
     (vlf-move-to-chunk-2 vlf-start-pos vlf-end-pos)))
 
 (defun vlf-jump-to-chunk (n)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]