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).
This commit is contained in:
parent
b77b788421
commit
a74d0cc209
@ -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))))))))))
|
||||
|
||||
|
||||
;;;
|
||||
|
Loading…
Reference in New Issue
Block a user