Skip to content

Commit cb387a7

Browse files
committed
Skip rerunning blog posts that have not changed
1 parent 2ac8b6c commit cb387a7

File tree

3 files changed

+46
-49
lines changed

3 files changed

+46
-49
lines changed

blog/build.rkt

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
racket/path
1010
racket/promise
1111
racket/sequence
12+
racket/serialize
1213
scribble/base-render
1314
scribble/xref
1415
setup/xref
@@ -38,17 +39,6 @@
3839
(path-replace-extension #".sxref")
3940
(build-path build-dir _)))
4041

41-
(define (post-dep-page-path dep)
42-
(match-define (regexp #px"^(\\d{4})-(\\d{2})-(\\d{2})-(.+)$" (list _ year month day slug))
43-
(path->string (path-replace-extension (file-name-from-path (post-dep-src-path dep)) #"")))
44-
(build-path output-dir "blog" year month day slug "index.html"))
45-
46-
(define (output-path->absolute-url path)
47-
(define rooted-path (build-path "/" (find-relative-path output-dir path)))
48-
(path->string (if (equal? (path->string (file-name-from-path rooted-path)) "index.html")
49-
(path-only rooted-path)
50-
rooted-path)))
51-
5242
(define (markdown-post file-name)
5343
(define path (build-path posts-dir file-name))
5444
(define main-part-promise (delay (parse-markdown-post (file->string path) path)))
@@ -100,53 +90,59 @@
10090
(write-xexpr xexpr out))
10191

10292
(define (build-post-body dep)
103-
(eprintf "~a running <posts>/~a\n" (timestamp-string) (find-relative-path posts-dir (post-dep-src-path dep)))
104-
(define renderer (new (render-mixin render%)
105-
[dest-dir build-dir]))
106-
(define main-parts (list (post-dep-main-part dep)))
107-
(define out-paths (list (post-dep-info-path dep)))
108-
109-
(define traverse-info (send renderer traverse main-parts out-paths))
110-
(define collect-info (send renderer collect main-parts out-paths traverse-info))
111-
(xref-transfer-info renderer collect-info (load-collections-xref))
112-
(define resolve-info (send renderer resolve main-parts out-paths collect-info))
113-
114-
(match-define (list (? rendered-post? post-info))
115-
(send renderer render main-parts out-paths resolve-info))
116-
117-
(define out-info (send renderer serialize-info resolve-info))
118-
(call-with-output-file* #:exists 'truncate/replace
119-
(post-dep-xref-path dep)
120-
(λ~>> (write out-info)))
121-
122-
(define undefined-tags (send renderer get-undefined resolve-info))
123-
(unless (empty? undefined-tags)
124-
(eprintf "Warning: some cross references may be broken due to undefined tags:\n")
125-
(for ([tag (in-list undefined-tags)])
126-
(eprintf " ~s\n" tag)))
127-
128-
post-info)
93+
(define src-mod-time (file-or-directory-modify-seconds (post-dep-src-path dep) #f (λ () #f)))
94+
(define info-mod-time (file-or-directory-modify-seconds (post-dep-info-path dep) #f (λ () #f)))
95+
(cond
96+
[(and src-mod-time info-mod-time (> info-mod-time src-mod-time))
97+
(deserialize (call-with-input-file* (post-dep-info-path dep) read))]
98+
[else
99+
(eprintf "~a running <posts>/~a\n" (timestamp-string) (find-relative-path posts-dir (post-dep-src-path dep)))
100+
(define renderer (new (render-mixin render%)
101+
[dest-dir build-dir]))
102+
(define main-parts (list (post-dep-main-part dep)))
103+
(define out-paths (list (post-dep-info-path dep)))
104+
105+
(define traverse-info (send renderer traverse main-parts out-paths))
106+
(define collect-info (send renderer collect main-parts out-paths traverse-info))
107+
(xref-transfer-info renderer collect-info (load-collections-xref))
108+
(define resolve-info (send renderer resolve main-parts out-paths collect-info))
109+
110+
(match-define (list (? rendered-post? post-info))
111+
(send renderer render main-parts out-paths resolve-info))
112+
113+
(define out-info (send renderer serialize-info resolve-info))
114+
(call-with-output-file* #:exists 'truncate/replace
115+
(post-dep-xref-path dep)
116+
(λ~>> (write out-info)))
117+
118+
(define undefined-tags (send renderer get-undefined resolve-info))
119+
(unless (empty? undefined-tags)
120+
(eprintf "Warning: some cross references may be broken due to undefined tags:\n")
121+
(for ([tag (in-list undefined-tags)])
122+
(eprintf " ~s\n" tag)))
123+
124+
post-info]))
129125

130126
(define (build-post-page dep info)
131-
(define out-path (post-dep-page-path dep))
132-
(eprintf "~a rendering <output>/~a\n" (timestamp-string) (find-relative-path output-dir out-path))
127+
(define site-path (rendered-post-path info #:file? #t))
128+
(define out-path (reroot-path site-path output-dir))
129+
(eprintf "~a rendering <output>~a\n" (timestamp-string) site-path)
133130
(make-parent-directory* out-path)
134131
(call-with-output-file* #:exists 'truncate/replace
135132
out-path
136133
(λ~>> (write-html (post-page info)))))
137134

138135
(define (build-post-index total-pages number posts)
139-
(define base-path (index-path number #:file? #t))
140-
(define out-path (reroot-path base-path output-dir))
141-
(eprintf "~a rendering <output>~a\n" (timestamp-string) base-path)
136+
(define site-path (index-path number #:file? #t))
137+
(eprintf "~a rendering <output>~a\n" (timestamp-string) site-path)
142138
(call-with-output-file* #:exists 'truncate/replace
143-
out-path
139+
(reroot-path site-path output-dir)
144140
(λ~>> (write-html (post-index-page total-pages number posts)))))
145141

146142
(define (build-tag-index total-pages page-number tag posts)
147-
(define base-path (tag-index-path tag page-number))
148-
(define out-path (reroot-path base-path output-dir))
149-
(eprintf "~a rendering <output>~a\n" (timestamp-string) base-path)
143+
(define site-path (tag-index-path tag page-number))
144+
(define out-path (reroot-path site-path output-dir))
145+
(eprintf "~a rendering <output>~a\n" (timestamp-string) site-path)
150146
(make-parent-directory* out-path)
151147
(call-with-output-file* #:exists 'truncate/replace
152148
out-path
@@ -178,5 +174,5 @@
178174
[page-number (in-naturals 1)])
179175
(build-tag-index total-pages page-number tag posts))))
180176

181-
(parameterize ([current-directory "/home/alexis/code/blog2"])
177+
(module+ main
182178
(build-all))

blog/build/metadata.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
(provide (struct-out rendered-post)
1111
(contract-out
12-
[rendered-post-path (-> rendered-post? site-path?)]))
12+
[rendered-post-path (->* [rendered-post?] [#:file? any/c] site-path?)]))
1313

1414
(serializable-struct rendered-post (title-str title date tags body) #:transparent
1515
#:guard (struct-guard/c string?

blog/build/render/util.rkt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
;; -----------------------------------------------------------------------------
2121

2222
(define (to-slug s)
23-
(regexp-replace* #px"(?:[^a-z0-9])+" (string-downcase s) "-"))
23+
(define rx #px"[^a-z0-9]+")
24+
(regexp-replace* rx (string-trim (string-downcase s) rx) "-"))
2425

2526
;; -----------------------------------------------------------------------------
2627
;; xexprs

0 commit comments

Comments
 (0)