summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix/import/opam.scm21
-rw-r--r--tests/opam.scm67
2 files changed, 48 insertions, 40 deletions
diff --git a/guix/import/opam.scm b/guix/import/opam.scm
index e258c4197f..394415fdd4 100644
--- a/guix/import/opam.scm
+++ b/guix/import/opam.scm
@@ -1,3 +1,4 @@
+;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
;;;
;;; This file is part of GNU Guix.
@@ -38,7 +39,14 @@
#:use-module ((guix licenses) #:prefix license:)
#:export (opam->guix-package
opam-recursive-import
- %opam-updater))
+ %opam-updater
+
+ ;; The following patterns are exported for testing purposes.
+ string-pat
+ multiline-string
+ list-pat
+ dict
+ condition))
;; Define a PEG parser for the opam format
(define-peg-pattern comment none (and "#" (* STRCHR) "\n"))
@@ -233,8 +241,8 @@ path to the repository."
(list dependency (list 'unquote (string->symbol dependency))))
(ocaml-names->guix-names lst)))
-(define (opam-fetch name)
- (and-let* ((repository (get-opam-repository))
+(define* (opam-fetch name #:optional (repository (get-opam-repository)))
+ (and-let* ((repository repository)
(version (find-latest-version name repository))
(file (string-append repository "/packages/" name "/" name "." version "/opam")))
`(("metadata" ,@(get-metadata file))
@@ -242,8 +250,11 @@ path to the repository."
(substring version 1)
version)))))
-(define (opam->guix-package name)
- (and-let* ((opam-file (opam-fetch name))
+(define* (opam->guix-package name #:key repository)
+ "Import OPAM package NAME from REPOSITORY (a directory name) or, if
+REPOSITORY is #f, from the official OPAM repository. Return a 'package' sexp
+or #f on failure."
+ (and-let* ((opam-file (opam-fetch name repository))
(version (assoc-ref opam-file "version"))
(opam-content (assoc-ref opam-file "metadata"))
(url-dict (metadata-ref opam-content "url"))
diff --git a/tests/opam.scm b/tests/opam.scm
index d3626fd010..68b5908e3f 100644
--- a/tests/opam.scm
+++ b/tests/opam.scm
@@ -85,36 +85,33 @@ url {
(with-output-to-file (string-append my-package "/opam")
(lambda _
(format #t "~a" test-opam-file))))
- (mock ((guix import opam) get-opam-repository
- (lambda _
- test-repo))
- (match (opam->guix-package "foo")
- (('package
- ('name "ocaml-foo")
- ('version "1.0.0")
- ('source ('origin
- ('method 'url-fetch)
- ('uri "https://example.org/foo-1.0.0.tar.gz")
- ('sha256
- ('base32
- (? string? hash)))))
- ('build-system 'ocaml-build-system)
- ('propagated-inputs
- ('quasiquote
- (("ocaml-zarith" ('unquote 'ocaml-zarith)))))
- ('native-inputs
- ('quasiquote
- (("ocaml-alcotest" ('unquote 'ocaml-alcotest))
- ("ocamlbuild" ('unquote 'ocamlbuild)))))
- ('home-page "https://example.org/")
- ('synopsis "Some example package")
- ('description "This package is just an example.")
- ('license #f))
- (string=? (bytevector->nix-base32-string
- test-source-hash)
- hash))
- (x
- (pk 'fail x #f))))))
+ (match (opam->guix-package "foo" #:repository test-repo)
+ (('package
+ ('name "ocaml-foo")
+ ('version "1.0.0")
+ ('source ('origin
+ ('method 'url-fetch)
+ ('uri "https://example.org/foo-1.0.0.tar.gz")
+ ('sha256
+ ('base32
+ (? string? hash)))))
+ ('build-system 'ocaml-build-system)
+ ('propagated-inputs
+ ('quasiquote
+ (("ocaml-zarith" ('unquote 'ocaml-zarith)))))
+ ('native-inputs
+ ('quasiquote
+ (("ocaml-alcotest" ('unquote 'ocaml-alcotest))
+ ("ocamlbuild" ('unquote 'ocamlbuild)))))
+ ('home-page "https://example.org/")
+ ('synopsis "Some example package")
+ ('description "This package is just an example.")
+ ('license #f))
+ (string=? (bytevector->nix-base32-string
+ test-source-hash)
+ hash))
+ (x
+ (pk 'fail x #f)))))
;; Test the opam file parser
;; We fold over some test cases. Each case is a pair of the string to parse and the
@@ -123,7 +120,7 @@ url {
(fold (lambda (test acc)
(display test) (newline)
(and acc
- (let ((result (peg:tree (match-pattern (@@ (guix import opam) string-pat) (car test)))))
+ (let ((result (peg:tree (match-pattern string-pat (car test)))))
(if (equal? result (cdr test))
#t
(pk 'fail (list (car test) result (cdr test)) #f)))))
@@ -138,7 +135,7 @@ url {
(fold (lambda (test acc)
(display test) (newline)
(and acc
- (let ((result (peg:tree (match-pattern (@@ (guix import opam) multiline-string) (car test)))))
+ (let ((result (peg:tree (match-pattern multiline-string (car test)))))
(if (equal? result (cdr test))
#t
(pk 'fail (list (car test) result (cdr test)) #f)))))
@@ -150,7 +147,7 @@ url {
(test-assert "parse-lists"
(fold (lambda (test acc)
(and acc
- (let ((result (peg:tree (match-pattern (@@ (guix import opam) list-pat) (car test)))))
+ (let ((result (peg:tree (match-pattern list-pat (car test)))))
(if (equal? result (cdr test))
#t
(pk 'fail (list (car test) result (cdr test)) #f)))))
@@ -164,7 +161,7 @@ url {
(test-assert "parse-dicts"
(fold (lambda (test acc)
(and acc
- (let ((result (peg:tree (match-pattern (@@ (guix import opam) dict) (car test)))))
+ (let ((result (peg:tree (match-pattern dict (car test)))))
(if (equal? result (cdr test))
#t
(pk 'fail (list (car test) result (cdr test)) #f)))))
@@ -176,7 +173,7 @@ url {
(test-assert "parse-conditions"
(fold (lambda (test acc)
(and acc
- (let ((result (peg:tree (match-pattern (@@ (guix import opam) condition) (car test)))))
+ (let ((result (peg:tree (match-pattern condition (car test)))))
(if (equal? result (cdr test))
#t
(pk 'fail (list (car test) result (cdr test)) #f)))))