~ruther/guix-local

a74d0cc209c076150968dfe7b3b9975faad44701 — Ludovic Courtès 4 years ago b77b788
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).
1 files changed, 17 insertions(+), 17 deletions(-)

M guix/utils.scm
M guix/utils.scm => guix/utils.scm +17 -17
@@ 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))))))))))


;;;