From: Xinglu Chen <public@yoctocell.xyz>
To: 48999@debbugs.gnu.org
Cc: "Ludovic Courtès" <ludo@gnu.org>, zimoun <zimon.toutoune@gmail.com>
Subject: [bug#48999] [PATCH v2 1/3] import: hackage: Accept local source for package.
Date: Sun, 04 Jul 2021 13:54:02 +0200 [thread overview]
Message-ID: <e3a7d1d0538b6bbfb525c93aaeba9f53474f4c3a.1625399149.git.public@yoctocell.xyz> (raw)
In-Reply-To: <cover.1625399149.git.public@yoctocell.xyz>
When developing a Haskell package it is often useful to have a Guix package
definition for that package, previously one would have to write that package
definition by hand, and if the .cabal file changed one would manually update
the Guix package definition.
This commit allows one to specify a custom source for their package, meaning
that one could programatically generate a Guix package definition for their
local Haskell package. If the .cabal file changes, the generated package
definition will also change accordingly. One could for instance write the
following in a guix.scm file:
(define-values (ghc-haskeme deps)
(call-with-input-file "haskeme.cabal"
(lambda (port)
(hackage->guix-package
"haskeme"
#:port port
#:source (local-file "." "haskeme-checkout"
#:recursive? #t
#:select? hg-predicate)))))
ghc-haskeme
Invoking ‘guix build -f guix.scm’ would then always build an up-to-date
version of the package.
* guix/import/hackage.scm (hackage-module->sexp): Add optional keyword
argument ‘source’
(hackage->guix-package): Likewise.
* tests/hackage.scm (eval-test-with-cabal): Likewise.
("hackage->guix-package local source"): New test.
---
guix/import/hackage.scm | 43 ++++++++++++++++++++++++++---------------
tests/hackage.scm | 28 +++++++++++++++++++++++++--
2 files changed, 53 insertions(+), 18 deletions(-)
diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm
index f94a1e7087..326ab92365 100644
--- a/guix/import/hackage.scm
+++ b/guix/import/hackage.scm
@@ -227,10 +227,13 @@ package being processed and is used to filter references to itself."
dependencies))
(define* (hackage-module->sexp cabal cabal-hash
- #:key (include-test-dependencies? #t))
+ #:key
+ (include-test-dependencies? #t)
+ (source #f))
"Return the `package' S-expression for a Cabal package. CABAL is the
-representation of a Cabal file as produced by 'read-cabal'. CABAL-HASH is
-the hash of the Cabal file."
+representation of a Cabal file as produced by 'read-cabal'. CABAL-HASH is the
+hash of the Cabal file. If SOURCE is specified, it will be used as the source
+for the package."
(define name
(cabal-package-name cabal))
@@ -294,20 +297,24 @@ the hash of the Cabal file."
(() '())
(args `((arguments (,'quasiquote ,args))))))
- (let ((tarball (with-store store
- (download-to-store store source-url))))
+ (let ((tarball (if source
+ #f
+ (with-store store
+ (download-to-store store source-url)))))
(values
`(package
(name ,(hackage-name->package-name name))
(version ,version)
- (source (origin
- (method url-fetch)
- (uri (string-append ,@(factorize-uri source-url version)))
- (sha256
- (base32
- ,(if tarball
- (bytevector->nix-base32-string (file-sha256 tarball))
- "failed to download tar archive")))))
+ (source ,(if source
+ source
+ `(origin
+ (method url-fetch)
+ (uri (string-append ,@(factorize-uri source-url version)))
+ (sha256
+ (base32
+ ,(if tarball
+ (bytevector->nix-base32-string (file-sha256 tarball))
+ "failed to download tar archive"))))))
(build-system haskell-build-system)
,@(maybe-inputs 'inputs dependencies)
,@(maybe-inputs 'native-inputs native-dependencies)
@@ -321,10 +328,12 @@ the hash of the Cabal file."
(define* (hackage->guix-package package-name #:key
(include-test-dependencies? #t)
(port #f)
+ (source #f)
(cabal-environment '()))
"Fetch the Cabal file for PACKAGE-NAME from hackage.haskell.org, or, if the
-called with keyword parameter PORT, from PORT. Return the `package'
-S-expression corresponding to that package, or #f on failure.
+called with keyword parameter PORT, from PORT. If SOURCE is specified, use it
+as the source for the package instead of trying to fetch a tarball. Return
+the `package' S-expression corresponding to that package, or #f on failure.
CABAL-ENVIRONMENT is an alist defining the environment in which the Cabal
conditionals are evaluated. The accepted keys are: \"os\", \"arch\", \"impl\"
and the name of a flag. The value associated with a flag has to be either the
@@ -338,7 +347,9 @@ respectively."
(hackage-fetch-and-hash package-name))))
(and=> cabal-meta (compose (cut hackage-module->sexp <> cabal-hash
#:include-test-dependencies?
- include-test-dependencies?)
+ include-test-dependencies?
+ #:source
+ source)
(cut eval-cabal <> cabal-environment)))))
(define hackage->guix-package/m ;memoized variant
diff --git a/tests/hackage.scm b/tests/hackage.scm
index 53972fc643..3083a5d4df 100644
--- a/tests/hackage.scm
+++ b/tests/hackage.scm
@@ -22,6 +22,7 @@
#:use-module (guix import cabal)
#:use-module (guix import hackage)
#:use-module (guix tests)
+ #:use-module (guix gexp)
#:use-module (srfi srfi-64)
#:use-module (ice-9 match))
@@ -186,9 +187,28 @@ library
('description (? string?))
('license 'license:bsd-3)))
-(define* (eval-test-with-cabal test-cabal matcher #:key (cabal-environment '()))
+(define-package-matcher match-ghc-foo-local-source
+ ('package
+ ('name "ghc-foo")
+ ('version "1.0.0")
+ ('source
+ (? file-like?))
+ ('build-system 'haskell-build-system)
+ ('inputs
+ ('quasiquote
+ (("ghc-http" ('unquote 'ghc-http)))))
+ ('home-page "http://test.org")
+ ('synopsis (? string?))
+ ('description (? string?))
+ ('license 'license:bsd-3)))
+
+(define* (eval-test-with-cabal test-cabal matcher
+ #:key (cabal-environment '()) (source #f))
(define port (open-input-string test-cabal))
- (matcher (hackage->guix-package "foo" #:port port #:cabal-environment cabal-environment)))
+ (matcher (hackage->guix-package "foo"
+ #:port port
+ #:cabal-environment cabal-environment
+ #:source source)))
(test-assert "hackage->guix-package test 1"
(eval-test-with-cabal test-cabal-1 match-ghc-foo))
@@ -208,6 +228,10 @@ library
(eval-test-with-cabal test-cabal-5 match-ghc-foo
#:cabal-environment '(("impl" . "ghc-7.8"))))
+(test-assert "hackage->guix-package local source"
+ (eval-test-with-cabal test-cabal-1 match-ghc-foo-local-source
+ #:source (plain-file "dummy source" "source")))
+
(define-package-matcher match-ghc-foo-6
('package
('name "ghc-foo")
--
2.32.0
next prev parent reply other threads:[~2021-07-04 11:55 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-13 9:46 [bug#48999] [PATCH] import: hackage: Accept local source for package Xinglu Chen
2021-06-29 9:44 ` Ludovic Courtès
2021-06-29 19:00 ` Xinglu Chen
2021-06-30 9:17 ` Ludovic Courtès
2021-06-30 14:10 ` zimoun
2021-07-04 10:43 ` Xinglu Chen
2021-07-04 11:53 ` [bug#48999] [PATCH v2 0/3] Import Haskell packages from the local filesystem Xinglu Chen
2021-07-04 11:54 ` Xinglu Chen [this message]
2021-07-04 11:54 ` [bug#48999] [PATCH v2 2/3] import: utils: Add predicates for checking VCS repositories Xinglu Chen
2021-07-04 11:54 ` [bug#48999] [PATCH v2 3/3] scripts: import: hackage: Add option to import package from local filesystem Xinglu Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e3a7d1d0538b6bbfb525c93aaeba9f53474f4c3a.1625399149.git.public@yoctocell.xyz \
--to=public@yoctocell.xyz \
--cc=48999@debbugs.gnu.org \
--cc=ludo@gnu.org \
--cc=zimon.toutoune@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).