raco pkg {install,update,migrate}: add --all-platforms

The `--all-platforms` flag causes the package manager to follow all
package dependencies, even for dependencies that are specific to
platforms other than the current one.
This commit is contained in:
Matthew Flatt 2013-09-04 06:07:12 -06:00
parent 16c0b385de
commit c38d1fabf9
3 changed files with 53 additions and 20 deletions

View File

@ -404,6 +404,9 @@ sub-commands.
whose name corresponds to an already-installed package, except for promoting auto-installed
packages to explicitly installed.}
@item{@DFlag{all-platforms} --- Considers package dependencies independent of the current platform
(instead of filtering dependencies to platforms other than the current one).}
@item{@DFlag{force} --- Ignores module conflicts, including conflicts due to installing a single
package in multiple scopes. Forcing an installation may leave package content in an
inconsistent state.}
@ -456,6 +459,7 @@ the given @nonterm{pkg-source}s.
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Selects @nonterm{dir} as the @tech{package scope}, the same as for @command-ref{install}.}
@item{@DFlag{catalog} @nonterm{catalog} --- Same as for @command-ref{install}.}
@item{@DFlag{all-platforms} --- Same as for @command-ref{install}.}
@item{@DFlag{force} --- Same as for @command-ref{install}.}
@item{@DFlag{ignore-checksums} --- Same as for @command-ref{install}.}
@item{@DFlag{no-setup} --- Same as for @command-ref{install}.}
@ -532,11 +536,12 @@ the given @nonterm{pkg}s.
the default.}
@item{@DFlag{binary} --- Same as for @command-ref{install}.}
@item{@DFlag{source} --- Same as for @command-ref{install}.}
@item{@DFlag{scope} @nonterm{scope} --- Same as for @command-ref{install}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Select @nonterm{dir} as the @tech{package scope}.}
@item{@DFlag{catalog} @nonterm{catalog} --- Same as for @command-ref{install}.}
@item{@DFlag{scope} @nonterm{scope} --- Same as for @command-ref{install}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Select @nonterm{dir} as the @tech{package scope}.}
@item{@DFlag{catalog} @nonterm{catalog} --- Same as for @command-ref{install}.}
@item{@DFlag{all-platforms} --- Same as for @command-ref{install}.}
@item{@DFlag{force} --- Same as for @command-ref{install}.}
@item{@DFlag{ignore-checksums} --- Same as for @command-ref{install}.}
@item{@DFlag{no-setup} --- Same as for @command-ref{install}.}

View File

@ -731,7 +731,7 @@
init-drop)])
(define deps
(list->set
(append-map (package-dependencies metadata-ns db)
(append-map (package-dependencies metadata-ns db #t)
(set->list keep))))
(define still-drop (set-subtract drop deps))
(define delta (set-subtract drop still-drop))
@ -759,7 +759,7 @@
(set-intersect
pkgs-set
(list->set
(append-map (package-dependencies metadata-ns db)
(append-map (package-dependencies metadata-ns db #t)
(set->list
remaining-pkg-db-set)))))
(unless (set-empty? deps-to-be-removed)
@ -770,7 +770,7 @@
(λ (p)
(define ds
(filter (λ (dp)
(member p ((package-dependencies metadata-ns db) dp)))
(member p ((package-dependencies metadata-ns db #t) dp)))
(set->list
remaining-pkg-db-set)))
(~a p " (required by: " ds ")"))
@ -1205,6 +1205,7 @@
#:ignore-checksums? ignore-checksums?
#:skip-installed? skip-installed?
#:force? force?
#:all-platforms? all-platforms?
#:quiet? quiet?
#:conversation conversation
#:strip strip-mode
@ -1352,7 +1353,8 @@
(filter-not (λ (dep)
(define name (dependency->name dep))
(or (equal? name "racket")
(not (dependency-this-platform? dep))
(not (or all-platforms?
(dependency-this-platform? dep)))
(hash-ref simultaneous-installs name #f)
(hash-has-key? all-db name)))
deps)))
@ -1391,13 +1393,15 @@
(define update-pkgs
(append-map (λ (dep)
(define name (dependency->name dep))
(define this-platform? (dependency-this-platform? dep))
(define this-platform? (or all-platforms?
(dependency-this-platform? dep)))
(or (and this-platform?
(not (hash-ref simultaneous-installs name #f))
((packages-to-update download-printf current-scope-db
#:must-update? #f #:deps? #t
#:update-cache update-cache
#:namespace metadata-ns
#:all-platforms? all-platforms?
#:ignore-checksums? ignore-checksums?)
name))
null))
@ -1434,7 +1438,8 @@
(filter-map (λ (dep)
(define name (dependency->name dep))
(define req-vers (dependency->version dep))
(define this-platform? (dependency-this-platform? dep))
(define this-platform? (or all-platforms?
(dependency-this-platform? dep)))
(define-values (inst-vers* can-try-update?)
(cond
[(not this-platform?)
@ -1493,6 +1498,7 @@
#:deps? update-deps?
#:update-cache update-cache
#:namespace metadata-ns
#:all-platforms? all-platforms?
#:ignore-checksums? ignore-checksums?)
update-pkgs)])
(λ () (for-each (compose (remove-package quiet?) pkg-desc-name) to-update))))
@ -1596,7 +1602,8 @@
(let ([db (read-pkg-db)])
(get-setup-collects ((if updating?
(make-close-over-depending (read-pkg-db)
post-metadata-ns)
post-metadata-ns
all-platforms?)
values)
(map install-info-name
(if updating?
@ -1660,12 +1667,13 @@
(pkg-error "bad 'setup-collects value\n value: ~e"
v))))))))
(define ((make-close-over-depending db metadata-ns) l)
(define ((make-close-over-depending db metadata-ns all-platforms?) l)
(define setup-pkgs (list->set l))
(define empty-set (set))
(define rev-pkg-deps
(for/fold ([rev (hash)]) ([pkg-name (in-hash-keys db)])
(for/fold ([rev rev]) ([dep (in-list ((package-dependencies metadata-ns db) pkg-name))])
(for/fold ([rev rev]) ([dep (in-list ((package-dependencies metadata-ns db all-platforms?)
pkg-name))])
(hash-update rev dep (lambda (v) (set-add v pkg-name)) empty-set))))
(let loop ([check setup-pkgs] [setup-pkgs setup-pkgs])
;; Find all packages that depend on a package in `check':
@ -1686,6 +1694,7 @@
(define (pkg-install descs
#:old-infos [old-infos empty]
#:old-auto+pkgs [old-descs empty]
#:all-platforms? [all-platforms? #f]
#:force? [force #f]
#:ignore-checksums? [ignore-checksums? #f]
#:skip-installed? [skip-installed? #f]
@ -1718,6 +1727,7 @@
(pkg-install
#:old-infos new-infos
#:old-auto+pkgs (append old-descs new-descs)
#:all-platforms? all-platforms?
#:force? force
#:ignore-checksums? ignore-checksums?
#:dep-behavior dep-behavior
@ -1734,6 +1744,7 @@
(install-packages
#:old-infos old-infos
#:old-descs old-descs
#:all-platforms? all-platforms?
#:force? force
#:ignore-checksums? ignore-checksums?
#:skip-installed? skip-installed?
@ -1765,6 +1776,7 @@
#:deps? [deps? #f]
#:namespace metadata-ns
#:update-cache update-cache
#:all-platforms? all-platforms?
#:ignore-checksums? ignore-checksums?)
pkg-name)
(cond
@ -1812,6 +1824,7 @@
#:deps? #t
#:update-cache update-cache
#:namespace metadata-ns
#:all-platforms? all-platforms?
#:ignore-checksums? ignore-checksums?)
pkg-name)
null))]
@ -1874,8 +1887,9 @@
#:deps? #t
#:update-cache update-cache
#:namespace metadata-ns
#:all-platforms? all-platforms?
#:ignore-checksums? ignore-checksums?)
((package-dependencies metadata-ns db) pkg-name))
((package-dependencies metadata-ns db all-platforms?) pkg-name))
null))]))]
[else null]))
@ -1886,14 +1900,17 @@
(for ([k (in-list l)]) (hash-remove! update-cache k)))
(define ((package-dependencies metadata-ns db) pkg-name)
(define ((package-dependencies metadata-ns db all-platforms?) pkg-name)
(map dependency->name
(filter dependency-this-platform?
(get-all-deps metadata-ns (pkg-directory* pkg-name #:db db)))))
(let ([l (get-all-deps metadata-ns (pkg-directory* pkg-name #:db db))])
(if all-platforms?
l
(filter dependency-this-platform? l)))))
(define (pkg-update in-pkgs
#:all? [all? #f]
#:dep-behavior [dep-behavior #f]
#:all-platforms? [all-platforms? #f]
#:force? [force? #f]
#:ignore-checksums? [ignore-checksums? #f]
#:update-deps? [update-deps? #f]
@ -1914,6 +1931,7 @@
all-mode?) ; avoid races
#:update-cache update-cache
#:namespace metadata-ns
#:all-platforms? all-platforms?
#:ignore-checksums? ignore-checksums?)
pkgs))
(cond
@ -1935,6 +1953,7 @@
#:update-cache update-cache
#:quiet? quiet?
#:strip strip-mode
#:all-platforms? all-platforms?
#:force? force?
#:ignore-checksums? ignore-checksums?
#:link-dirs? link-dirs?
@ -1995,6 +2014,7 @@
string-ci<=?))
(define (pkg-migrate from-version
#:all-platforms? [all-platforms? #f]
#:force? [force? #f]
#:quiet? [quiet? #f]
#:ignore-checksums? [ignore-checksums? #f]
@ -2035,6 +2055,7 @@
'skip
(begin0
(pkg-install to-install
#:all-platforms? all-platforms?
#:force? force?
#:ignore-checksums? ignore-checksums?
#:skip-installed? #t
@ -2726,6 +2747,7 @@
#:all? boolean?
#:update-deps? boolean?
#:quiet? boolean?
#:all-platforms? boolean?
#:force? boolean?
#:ignore-checksums? boolean?
#:strip (or/c #f 'source 'binary)
@ -2747,6 +2769,7 @@
(->* ((listof pkg-desc?))
(#:dep-behavior dep-behavior/c
#:update-deps? boolean?
#:all-platforms? boolean?
#:force? boolean?
#:ignore-checksums? boolean?
#:skip-installed? boolean?
@ -2757,6 +2780,7 @@
[pkg-migrate
(->* (string?)
(#:dep-behavior dep-behavior/c
#:all-platforms? boolean?
#:force? boolean?
#:ignore-checksums? boolean?
#:quiet? boolean?

View File

@ -158,6 +158,7 @@
(parameterize ([current-pkg-catalogs (and catalog
(list (catalog->url catalog)))])
(pkg-install #:dep-behavior (if auto 'search-auto deps)
#:all-platforms? all-platforms
#:force? force
#:ignore-checksums? ignore-checksums
#:skip-installed? skip-installed
@ -212,6 +213,7 @@
(pkg-desc pkg-source a-type name checksum #f))]))
#:all? all
#:dep-behavior (if auto 'search-auto deps)
#:all-platforms? all-platforms
#:force? force
#:ignore-checksums? ignore-checksums
#:update-deps? (or update-deps auto)
@ -310,6 +312,7 @@
(pkg-migrate from-version
#:dep-behavior deps
#:force? force
#:all-platforms? all-platforms
#:ignore-checksums? ignore-checksums
#:strip (or (and source 'source) (and binary 'binary))))))
(setup no-setup setup-collects jobs)))]
@ -389,7 +392,7 @@
#:once-each
[#:bool from-config () "Include currently configured catalogs last"]
#:once-any
[#:bool force () "Force replacement fo existing file/directory"]
[#:bool force () "Force replacement of existing file/directory"]
[#:bool merge () "Merge to existing database"]
#:once-each
[#:bool override () "While merging, override existing with new"]
@ -443,7 +446,8 @@
("where the default is `search-ask' if <pkg-source> is a package name"
"or `fail' otherwise")
#:install-force-flags
([#:bool force () "Ignores conflicts"]
([#:bool all-platforms () "Follow package dependencies for all platforms"]
[#:bool force () "Ignores conflicts"]
[#:bool ignore-checksums () "Ignores checksums"])
#:update-deps-flags
([#:bool update-deps () "For `search-ask' or `search-auto', also update dependencies"])