(zilch magic): add helper to turn a store path into its FOD equivalent
This commit is contained in:
parent
9d72e8a246
commit
ec41674598
1 changed files with 55 additions and 9 deletions
|
|
@ -5,9 +5,10 @@
|
||||||
(import
|
(import
|
||||||
(scheme base) (scheme file)
|
(scheme base) (scheme file)
|
||||||
(zilch lib hash) (zilch nix daemon) (zilch nix drv) (zilch nix path)
|
(zilch lib hash) (zilch nix daemon) (zilch nix drv) (zilch nix path)
|
||||||
|
(zilch nix hash)
|
||||||
(zilch planner step)
|
(zilch planner step)
|
||||||
(zilch zexpr)
|
(zilch zexpr)
|
||||||
(srfi 128) (srfi 132) (srfi 146) (srfi 152)
|
(srfi 128) (srfi 132) (srfi 146) (srfi 152) (srfi 207)
|
||||||
(chicken base) (chicken format) socket)
|
(chicken base) (chicken format) socket)
|
||||||
|
|
||||||
(export
|
(export
|
||||||
|
|
@ -24,16 +25,61 @@
|
||||||
zilch-magic-counters)
|
zilch-magic-counters)
|
||||||
|
|
||||||
(begin
|
(begin
|
||||||
|
|
||||||
|
(define (daemon-connect)
|
||||||
|
(define conn
|
||||||
|
(parameterize
|
||||||
|
((socket-send-buffer-size 4096) (socket-send-size 4096) (socket-receive-timeout 60000) (socket-send-timeout 5000))
|
||||||
|
(let ((unix-socket (socket af/unix sock/stream)))
|
||||||
|
(socket-connect unix-socket (unix-address "/nix/var/nix/daemon-socket/socket"))
|
||||||
|
(let-values (((in-port out-port) (socket-i/o-ports unix-socket)))
|
||||||
|
(make-daemon-link in-port out-port)))))
|
||||||
|
(daemon-wop-handshake conn)
|
||||||
|
conn)
|
||||||
|
|
||||||
|
(define (daemon-close conn)
|
||||||
|
(close-input-port (daemon-link-in-port conn))
|
||||||
|
(close-output-port (daemon-link-out-port conn)))
|
||||||
|
|
||||||
;; The daemon connection used by `(zilch magic)`.
|
;; The daemon connection used by `(zilch magic)`.
|
||||||
(define *daemon*
|
(define *daemon*
|
||||||
(make-parameter
|
(make-parameter (daemon-connect)))
|
||||||
(parameterize
|
|
||||||
((socket-send-buffer-size 4096) (socket-send-size 4096) (socket-receive-timeout 60000) (socket-send-timeout 5000))
|
; Create a CA store path from the store path being passed in.
|
||||||
(let ((unix-socket (socket af/unix sock/stream)))
|
(define (store-path-to-fod conn path)
|
||||||
(socket-connect unix-socket (unix-address "/nix/var/nix/daemon-socket/socket"))
|
(define data (daemon-wop-query-path-info conn path))
|
||||||
(let-values (((in-port out-port) (socket-i/o-ports unix-socket)))
|
(define nar-size (valid-path-info-nar-size data))
|
||||||
(make-daemon-link in-port out-port))))))
|
(define hash (valid-path-info-nar-hash data))
|
||||||
(daemon-wop-handshake (*daemon*))
|
(define references (valid-path-info-references data))
|
||||||
|
(define references-filtered (list-copy references))
|
||||||
|
(define self-references (member path references-filtered string=?))
|
||||||
|
(when self-references
|
||||||
|
(if (null? (cdr self-references))
|
||||||
|
(set! references-filtered '())
|
||||||
|
(begin
|
||||||
|
; Cheaply remove this item from the list.
|
||||||
|
; (self-references . (foo . (bar . baz)))
|
||||||
|
; -> (foo . (bar . baz)
|
||||||
|
(set-car! self-references (cadr self-references))
|
||||||
|
(set-cdr! self-references (cddr self-references)))))
|
||||||
|
|
||||||
|
(define name (string-copy path (+ (string-length (%store-dir)) 1 32 1)))
|
||||||
|
(define ca-store-path (make-fixed-output-with-references hash name references-filtered self-references))
|
||||||
|
(unless (daemon-wop-query-path-info conn ca-store-path)
|
||||||
|
(daemon-wop-add-to-store-nar conn ca-store-path (valid-path-info-deriver data) (hex hash) references nar-size (string-append "fixed:r:sha256:" (as-base32 hash))
|
||||||
|
(lambda (write-blob)
|
||||||
|
(define new-conn (daemon-connect))
|
||||||
|
(daemon-wop-nar-from-path new-conn path)
|
||||||
|
(define blob (make-bytevector 4096))
|
||||||
|
(do ((i 0))
|
||||||
|
((= i nar-size) (daemon-close new-conn))
|
||||||
|
(let* ((chunk-size (min 4096 (- nar-size i)))
|
||||||
|
(bytes-read (read-bytevector! blob (daemon-link-in-port new-conn) 0 chunk-size)))
|
||||||
|
(when (eof-object? bytes-read)
|
||||||
|
(error "unexpected EOF"))
|
||||||
|
(set! i (+ i bytes-read))
|
||||||
|
(write-blob blob 0 bytes-read))))))
|
||||||
|
(values name hash nar-size ca-store-path))
|
||||||
|
|
||||||
;; If set to `#f`, `store-path-for-ca-drv*` will not generate
|
;; If set to `#f`, `store-path-for-ca-drv*` will not generate
|
||||||
;; content-addressed derivations.
|
;; content-addressed derivations.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue