diff --git a/collects/planet2/lib.rkt b/collects/planet2/lib.rkt index d973bfb346..6c267f3a3c 100644 --- a/collects/planet2/lib.rkt +++ b/collects/planet2/lib.rkt @@ -95,20 +95,20 @@ (for-each make-directory* (list (pkg-dir) (pkg-installed-dir))) - (define (make-metadata-namespace) (make-base-empty-namespace)) -(define (get-metadata metadata-ns pkg-dir key default +(define (get-metadata metadata-ns pkg-dir key get-default #:checker [checker void]) (define get-info (get-info/full pkg-dir #:namespace metadata-ns)) (define v (if get-info - (get-info key (lambda () default)) + (get-info key get-default) ;; during a transition period, also check for "METADATA.rktd": - (and (eq? key 'deps) - (dict-ref (file->value* (build-path pkg-dir "METADATA.rktd") empty) - 'dependency default)))) + (if (eq? key 'deps) + (dict-ref (file->value* (build-path pkg-dir "METADATA.rktd") empty) + 'dependency (get-default)) + (get-default)))) (checker v) v) @@ -146,6 +146,10 @@ (define-syntax-rule (with-package-lock e ...) (with-package-lock* (λ () e ...))) +(define (maybe-append lists) + (and (for/and ([v (in-list lists)]) (not (eq? v 'all))) + (apply append lists))) + (define (read-pkg-cfg/def k) (define c (read-pkg-cfg)) (hash-ref c k @@ -603,7 +607,7 @@ (not (eq? dep-behavior 'force)) (let () (define deps (get-metadata metadata-ns pkg-dir - 'deps empty + 'deps (lambda () empty) #:checker check-dependencies)) (define unsatisfied-deps (filter-not (λ (dep) @@ -674,12 +678,31 @@ (define infos (for/list ([v (in-list descs)]) (install-package (pkg-desc-source v) (pkg-desc-type v) (pkg-desc-name v)))) + (define setup-collects + (maybe-append + (for/list ([info (in-list (append old-infos infos))]) + (define pkg-dir (install-info-directory info)) + (get-metadata metadata-ns pkg-dir + 'setup-collects (lambda () (package-collections + pkg-dir + metadata-ns)) + #:checker (lambda (v) + (unless (or (eq? v 'all) + (and (list? v) + (for ([c (in-list v)]) + (or (path-string? c) + (and (list? c) + (pair? c) + (andmap path-string? c)))))) + (error 'pkg "bad 'setup-collects value\n value: ~e" + v))))))) (define do-its (map (curry install-package/outer (append old-infos infos)) (append old-descs descs) (append old-infos infos))) (pre-succeed) - (for-each (λ (t) (t)) do-its)) + (for-each (λ (t) (t)) do-its) + setup-collects) (define (install-cmd descs #:old-infos [old-infos empty] @@ -743,7 +766,7 @@ (define ((package-dependencies metadata-ns) pkg-name) (get-metadata metadata-ns (package-directory pkg-name) - 'deps empty + 'deps (lambda () empty) #:checker check-dependencies)) (define (update-packages in-pkgs @@ -771,8 +794,7 @@ #:updating? #t #:pre-succeed (λ () (for-each (compose remove-package pkg-desc-name) to-update)) #:dep-behavior dep-behavior - to-update) - #t])) + to-update)])) (define (show-cmd) (let () diff --git a/collects/planet2/main.rkt b/collects/planet2/main.rkt index 172ded188d..4ac0664140 100644 --- a/collects/planet2/main.rkt +++ b/collects/planet2/main.rkt @@ -4,10 +4,17 @@ "commands.rkt" (prefix-in setup: setup/setup)) -(define (setup no-setup) - (unless (or no-setup - (equal? "1" (getenv "PLT_PLANET2_NOSETUP"))) - (setup:setup))) +(define (setup no-setup? installation? setup-collects) + (unless (or no-setup? + (getenv "PLT_PLANET2_NOSETUP")) + (setup:setup + #:make-user? (not installation?) + #:collections (and setup-collects + (map (lambda (s) + (if (list? s) s (list s))) + (append setup-collects + (if installation? '("scribblings/main") null) + '("scribblings/main/user"))))))) (commands "This tool is used for managing installed packages." @@ -39,12 +46,13 @@ #:args pkg-source (parameterize ([current-install-system-wide? installation]) (with-package-lock - (install-cmd #:dep-behavior deps - #:force? force - #:ignore-checksums? ignore-checksums - (for/list ([p (in-list pkg-source)]) - (pkg-desc p (or (and link 'link) type) name #f))) - (setup no-setup)))] + (define setup-collects + (install-cmd #:dep-behavior deps + #:force? force + #:ignore-checksums? ignore-checksums + (for/list ([p (in-list pkg-source)]) + (pkg-desc p (or (and link 'link) type) name #f)))) + (setup no-setup installation setup-collects)))] [update "Update packages" [#:bool no-setup () ("Don't run 'raco setup' after changing packages" @@ -66,11 +74,13 @@ #:args pkgs (parameterize ([current-install-system-wide? installation]) (with-package-lock - (when (update-packages pkgs - #:all? all - #:dep-behavior deps - #:deps? update-deps) - (setup no-setup))))] + (define setup-collects + (update-packages pkgs + #:all? all + #:dep-behavior deps + #:deps? update-deps)) + (when setup-collects + (setup no-setup installation setup-collects))))] [remove "Remove packages" [#:bool no-setup () ("Don't run 'raco setup' after changing packages" @@ -84,7 +94,7 @@ (remove-packages pkgs #:auto? auto #:force? force) - (setup no-setup)))] + (setup no-setup installation #f)))] [show "Show information about installed packages" [#:bool installation ("-i") "Operate on the installation-wide package database"] diff --git a/collects/planet2/scribblings/planet2.scrbl b/collects/planet2/scribblings/planet2.scrbl index 1b6a43439d..44ce91df14 100644 --- a/collects/planet2/scribblings/planet2.scrbl +++ b/collects/planet2/scribblings/planet2.scrbl @@ -200,7 +200,7 @@ sub-sub-commands: inferred for each @nonterm{pkg-source}.} @item{@DFlag{no-setup} --- Does not run @exec{raco setup} after installation. This behavior is also the case if the - environment variable @envvar{PLT_PLANET2_NOSETUP} is set to @exec{1}.} + environment variable @envvar{PLT_PLANET2_NOSETUP} is set (to anything).} @item{@DFlag{installation} or @Flag{i} --- Install system-wide rather than user-local.} @@ -482,6 +482,14 @@ The following fields are used by the package manager: on package names, not package sources), while the @tech{package source} indicates where to get the package if needed to satisfy the dependency.} + @item{@racketidfont{setup-collects} --- a list of path strings and/or + lists of path strings, which are used as collection names to + set up via @exec{raco setup} after the package is installed, or + @racket['all] to indicate that all collections need to be + setup. By default, only collections included in the package are + set up (plus collections for global documentation indexes and + links).} + ] For example, a basic @filepath{info.rkt} file might be