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

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

[elpa] externals/vlf 842569a 270/310: Add ability to use temporary file


From: Stefan Monnier
Subject: [elpa] externals/vlf 842569a 270/310: Add ability to use temporary file when adjusting content on save.
Date: Sat, 28 Nov 2020 00:33:29 -0500 (EST)

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

    Add ability to use temporary file when adjusting content on save.
---
 vlf-base.el  |  8 ++++---
 vlf-tune.el  | 15 +++++++------
 vlf-write.el | 70 +++++++++++++++++++++++++++++++++++++++---------------------
 3 files changed, 60 insertions(+), 33 deletions(-)

diff --git a/vlf-base.el b/vlf-base.el
index 26ee653..268dcaa 100644
--- a/vlf-base.el
+++ b/vlf-base.el
@@ -54,11 +54,13 @@
   "Get size in bytes of FILE."
   (or (nth 7 (file-attributes file)) 0))
 
-(defun vlf-verify-size (&optional update-visited-time)
+(defun vlf-verify-size (&optional update-visited-time file)
   "Update file size information if necessary and visited file time.
-If non-nil, UPDATE-VISITED-TIME."
+If non-nil, UPDATE-VISITED-TIME.
+FILE if given is filename to be used, otherwise `buffer-file-truename'."
   (unless (verify-visited-file-modtime (current-buffer))
-    (setq vlf-file-size (vlf-get-file-size buffer-file-truename))
+    (setq vlf-file-size (vlf-get-file-size (or file
+                                               buffer-file-truename)))
     (if update-visited-time
         (set-visited-file-modtime))))
 
diff --git a/vlf-tune.el b/vlf-tune.el
index f82a286..82d7f43 100644
--- a/vlf-tune.el
+++ b/vlf-tune.el
@@ -150,10 +150,11 @@ VEC is a vector of (mean time . count) elements ordered 
by size."
                               (- end start) (car result))
     (cdr result)))
 
-(defun vlf-tune-insert-file-contents-literally (start end)
-  "Insert raw file bytes START to END and save time it takes."
+(defun vlf-tune-insert-file-contents-literally (start end &optional file)
+  "Insert raw file bytes START to END and save time it takes.
+FILE if given is filename to be used, otherwise `buffer-file-name'."
   (let ((result (vlf-time (insert-file-contents-literally
-                           buffer-file-name nil start end))))
+                           (or file buffer-file-name) nil start end))))
     (vlf-tune-add-measurement vlf-tune-insert-raw-bps
                               (- end start) (car result))
     (cdr result)))
@@ -167,11 +168,13 @@ VEC is a vector of (mean time . count) elements ordered 
by size."
                               (cdr result) (car result))
     (cdr result)))
 
-(defun vlf-tune-write (start end append visit size)
+(defun vlf-tune-write (start end append visit size &optional file)
   "Save buffer and save time it takes.
 START, END, APPEND, VISIT have same meaning as in `write-region'.
-SIZE is number of bytes that are saved."
-  (let ((time (car (vlf-time (write-region start end buffer-file-name
+SIZE is number of bytes that are saved.
+FILE if given is filename to be used, otherwise `buffer-file-name'."
+  (let ((time (car (vlf-time (write-region start end
+                                           (or file buffer-file-name)
                                            append visit)))))
     (vlf-tune-add-measurement vlf-tune-write-bps size time)))
 
diff --git a/vlf-write.el b/vlf-write.el
index a29e1a9..709b7c6 100644
--- a/vlf-write.el
+++ b/vlf-write.el
@@ -65,10 +65,26 @@ If changing size of chunk, shift remaining file content."
                   (font-lock font-lock-mode))
               (font-lock-mode 0)
               (let ((batch-size vlf-batch-size)
-                    (time (float-time)))
-                (if (< 0 size-change)
-                    (vlf-file-shift-back size-change region-length)
-                  (vlf-file-shift-forward (- size-change) region-length))
+                    time)
+                (if (or (file-remote-p buffer-file-name)
+                        (y-or-n-p "File content needs be adjusted till\
+ end.  Use temporary copy of the whole file (slower but safer)? "))
+                    (let ((file-tmp (make-temp-file
+                                     (file-name-nondirectory
+                                      buffer-file-name))))
+                      (setq time (float-time))
+                      (copy-file buffer-file-name file-tmp t t t t)
+                      (if (< 0 size-change)
+                          (vlf-file-shift-back size-change region-length
+                                               file-tmp)
+                        (vlf-file-shift-forward (- size-change)
+                                                region-length file-tmp))
+                      (rename-file file-tmp buffer-file-name t))
+                  (setq time (float-time))
+                  (if (< 0 size-change)
+                      (vlf-file-shift-back size-change region-length)
+                    (vlf-file-shift-forward (- size-change)
+                                            region-length)))
                 (if font-lock (font-lock-mode 1))
                 (setq vlf-batch-size batch-size)
                 (vlf-move-to-chunk-2 vlf-start-pos
@@ -83,10 +99,11 @@ If changing size of chunk, shift remaining file content."
     (run-hook-with-args 'vlf-after-batch-functions 'write))
   t)
 
-(defun vlf-file-shift-back (size-change write-size)
+(defun vlf-file-shift-back (size-change write-size &optional file)
   "Shift file contents SIZE-CHANGE bytes back.
-WRITE-SIZE is byte length of saved chunk."
-  (vlf-tune-write nil nil vlf-start-pos t write-size)
+WRITE-SIZE is byte length of saved chunk.
+FILE if given is filename to be used, otherwise `buffer-file-name'."
+  (vlf-tune-write nil nil vlf-start-pos (if file nil t) write-size file)
   (let ((read-start-pos vlf-end-pos)
         (coding-system-for-write 'no-conversion)
         (reporter (make-progress-reporter "Adjusting file content..."
@@ -94,31 +111,34 @@ WRITE-SIZE is byte length of saved chunk."
                                           vlf-file-size)))
     (vlf-with-undo-disabled
      (while (vlf-shift-batch read-start-pos (- read-start-pos
-                                               size-change))
+                                               size-change)
+                             file)
        (setq read-start-pos (+ read-start-pos vlf-batch-size))
        (progress-reporter-update reporter read-start-pos))
      ;; pad end with space
      (erase-buffer)
-     (vlf-verify-size t)
+     (vlf-verify-size t file)
      (insert-char 32 size-change))
     (vlf-tune-write nil nil (- vlf-file-size size-change)
-                    t size-change)
+                    (if file nil t) size-change file)
     (progress-reporter-done reporter)))
 
-(defun vlf-shift-batch (read-pos write-pos)
+(defun vlf-shift-batch (read-pos write-pos file)
   "Read `vlf-batch-size' bytes from READ-POS and write them \
-back at WRITE-POS.  Return nil if EOF is reached, t otherwise."
+back at WRITE-POS using FILE.
+Return nil if EOF is reached, t otherwise."
   (erase-buffer)
-  (vlf-verify-size t)
-  (vlf-tune-batch '(:raw :write))
-  (let ((read-end (min (+ read-pos vlf-batch-size) vlf-file-size)))
-    (vlf-tune-insert-file-contents-literally read-pos read-end)
-    (vlf-tune-write nil nil write-pos 0 (- read-end read-pos))
+  (vlf-verify-size t file)
+  (vlf-tune-batch '(:raw :write)) ;insert speed over temp write file may defer 
wildly
+  (let ((read-end (min (+ read-pos vlf-batch-size) vlf-file-size))) ;compared 
to the original file
+    (vlf-tune-insert-file-contents-literally read-pos read-end file)
+    (vlf-tune-write nil nil write-pos 0 (- read-end read-pos) file)
     (< read-end vlf-file-size)))
 
-(defun vlf-file-shift-forward (size-change write-size)
+(defun vlf-file-shift-forward (size-change write-size &optional file)
   "Shift file contents SIZE-CHANGE bytes forward.
 WRITE-SIZE is byte length of saved chunk.
+FILE if given is filename to be used, otherwise `buffer-file-name'.
 Done by saving content up front and then writing previous batch."
   (vlf-tune-batch '(:raw :write))
   (let ((read-size (max vlf-batch-size size-change))
@@ -129,7 +149,7 @@ Done by saving content up front and then writing previous 
batch."
                                           vlf-file-size)))
     (vlf-with-undo-disabled
      (when (vlf-shift-batches read-size read-pos write-pos
-                              write-size t)
+                              write-size t file)
        (vlf-tune-batch '(:raw :write))
        (setq write-pos (+ read-pos size-change)
              read-pos (+ read-pos read-size)
@@ -138,7 +158,7 @@ Done by saving content up front and then writing previous 
batch."
        (progress-reporter-update reporter write-pos)
        (let ((coding-system-for-write 'no-conversion))
          (while (vlf-shift-batches read-size read-pos write-pos
-                                   write-size nil)
+                                   write-size nil file)
            (vlf-tune-batch '(:raw :write))
            (setq write-pos (+ read-pos size-change)
                  read-pos (+ read-pos read-size)
@@ -148,25 +168,27 @@ Done by saving content up front and then writing previous 
batch."
     (progress-reporter-done reporter)))
 
 (defun vlf-shift-batches (read-size read-pos write-pos write-size
-                                    hide-read)
+                                    hide-read file)
   "Append READ-SIZE bytes of file starting at READ-POS.
 Then write initial buffer content to file at WRITE-POS.
 WRITE-SIZE is byte length of saved chunk.
 If HIDE-READ is non nil, temporarily hide literal read content.
+FILE if given is filename to be used, otherwise `buffer-file-name'.
 Return nil if EOF is reached, t otherwise."
-  (vlf-verify-size t)
+  (vlf-verify-size t file)
   (let ((read-more (< read-pos vlf-file-size))
         (start-write-pos (point-min))
         (end-write-pos (point-max)))
     (when read-more
       (goto-char end-write-pos)
       (vlf-tune-insert-file-contents-literally
-       read-pos (min vlf-file-size (+ read-pos read-size))))
+       read-pos (min vlf-file-size (+ read-pos read-size)) file))
     ;; write
     (if hide-read ; hide literal region if user has to choose encoding
         (narrow-to-region start-write-pos end-write-pos))
     (vlf-tune-write start-write-pos end-write-pos write-pos
-                    (or (not read-more) 0) write-size)
+                    (or (and (not read-more) (not file)) 0)
+                    write-size file)
     (delete-region start-write-pos end-write-pos)
     (if hide-read (widen))
     read-more))



reply via email to

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