raco pkg install: limit `raco setup' to installed collections

A package can specify `setup-collects' in its "info.rkt" to override
this default.
This commit is contained in:
Matthew Flatt 2012-11-30 13:59:07 -07:00
parent 381d9d84d6
commit 567a84cd31
3 changed files with 68 additions and 28 deletions

View File

@ -95,20 +95,20 @@
(for-each make-directory* (for-each make-directory*
(list (pkg-dir) (pkg-installed-dir))) (list (pkg-dir) (pkg-installed-dir)))
(define (make-metadata-namespace) (define (make-metadata-namespace)
(make-base-empty-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]) #:checker [checker void])
(define get-info (get-info/full pkg-dir #:namespace metadata-ns)) (define get-info (get-info/full pkg-dir #:namespace metadata-ns))
(define v (define v
(if get-info (if get-info
(get-info key (lambda () default)) (get-info key get-default)
;; during a transition period, also check for "METADATA.rktd": ;; during a transition period, also check for "METADATA.rktd":
(and (eq? key 'deps) (if (eq? key 'deps)
(dict-ref (file->value* (build-path pkg-dir "METADATA.rktd") empty) (dict-ref (file->value* (build-path pkg-dir "METADATA.rktd") empty)
'dependency default)))) 'dependency (get-default))
(get-default))))
(checker v) (checker v)
v) v)
@ -146,6 +146,10 @@
(define-syntax-rule (with-package-lock e ...) (define-syntax-rule (with-package-lock e ...)
(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 (read-pkg-cfg/def k)
(define c (read-pkg-cfg)) (define c (read-pkg-cfg))
(hash-ref c k (hash-ref c k
@ -603,7 +607,7 @@
(not (eq? dep-behavior 'force)) (not (eq? dep-behavior 'force))
(let () (let ()
(define deps (get-metadata metadata-ns pkg-dir (define deps (get-metadata metadata-ns pkg-dir
'deps empty 'deps (lambda () empty)
#:checker check-dependencies)) #:checker check-dependencies))
(define unsatisfied-deps (define unsatisfied-deps
(filter-not (λ (dep) (filter-not (λ (dep)
@ -674,12 +678,31 @@
(define infos (define infos
(for/list ([v (in-list descs)]) (for/list ([v (in-list descs)])
(install-package (pkg-desc-source v) (pkg-desc-type v) (pkg-desc-name v)))) (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 (define do-its
(map (curry install-package/outer (append old-infos infos)) (map (curry install-package/outer (append old-infos infos))
(append old-descs descs) (append old-descs descs)
(append old-infos infos))) (append old-infos infos)))
(pre-succeed) (pre-succeed)
(for-each (λ (t) (t)) do-its)) (for-each (λ (t) (t)) do-its)
setup-collects)
(define (install-cmd descs (define (install-cmd descs
#:old-infos [old-infos empty] #:old-infos [old-infos empty]
@ -743,7 +766,7 @@
(define ((package-dependencies metadata-ns) pkg-name) (define ((package-dependencies metadata-ns) pkg-name)
(get-metadata metadata-ns (package-directory pkg-name) (get-metadata metadata-ns (package-directory pkg-name)
'deps empty 'deps (lambda () empty)
#:checker check-dependencies)) #:checker check-dependencies))
(define (update-packages in-pkgs (define (update-packages in-pkgs
@ -771,8 +794,7 @@
#:updating? #t #:updating? #t
#:pre-succeed (λ () (for-each (compose remove-package pkg-desc-name) to-update)) #:pre-succeed (λ () (for-each (compose remove-package pkg-desc-name) to-update))
#:dep-behavior dep-behavior #:dep-behavior dep-behavior
to-update) to-update)]))
#t]))
(define (show-cmd) (define (show-cmd)
(let () (let ()

View File

@ -4,10 +4,17 @@
"commands.rkt" "commands.rkt"
(prefix-in setup: setup/setup)) (prefix-in setup: setup/setup))
(define (setup no-setup) (define (setup no-setup? installation? setup-collects)
(unless (or no-setup (unless (or no-setup?
(equal? "1" (getenv "PLT_PLANET2_NOSETUP"))) (getenv "PLT_PLANET2_NOSETUP"))
(setup:setup))) (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 (commands
"This tool is used for managing installed packages." "This tool is used for managing installed packages."
@ -39,12 +46,13 @@
#:args pkg-source #:args pkg-source
(parameterize ([current-install-system-wide? installation]) (parameterize ([current-install-system-wide? installation])
(with-package-lock (with-package-lock
(install-cmd #:dep-behavior deps (define setup-collects
#:force? force (install-cmd #:dep-behavior deps
#:ignore-checksums? ignore-checksums #:force? force
(for/list ([p (in-list pkg-source)]) #:ignore-checksums? ignore-checksums
(pkg-desc p (or (and link 'link) type) name #f))) (for/list ([p (in-list pkg-source)])
(setup no-setup)))] (pkg-desc p (or (and link 'link) type) name #f))))
(setup no-setup installation setup-collects)))]
[update [update
"Update packages" "Update packages"
[#:bool no-setup () ("Don't run 'raco setup' after changing packages" [#:bool no-setup () ("Don't run 'raco setup' after changing packages"
@ -66,11 +74,13 @@
#:args pkgs #:args pkgs
(parameterize ([current-install-system-wide? installation]) (parameterize ([current-install-system-wide? installation])
(with-package-lock (with-package-lock
(when (update-packages pkgs (define setup-collects
#:all? all (update-packages pkgs
#:dep-behavior deps #:all? all
#:deps? update-deps) #:dep-behavior deps
(setup no-setup))))] #:deps? update-deps))
(when setup-collects
(setup no-setup installation setup-collects))))]
[remove [remove
"Remove packages" "Remove packages"
[#:bool no-setup () ("Don't run 'raco setup' after changing packages" [#:bool no-setup () ("Don't run 'raco setup' after changing packages"
@ -84,7 +94,7 @@
(remove-packages pkgs (remove-packages pkgs
#:auto? auto #:auto? auto
#:force? force) #:force? force)
(setup no-setup)))] (setup no-setup installation #f)))]
[show [show
"Show information about installed packages" "Show information about installed packages"
[#:bool installation ("-i") "Operate on the installation-wide package database"] [#:bool installation ("-i") "Operate on the installation-wide package database"]

View File

@ -200,7 +200,7 @@ sub-sub-commands:
inferred for each @nonterm{pkg-source}.} 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 @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.} @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 on package names, not package sources), while the @tech{package source} indicates
where to get the package if needed to satisfy the dependency.} 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 For example, a basic @filepath{info.rkt} file might be