guix-commits
[Top][All Lists]
Advanced

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

01/06: utils: 'edit-expression' reads and conses less when not modifying


From: guix-commits
Subject: 01/06: utils: 'edit-expression' reads and conses less when not modifying.
Date: Wed, 26 Jan 2022 11:56:03 -0500 (EST)

civodul pushed a commit to branch master
in repository guix.

commit a74d0cc209c076150968dfe7b3b9975faad44701
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Sat Jan 8 17:29:12 2022 +0100

    utils: 'edit-expression' reads and conses less when not modifying.
    
    * guix/utils.scm (edit-expression): Delay call to 'get-bytevector-all'
    until after (string=? str* str).
---
 guix/utils.scm | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/guix/utils.scm b/guix/utils.scm
index cba6464523..a0ca9b9070 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 
Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012-2022 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
@@ -454,27 +454,27 @@ This procedure returns #t on success."
                  (str     (iconv:bytevector->string
                            (get-bytevector-n in (- end start))
                            (port-encoding in)))
-                 (post-bv (get-bytevector-all in))
                  (str*    (proc str)))
             ;; Modify FILE only if there are changes.
             (unless (string=? str* str)
               ;; Verify the edited expression is still a scheme expression.
               (call-with-input-string str* read)
-              ;; Update the file with edited expression.
-              (with-atomic-file-output file
-                (lambda (out)
-                  (put-bytevector out pre-bv)
-                  (display str* out)
-                  ;; post-bv maybe the end-of-file object.
-                  (when (not (eof-object? post-bv))
-                    (put-bytevector out post-bv))
-                  #t))
-
-              ;; Due to 'with-atomic-file-output', IN and FILE no longer share
-              ;; the same inode, but we can reassign the source map up to LINE
-              ;; to the new file.
-              (move-source-location-map! (stat in) (stat file)
-                                         (+ 1 line)))))))))
+
+              (let ((post-bv (get-bytevector-all in)))
+                ;; Update the file with edited expression.
+                (with-atomic-file-output file
+                  (lambda (out)
+                    (put-bytevector out pre-bv)
+                    (display str* out)
+                    (unless (eof-object? post-bv)
+                      ;; Copy everything that came after STR.
+                      (put-bytevector out post-bv))))
+
+                ;; Due to 'with-atomic-file-output', IN and FILE no longer
+                ;; share the same inode, but we can reassign the source map up
+                ;; to LINE to the new file.
+                (move-source-location-map! (stat in) (stat file)
+                                           (+ 1 line))))))))))
 
 
 ;;;



reply via email to

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