From bd111aa4470d07ac9ab46902ff45a98c471de3a0 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 10 Aug 2016 12:46:41 -0400 Subject: [PATCH] More fine-grained control over things to rerender without restarting --- src/main.rkt | 2 +- src/signals.rkt | 19 +++++++++++++++---- src/site.rkt | 16 ++++++++++------ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main.rkt b/src/main.rkt index d4b7028..32d2dc5 100644 --- a/src/main.rkt +++ b/src/main.rkt @@ -8,7 +8,7 @@ (define (main [config (hash)]) (make-persistent-state '*config* (lambda () config)) (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 () (let ((port-str (getenv "SITE_PORT"))) (if port-str (string->number port-str) 7443)))) diff --git a/src/signals.rkt b/src/signals.rkt index a2a2e57..2970b1e 100644 --- a/src/signals.rkt +++ b/src/signals.rkt @@ -4,14 +4,20 @@ (provide poll-signal start-restart-signal-watcher) +(require (only-in racket/file file->string)) (require reloadable) (require "daemon.rkt") (define (poll-signal signal-file-name message handler) (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) - (handler))) + (if (procedure-arity-includes? handler 1) + (handler contents) + (handler)))) (define (start-restart-signal-watcher) (daemon-thread @@ -37,7 +43,12 @@ (lookup-reloadable-entry-point 'refresh-packages! "packages.rkt"))) (poll-signal "../signals/.rerender" "Static rerender request received" - (reloadable-entry-point->procedure - (lookup-reloadable-entry-point 'rerender-all! "site.rkt"))) + (lambda (request-body) + (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) (loop))))) diff --git a/src/site.rkt b/src/site.rkt index 755a096..5b213c0 100644 --- a/src/site.rkt +++ b/src/site.rkt @@ -2,7 +2,7 @@ (provide request-handler on-continuation-expiry - rerender-all!) + rerender!) (require racket/runtime-path) (require racket/set) @@ -1421,8 +1421,8 @@ (hash)))))) (set-package-external-information! package-name external-information)) -(define (rerender-all!) - (thread-send (package-change-handler-thread) 'rerender-all!)) +(define (rerender! items-to-rerender) + (thread-send (package-change-handler-thread) (list 'rerender! items-to-rerender))) (define (internal:rerender-not-found!) ;; TODO: general-purpose error page instead. @@ -1457,9 +1457,13 @@ (internal:rerender-not-found!) (package-change-handler index-rerender-needed? pending-completions)] - ['rerender-all! - (log-info "rerender-all!") - (for ((p (all-package-names))) + [(list 'rerender! items-to-rerender) + (log-info "rerender! ~v" items-to-rerender) + (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) (static-render! #:mime-type "text/html" relative-named-url