summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2012-07-07 18:11:52 +0200
committerLudovic Courtès <ludo@gnu.org>2012-07-07 18:11:52 +0200
commitd9dbab18e2f5e1854f663bfe760765c29c11cbd9 (patch)
treef167a73b2c818052fc3c91e32576dab8830170d4
parent4fa697e932d5634441e4e281ce6879ca3a082a30 (diff)
downloadguix-d9dbab18e2f5e1854f663bfe760765c29c11cbd9.tar.gz
utils: Have `substitute' restore the file's permission bits.
* guix/build/utils.scm (substitute): Restore FILE's mode before renaming
  TEMPLATE.
-rw-r--r--guix/build/utils.scm25
1 files changed, 14 insertions, 11 deletions
diff --git a/guix/build/utils.scm b/guix/build/utils.scm
index 3dc7674043..e99afdfcf3 100644
--- a/guix/build/utils.scm
+++ b/guix/build/utils.scm
@@ -159,7 +159,8 @@ as (PROC MATCH OUTPUT-PORT)."
                                 proc)))
                         pattern+procs))
          (template (string-append file ".XXXXXX"))
-         (out      (mkstemp! template)))
+         (out      (mkstemp! template))
+         (mode     (stat:mode (stat file))))
     (with-throw-handler #t
       (lambda ()
         (call-with-input-file file
@@ -168,18 +169,20 @@ as (PROC MATCH OUTPUT-PORT)."
               (if (eof-object? line)
                   #t
                   (begin
-                    (for-each (match-lambda
-                               ((regexp . proc)
-                                (cond ((regexp-exec regexp line)
-                                       =>
-                                       (lambda (m)
-                                         (proc m out)))
-                                      (else
-                                       (display line out)
-                                       (newline out)))))
-                              rx+proc)
+                    (or (any (match-lambda
+                              ((regexp . proc)
+                               (and=> (regexp-exec regexp line)
+                                      (lambda (m)
+                                        (proc m out)
+                                        #t))))
+                             rx+proc)
+                        (begin
+                          (display line out)
+                          (newline out)
+                          #t))
                     (loop (read-line in)))))))
         (close out)
+        (chmod template mode)
         (rename-file template file))
       (lambda (key . args)
         (false-if-exception (delete-file template))))))