From a40bfc52040b657f8f412d400fd743e9feb14caa Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 19 May 2021 08:09:29 -0600 Subject: [PATCH] racket-index: fix document links for layered installations When a layer renders new documentation that refers to a previous layer, the redirection script was not generated as needed to reach the previous layer. The documentation currently implements less sharing that would be possible across layers. For each installation layer, `raco setup` duplicates the documentation database in "docindex.sqlite", and it duplicates the search index, and it duplicates the local-redirection index. That duplication avoids having to join across an an arbitrary number of SQLite databases or chain the search and local-redirection indexes. --- pkgs/racket-doc/scribblings/raco/setup.scrbl | 4 ++++ pkgs/racket-index/scribblings/main/info.rkt | 7 +++---- .../scribblings/main/private/local-redirect.rkt | 9 +++++++-- pkgs/racket-index/setup/private/doc-path.rkt | 13 +++++++------ pkgs/racket-index/setup/scribble.rkt | 3 ++- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/pkgs/racket-doc/scribblings/raco/setup.scrbl b/pkgs/racket-doc/scribblings/raco/setup.scrbl index a99cbe2040..f19e04df4f 100644 --- a/pkgs/racket-doc/scribblings/raco/setup.scrbl +++ b/pkgs/racket-doc/scribblings/raco/setup.scrbl @@ -545,6 +545,10 @@ Optional @filepath{info.rkt} fields trigger additional actions by @item{@racket['no-search] : Build the document without a search box.} + @item{@racket['every-main-layer] : With @racket['main-doc], + indicates that the document should be rendered separately + at every installation layer (see @secref["layered-install"]).} + ] The @racket[_category] list specifies how to show the document in diff --git a/pkgs/racket-index/scribblings/main/info.rkt b/pkgs/racket-index/scribblings/main/info.rkt index e1fd50aec2..75c507848a 100644 --- a/pkgs/racket-index/scribblings/main/info.rkt +++ b/pkgs/racket-index/scribblings/main/info.rkt @@ -1,10 +1,9 @@ #lang info (define scribblings - '(("start.scrbl" - (main-doc-root depends-all-main no-depend-on) (omit)) - ("search.scrbl" (depends-all-main no-depend-on) (omit) "search" 1 10) - ("local-redirect.scrbl" (depends-all-main no-depend-on) (omit) "local-redirect" 1 10) + '(("start.scrbl" (main-doc-root depends-all-main no-depend-on) (omit)) + ("search.scrbl" (depends-all-main no-depend-on every-main-layer) (omit) "search" 1 10) + ("local-redirect.scrbl" (depends-all-main no-depend-on every-main-layer) (omit) "local-redirect" 1 10) ("license.scrbl" () (omit)) ("acks.scrbl" () (omit)) ("release.scrbl" (depends-all-main no-depend-on) (omit)))) diff --git a/pkgs/racket-index/scribblings/main/private/local-redirect.rkt b/pkgs/racket-index/scribblings/main/private/local-redirect.rkt index dd7d3f6af5..7a879eff4d 100644 --- a/pkgs/racket-index/scribblings/main/private/local-redirect.rkt +++ b/pkgs/racket-index/scribblings/main/private/local-redirect.rkt @@ -284,7 +284,8 @@ [i (in-naturals)]) (define name (extract-name e)) (fprintf o (if (zero? i) "\n" ",\n")) - (fprintf o " [~s, ~s]" name (if user? + (fprintf o " [~s, ~s]" name (if (or user? + (not (immediately-in-doc-dir? e))) (url->string (path->url e)) (format "../~a" name)))) (fprintf o "];\n\n") @@ -305,4 +306,8 @@ (js-addition (string->url "local-user-redirect.js")) (js-addition (string->bytes/utf-8 search-code)))) - null))) + null))) + +(define (immediately-in-doc-dir? path) + (define-values (base name dir?) (split-path path)) + (equal? (path->directory-path (find-doc-dir)) base)) diff --git a/pkgs/racket-index/setup/private/doc-path.rkt b/pkgs/racket-index/setup/private/doc-path.rkt index 875c3de50f..c62c89cab3 100644 --- a/pkgs/racket-index/setup/private/doc-path.rkt +++ b/pkgs/racket-index/setup/private/doc-path.rkt @@ -23,12 +23,13 @@ (memq 'main-doc flags) (pair? (path->main-collects-relative dir))) (and main? - ;; check for existing directory in search path before - ;; assuming the main doc directory - (or (for/or ([dir (get-doc-search-dirs)]) - (define p (build-path dir name)) - (and (directory-exists? p) - p)) + ;; check for existing directory in search path (unless + ;; 'every-main-layer) before assuming the main doc directory + (or (and (not (memq 'every-main-layer flags)) + (for/or ([dir (get-doc-extra-search-dirs)]) + (define p (build-path dir name)) + (and (directory-exists? p) + p))) (build-path (find-doc-dir) name)))] [else (and (not (eq? 'never user-doc-mode)) diff --git a/pkgs/racket-index/setup/scribble.rkt b/pkgs/racket-index/setup/scribble.rkt index 21ab76f247..92a9bd7631 100644 --- a/pkgs/racket-index/setup/scribble.rkt +++ b/pkgs/racket-index/setup/scribble.rkt @@ -158,7 +158,8 @@ (define (scribblings-flag? sym) (memq sym '(main-doc main-doc-root user-doc-root user-doc multi-page depends-all depends-all-main depends-all-user - no-depend-on always-run keep-style no-search))) + no-depend-on always-run keep-style no-search + every-main-layer))) (define (validate-scribblings-infos infos) (define (validate path [flags '()] [cat '(library)] [name #f] [out-count 1] [order-hint 0]) (and (string? path) (relative-path? path)