import: opam: Add recursive option.

* guix/script/import/opam.scm: Add recursive option.
* guix/import/opam.scm (opam->guix-package): return two values.
(opam-recursive-import): New variable.
master
Julien Lepiller 2018-12-19 22:43:43 +01:00
parent 33af92dd99
commit 6090b0beb0
No known key found for this signature in database
GPG Key ID: 43111F4520086A0C
2 changed files with 69 additions and 28 deletions

View File

@ -33,7 +33,8 @@
#:use-module (guix utils)
#:use-module (guix import utils)
#:use-module ((guix licenses) #:prefix license:)
#:export (opam->guix-package))
#:export (opam->guix-package
opam-recursive-import))
;; Define a PEG parser for the opam format
(define-peg-pattern SP none (or " " "\n"))
@ -128,7 +129,6 @@ path to the repository."
(else (string-append "ocaml-" name))))
(define (metadata-ref file lookup)
(pk 'file file 'lookup lookup)
(fold (lambda (record acc)
(match record
((record key val)
@ -166,6 +166,21 @@ path to the repository."
(('conditional-value val condition)
(if (native? condition) (dependency->input val) ""))))
(define (dependency->name dependency)
(match dependency
(('string-pat str) str)
(('conditional-value val condition)
(dependency->name val))))
(define (dependency-list->names lst)
(filter
(lambda (name)
(not (or
(string-prefix? "conf-" name)
(equal? name "ocaml")
(equal? name "findlib"))))
(map dependency->name lst)))
(define (ocaml-names->guix-names names)
(map ocaml-name->guix-name
(remove (lambda (name)
@ -193,32 +208,41 @@ path to the repository."
(define (opam->guix-package name)
(and-let* ((repository (get-opam-repository))
(version (find-latest-version name repository))
(file (string-append repository "/packages/" name "/" name "." (pk 'version version) "/opam"))
(file (string-append repository "/packages/" name "/" name "." version "/opam"))
(opam-content (get-metadata file))
(url-dict (metadata-ref (pk 'metadata opam-content) "url"))
(url-dict (metadata-ref opam-content "url"))
(source-url (metadata-ref url-dict "src"))
(requirements (metadata-ref opam-content "depends"))
(dependencies (dependency-list->names requirements))
(inputs (dependency-list->inputs (depends->inputs requirements)))
(native-inputs (dependency-list->inputs (depends->native-inputs requirements))))
(call-with-temporary-output-file
(lambda (temp port)
(and (url-fetch source-url temp)
`(package
(name ,(ocaml-name->guix-name name))
(version ,(metadata-ref opam-content "version"))
(source
(origin
(method url-fetch)
(uri ,source-url)
(sha256 (base32 ,(guix-hash-url temp)))))
(build-system ocaml-build-system)
,@(if (null? inputs)
'()
`((inputs ,(list 'quasiquote inputs))))
,@(if (null? native-inputs)
'()
`((native-inputs ,(list 'quasiquote native-inputs))))
(home-page ,(metadata-ref opam-content "homepage"))
(synopsis ,(metadata-ref opam-content "synopsis"))
(description ,(metadata-ref opam-content "description"))
(license #f)))))))
(values
`(package
(name ,(ocaml-name->guix-name name))
(version ,(metadata-ref opam-content "version"))
(source
(origin
(method url-fetch)
(uri ,source-url)
(sha256 (base32 ,(guix-hash-url temp)))))
(build-system ocaml-build-system)
,@(if (null? inputs)
'()
`((inputs ,(list 'quasiquote inputs))))
,@(if (null? native-inputs)
'()
`((native-inputs ,(list 'quasiquote native-inputs))))
(home-page ,(metadata-ref opam-content "homepage"))
(synopsis ,(metadata-ref opam-content "synopsis"))
(description ,(metadata-ref opam-content "description"))
(license #f))
dependencies))))))
(define (opam-recursive-import package-name)
(recursive-import package-name #f
#:repo->guix-package (lambda (name repo)
(opam->guix-package name))
#:guix-name ocaml-name->guix-name))

View File

@ -25,6 +25,7 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-37)
#:use-module (srfi srfi-41)
#:use-module (ice-9 match)
#:use-module (ice-9 format)
#:export (guix-import-opam))
@ -43,6 +44,8 @@ Import and convert the opam package for PACKAGE-NAME.\n"))
(display (G_ "
-h, --help display this help and exit"))
(display (G_ "
-r, --recursive import packages recursively"))
(display (G_ "
-V, --version display version information and exit"))
(newline)
(show-bug-report-information))
@ -56,6 +59,9 @@ Import and convert the opam package for PACKAGE-NAME.\n"))
(option '(#\V "version") #f #f
(lambda args
(show-version-and-exit "guix import opam")))
(option '(#\r "recursive") #f #f
(lambda (opt name arg result)
(alist-cons 'recursive #t result)))
%standard-import-options))
@ -81,11 +87,22 @@ Import and convert the opam package for PACKAGE-NAME.\n"))
(reverse opts))))
(match args
((package-name)
(let ((sexp (opam->guix-package package-name)))
(unless sexp
(leave (G_ "failed to download meta-data for package '~a'~%")
package-name))
sexp))
(if (assoc-ref opts 'recursive)
;; Recursive import
(map (match-lambda
((and ('package ('name name) . rest) pkg)
`(define-public ,(string->symbol name)
,pkg))
(_ #f))
(reverse
(stream->list
(opam-recursive-import package-name))))
;; Single import
(let ((sexp (opam->guix-package package-name)))
(unless sexp
(leave (G_ "failed to download meta-data for package '~a'~%")
package-name))
sexp)))
(()
(leave (G_ "too few arguments~%")))
((many ...)