gnupdate: Add --select', to select packages
stdenv' depends on (or not).
* maintainers/scripts/gnu/gnupdate.scm (attribute-value, derivation-source, derivation-output-path, source-output-path, derivation-source-output-path, find-attribute-by-name, find-package-by-attribute-name, stdenv-package, package-requisites): New procedures. (%options): Add `--select'. (main): Compute the source output paths of `stdenv'. Filter out packages that are/aren't in `stdenv', depending on the `--select' option. svn path=/nixpkgs/trunk/; revision=22453
This commit is contained in:
parent
65b175a2f1
commit
073c01503a
@ -26,6 +26,7 @@
|
|||||||
(srfi srfi-1)
|
(srfi srfi-1)
|
||||||
(srfi srfi-9)
|
(srfi srfi-9)
|
||||||
(srfi srfi-11)
|
(srfi srfi-11)
|
||||||
|
(srfi srfi-26)
|
||||||
(srfi srfi-37)
|
(srfi srfi-37)
|
||||||
(system foreign)
|
(system foreign)
|
||||||
(rnrs bytevectors))
|
(rnrs bytevectors))
|
||||||
@ -241,6 +242,33 @@
|
|||||||
(define (src->values snix)
|
(define (src->values snix)
|
||||||
(call-with-src snix values))
|
(call-with-src snix values))
|
||||||
|
|
||||||
|
(define (attribute-value attribute)
|
||||||
|
;; Return the value of ATTRIBUTE.
|
||||||
|
(match attribute
|
||||||
|
(('attribute _ _ value) value)))
|
||||||
|
|
||||||
|
(define (derivation-source derivation)
|
||||||
|
;; Return the "src" attribute of DERIVATION or #f if not found.
|
||||||
|
(match derivation
|
||||||
|
(('derivation _ _ (attributes ...))
|
||||||
|
(find-attribute-by-name "src" attributes))))
|
||||||
|
|
||||||
|
(define (derivation-output-path derivation)
|
||||||
|
;; Return the output path of DERIVATION.
|
||||||
|
(match derivation
|
||||||
|
(('derivation _ out-path _)
|
||||||
|
out-path)
|
||||||
|
(_ #f)))
|
||||||
|
|
||||||
|
(define (source-output-path src)
|
||||||
|
;; Return the output path of SRC, the "src" attribute of a derivation.
|
||||||
|
(derivation-output-path (attribute-value src)))
|
||||||
|
|
||||||
|
(define (derivation-source-output-path derivation)
|
||||||
|
;; Return the output path of the "src" attribute of DERIVATION or #f if
|
||||||
|
;; DERIVATION lacks an "src" attribute.
|
||||||
|
(and=> (derivation-source derivation) source-output-path))
|
||||||
|
|
||||||
(define (open-nixpkgs nixpkgs)
|
(define (open-nixpkgs nixpkgs)
|
||||||
(let ((script (string-append nixpkgs
|
(let ((script (string-append nixpkgs
|
||||||
"/maintainers/scripts/eval-release.nix")))
|
"/maintainers/scripts/eval-release.nix")))
|
||||||
@ -275,6 +303,55 @@
|
|||||||
(format #t "running `~A'...~%" cmd)
|
(format #t "running `~A'...~%" cmd)
|
||||||
(system cmd)))
|
(system cmd)))
|
||||||
|
|
||||||
|
(define (find-attribute-by-name name attributes)
|
||||||
|
;; Return attribute NAME in ATTRIBUTES, a list of SNix attributes, or #f if
|
||||||
|
;; NAME cannot be found.
|
||||||
|
(find (lambda (a)
|
||||||
|
(match a
|
||||||
|
(('attribute _ (? (cut string=? <> name)) _)
|
||||||
|
a)
|
||||||
|
(_ #f)))
|
||||||
|
attributes))
|
||||||
|
|
||||||
|
(define (find-package-by-attribute-name name packages)
|
||||||
|
;; Return the package bound to attribute NAME in PACKAGES, a list of
|
||||||
|
;; packages (SNix attributes), or #f if NAME cannot be found.
|
||||||
|
(find (lambda (package)
|
||||||
|
(match package
|
||||||
|
(('attribute _ (? (cut string=? <> name))
|
||||||
|
('derivation _ _ _))
|
||||||
|
package)
|
||||||
|
(_ #f)))
|
||||||
|
packages))
|
||||||
|
|
||||||
|
(define (stdenv-package packages)
|
||||||
|
;; Return the `stdenv' package from PACKAGES, a list of SNix attributes.
|
||||||
|
(find-package-by-attribute-name "stdenv" packages))
|
||||||
|
|
||||||
|
(define (package-requisites package)
|
||||||
|
;; Return the list of derivations required to build PACKAGE (including that
|
||||||
|
;; of PACKAGE) by recurring into its derivation attributes.
|
||||||
|
(let loop ((snix package)
|
||||||
|
(result '()))
|
||||||
|
(match snix
|
||||||
|
(('attribute _ _ body)
|
||||||
|
(loop body result))
|
||||||
|
(('derivation _ out-path body)
|
||||||
|
(if (any (lambda (d)
|
||||||
|
(match d
|
||||||
|
(('derivation _ (? (cut string=? out-path <>)) _) #t)
|
||||||
|
(_ #f)))
|
||||||
|
result)
|
||||||
|
result
|
||||||
|
(loop body (cons snix result))))
|
||||||
|
((things ...)
|
||||||
|
(fold loop result things))
|
||||||
|
(_ result))))
|
||||||
|
|
||||||
|
(define (package-source-output-path package)
|
||||||
|
;; Return the output path of the "src" derivation of PACKAGE.
|
||||||
|
(derivation-source-output-path (attribute-value package)))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; FTP client.
|
;;; FTP client.
|
||||||
@ -661,10 +738,26 @@
|
|||||||
(format #t "~%")
|
(format #t "~%")
|
||||||
(format #t " -x, --xml=FILE Read XML output of `nix-instantiate'~%")
|
(format #t " -x, --xml=FILE Read XML output of `nix-instantiate'~%")
|
||||||
(format #t " from FILE.~%")
|
(format #t " from FILE.~%")
|
||||||
|
(format #t " -s, --select=SET Update only packages from SET, which may~%")
|
||||||
|
(format #t " be either `all',`stdenv', or `non-stdenv'.~%")
|
||||||
(format #t " -d, --dry-run Don't actually update Nix expressions~%")
|
(format #t " -d, --dry-run Don't actually update Nix expressions~%")
|
||||||
(format #t " -h, --help Give this help list.~%~%")
|
(format #t " -h, --help Give this help list.~%~%")
|
||||||
(format #t "Report bugs to <ludo@gnu.org>~%")
|
(format #t "Report bugs to <ludo@gnu.org>~%")
|
||||||
(exit 0)))
|
(exit 0)))
|
||||||
|
(option '(#\s "select") #t #f
|
||||||
|
(lambda (opt name arg result)
|
||||||
|
(cond ((string-ci=? arg "stdenv")
|
||||||
|
(alist-cons 'filter 'stdenv result))
|
||||||
|
((string-ci=? arg "non-stdenv")
|
||||||
|
(alist-cons 'filter 'non-stdenv result))
|
||||||
|
((string-ci=? arg "all")
|
||||||
|
(alist-cons 'filter #f result))
|
||||||
|
(else
|
||||||
|
(format (current-error-port)
|
||||||
|
"~A: unrecognized selection type~%"
|
||||||
|
arg)
|
||||||
|
(exit 1)))))
|
||||||
|
|
||||||
(option '(#\d "dry-run") #f #f
|
(option '(#\d "dry-run") #f #f
|
||||||
(lambda (opt name arg result)
|
(lambda (opt name arg result)
|
||||||
(alist-cons 'dry-run #t result)))
|
(alist-cons 'dry-run #t result)))
|
||||||
@ -692,9 +785,29 @@
|
|||||||
(packages (match snix
|
(packages (match snix
|
||||||
(('snix _ ('attribute-set attributes))
|
(('snix _ ('attribute-set attributes))
|
||||||
attributes)
|
attributes)
|
||||||
(else #f)))
|
(_ #f)))
|
||||||
|
(stdenv (delay
|
||||||
|
;; The source tarballs that make up stdenv.
|
||||||
|
(filter-map derivation-source-output-path
|
||||||
|
(package-requisites (stdenv-package packages)))))
|
||||||
(gnu (gnu-packages packages))
|
(gnu (gnu-packages packages))
|
||||||
(updates (packages-to-update gnu)))
|
(gnu* (case (assoc-ref opts 'filter)
|
||||||
|
;; Filter out packages that are/aren't in `stdenv'. To
|
||||||
|
;; do that reliably, we check whether their "src"
|
||||||
|
;; derivation is a requisite of stdenv.
|
||||||
|
((stdenv)
|
||||||
|
(filter (lambda (p)
|
||||||
|
(member (package-source-output-path p)
|
||||||
|
(force stdenv)))
|
||||||
|
gnu))
|
||||||
|
((non-stdenv)
|
||||||
|
(filter (lambda (p)
|
||||||
|
(not (member (package-source-output-path p)
|
||||||
|
(force stdenv))))
|
||||||
|
gnu))
|
||||||
|
(else gnu)))
|
||||||
|
(updates (packages-to-update gnu*)))
|
||||||
|
|
||||||
(format #t "~%~A packages to update...~%" (length updates))
|
(format #t "~%~A packages to update...~%" (length updates))
|
||||||
(for-each (lambda (update)
|
(for-each (lambda (update)
|
||||||
(match update
|
(match update
|
||||||
|
Loading…
x
Reference in New Issue
Block a user