diff options
author | Marius Bakke <mbakke@fastmail.com> | 2020-01-11 22:38:24 +0100 |
---|---|---|
committer | Marius Bakke <mbakke@fastmail.com> | 2020-01-11 22:38:24 +0100 |
commit | b7bf02a418e946b610ef68e8c5131f2350835956 (patch) | |
tree | 6d84387279b9870dc0b151bb9d3dce7f9d9de73d /guix/build | |
parent | 233c1be0a30846f6646b1f4edc6257037d0835fc (diff) | |
parent | 13efb24850bc40fab2448771c87c77c9a69fc231 (diff) | |
download | gnu-guix-b7bf02a418e946b610ef68e8c5131f2350835956.tar gnu-guix-b7bf02a418e946b610ef68e8c5131f2350835956.tar.gz |
Merge branch 'master' into core-updates
Diffstat (limited to 'guix/build')
-rw-r--r-- | guix/build/asdf-build-system.scm | 2 | ||||
-rw-r--r-- | guix/build/download.scm | 80 |
2 files changed, 46 insertions, 36 deletions
diff --git a/guix/build/asdf-build-system.scm b/guix/build/asdf-build-system.scm index dd6373b33a..1be2b3c5f0 100644 --- a/guix/build/asdf-build-system.scm +++ b/guix/build/asdf-build-system.scm @@ -79,7 +79,7 @@ valid." (let ((source (getcwd)) (target (source-directory out name)) (system-path (string-append out %system-install-prefix))) - (copy-recursively source target) + (copy-recursively source target #:keep-mtime? #t) (mkdir-p system-path) (for-each (lambda (file) diff --git a/guix/build/download.scm b/guix/build/download.scm index 53a144f126..0f2d5f402a 100644 --- a/guix/build/download.scm +++ b/guix/build/download.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr> ;;; @@ -28,6 +28,7 @@ #:use-module (guix build utils) #:use-module (guix progress) #:use-module (rnrs io ports) + #:use-module ((ice-9 binary-ports) #:select (unget-bytevector)) #:use-module (rnrs bytevectors) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) @@ -154,20 +155,12 @@ out if the connection could not be established in less than TIMEOUT seconds." ;; be bound if we need them, because (guix download) adds GnuTLS as an ;; input in that case. -;; XXX: Use this hack instead of #:autoload to avoid compilation errors. -;; See <http://bugs.gnu.org/12202>. -(module-autoload! (current-module) - '(gnutls) - '(make-session connection-end/client)) - -(define %tls-ports - ;; Mapping of session record ports to the underlying file port. - (make-weak-key-hash-table)) - -(define (register-tls-record-port record-port port) - "Hold a weak reference from RECORD-PORT to PORT, where RECORD-PORT is a TLS -session record port using PORT as its underlying communication port." - (hashq-set! %tls-ports record-port port)) +(define (load-gnutls) + ;; XXX: Use this hack instead of #:autoload to avoid compilation errors. + ;; See <http://bugs.gnu.org/12202>. + (module-use! (resolve-module '(guix build download)) + (resolve-interface '(gnutls))) + (set! load-gnutls (const #t))) (define %x509-certificate-directory ;; The directory where X.509 authority PEM certificates are stored. @@ -253,6 +246,7 @@ host name without trailing dot." (format (current-error-port) "gnutls: [~a|~a] ~a" (getpid) level str)) + (load-gnutls) (let ((session (make-session connection-end/client)) (ca-certs (%x509-certificate-directory))) @@ -311,17 +305,40 @@ host name without trailing dot." (apply throw args)))) (let ((record (session-record-port session))) - ;; Since we use `fileno' above, the file descriptor behind PORT would be - ;; closed when PORT is GC'd. If we used `port->fdes', it would instead - ;; never be closed. So we use `fileno', but keep a weak reference to - ;; PORT, so the file descriptor gets closed when RECORD is GC'd. - (register-tls-record-port record port) - - ;; Write HTTP requests line by line rather than byte by byte: - ;; <https://bugs.gnu.org/22966>. This is possible with Guile >= 2.2. - (setvbuf record 'line) - - record))) + (define (read! bv start count) + (define read-bv (get-bytevector-some record)) + (if (eof-object? read-bv) + 0 ; read! returns 0 on eof-object + (let ((read-bv-len (bytevector-length read-bv))) + (bytevector-copy! read-bv 0 bv start (min read-bv-len count)) + (when (< count read-bv-len) + (unget-bytevector record bv count (- read-bv-len count))) + read-bv-len))) + (define (write! bv start count) + (put-bytevector record bv start count) + (force-output record) + count) + (define (get-position) + (port-position record)) + (define (set-position! new-position) + (set-port-position! record new-position)) + (define (close) + (unless (port-closed? port) + (close-port port)) + (unless (port-closed? record) + (close-port record))) + + (setvbuf record 'block) + + ;; Return a port that wraps RECORD to ensure that closing it also + ;; closes PORT, the actual socket port, and its file descriptor. + ;; XXX: This wrapper would be unnecessary if GnuTLS could + ;; automatically close SESSION's file descriptor when RECORD is + ;; closed, but that doesn't seem to be possible currently (as of + ;; 3.6.9). + (make-custom-binary-input/output-port "gnutls wrapped port" read! write! + get-position set-position! + close)))) (define (ensure-uri uri-or-string) ;XXX: copied from (web http) (cond @@ -429,16 +446,9 @@ VERIFY-CERTIFICATE? is true, verify HTTPS server certificates." #:verify-certificate? verify-certificate?) s))))) -(define (close-connection port) - "Like 'close-port', but (1) idempotent, and (2) also closes the underlying -port if PORT is a TLS session record port." - ;; FIXME: This is a partial workaround for <http://bugs.gnu.org/20145>, - ;; because 'http-fetch' & co. may return a chunked input port whose 'close' - ;; method calls 'close-port', not 'close-connection'. +(define (close-connection port) ;deprecated (unless (port-closed? port) - (close-port port)) - (and=> (hashq-ref %tls-ports port) - close-connection)) + (close-port port))) ;; XXX: This is an awful hack to make sure the (set-port-encoding! p ;; "ISO-8859-1") call in `read-response' passes, even during bootstrap |