More fine-grained control over things to rerender without restarting

This commit is contained in:
Tony Garnock-Jones 2016-08-10 12:46:41 -04:00
parent 31bb1312e8
commit bd111aa447
3 changed files with 26 additions and 11 deletions

View File

@ -8,7 +8,7 @@
(define (main [config (hash)]) (define (main [config (hash)])
(make-persistent-state '*config* (lambda () config)) (make-persistent-state '*config* (lambda () config))
(void (make-reloadable-entry-point 'refresh-packages! "packages.rkt")) (void (make-reloadable-entry-point 'refresh-packages! "packages.rkt"))
(void (make-reloadable-entry-point 'rerender-all! "site.rkt")) (void (make-reloadable-entry-point 'rerender! "site.rkt"))
(start-service #:port (hash-ref config 'port (lambda () (start-service #:port (hash-ref config 'port (lambda ()
(let ((port-str (getenv "SITE_PORT"))) (let ((port-str (getenv "SITE_PORT")))
(if port-str (string->number port-str) 7443)))) (if port-str (string->number port-str) 7443))))

View File

@ -4,14 +4,20 @@
(provide poll-signal (provide poll-signal
start-restart-signal-watcher) start-restart-signal-watcher)
(require (only-in racket/file file->string))
(require reloadable) (require reloadable)
(require "daemon.rkt") (require "daemon.rkt")
(define (poll-signal signal-file-name message handler) (define (poll-signal signal-file-name message handler)
(when (file-exists? signal-file-name) (when (file-exists? signal-file-name)
(log-info message) (define contents (file->string signal-file-name))
(if (string=? contents "")
(log-info "~a" message)
(log-info "~a: ~a" message contents))
(delete-file signal-file-name) (delete-file signal-file-name)
(handler))) (if (procedure-arity-includes? handler 1)
(handler contents)
(handler))))
(define (start-restart-signal-watcher) (define (start-restart-signal-watcher)
(daemon-thread (daemon-thread
@ -37,7 +43,12 @@
(lookup-reloadable-entry-point 'refresh-packages! "packages.rkt"))) (lookup-reloadable-entry-point 'refresh-packages! "packages.rkt")))
(poll-signal "../signals/.rerender" (poll-signal "../signals/.rerender"
"Static rerender request received" "Static rerender request received"
(reloadable-entry-point->procedure (lambda (request-body)
(lookup-reloadable-entry-point 'rerender-all! "site.rkt"))) (define items-to-rerender (read (open-input-string request-body)))
((reloadable-entry-point->procedure
(lookup-reloadable-entry-point 'rerender! "site.rkt"))
(if (eof-object? items-to-rerender)
#f
items-to-rerender))))
(sleep 0.5) (sleep 0.5)
(loop))))) (loop)))))

View File

@ -2,7 +2,7 @@
(provide request-handler (provide request-handler
on-continuation-expiry on-continuation-expiry
rerender-all!) rerender!)
(require racket/runtime-path) (require racket/runtime-path)
(require racket/set) (require racket/set)
@ -1421,8 +1421,8 @@
(hash)))))) (hash))))))
(set-package-external-information! package-name external-information)) (set-package-external-information! package-name external-information))
(define (rerender-all!) (define (rerender! items-to-rerender)
(thread-send (package-change-handler-thread) 'rerender-all!)) (thread-send (package-change-handler-thread) (list 'rerender! items-to-rerender)))
(define (internal:rerender-not-found!) (define (internal:rerender-not-found!)
;; TODO: general-purpose error page instead. ;; TODO: general-purpose error page instead.
@ -1457,9 +1457,13 @@
(internal:rerender-not-found!) (internal:rerender-not-found!)
(package-change-handler index-rerender-needed? (package-change-handler index-rerender-needed?
pending-completions)] pending-completions)]
['rerender-all! [(list 'rerender! items-to-rerender)
(log-info "rerender-all!") (log-info "rerender! ~v" items-to-rerender)
(for ((p (all-package-names))) (define packages-to-rerender
(if items-to-rerender
(filter symbol? items-to-rerender)
(all-package-names)))
(for ((p packages-to-rerender))
(update-external-package-information! p) (update-external-package-information! p)
(static-render! #:mime-type "text/html" (static-render! #:mime-type "text/html"
relative-named-url relative-named-url