From unknown Sun Jun 22 00:54:43 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#32396] [PATCH] import: hackage: Support recursive importing. Resent-From: Ricardo Wurmus Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 08 Aug 2018 10:16:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 32396 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 32396@debbugs.gnu.org Cc: Ricardo Wurmus X-Debbugs-Original-To: Received: via spool by submit@debbugs.gnu.org id=B.15337233389148 (code B ref -1); Wed, 08 Aug 2018 10:16:02 +0000 Received: (at submit) by debbugs.gnu.org; 8 Aug 2018 10:15:38 +0000 Received: from localhost ([127.0.0.1]:44223 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fnLVB-0002NU-Tp for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:38 -0400 Received: from eggs.gnu.org ([208.118.235.92]:38678) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fnLV8-0002ND-9K for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fnLV1-0000za-5t for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:28 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_DKIM_INVALID, T_FILL_THIS_FORM_SHORT autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:40750) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fnLV1-0000yj-1f for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57837) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fnLUy-00054k-FG for guix-patches@gnu.org; Wed, 08 Aug 2018 06:15:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fnLUv-0000vd-4A for guix-patches@gnu.org; Wed, 08 Aug 2018 06:15:24 -0400 Received: from pegasus.bbbm.mdc-berlin.de ([141.80.25.20]:57588) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fnLUt-0000uN-Pi for guix-patches@gnu.org; Wed, 08 Aug 2018 06:15:20 -0400 Received: from localhost (localhost [127.0.0.1]) by pegasus.bbbm.mdc-berlin.de (Postfix) with ESMTP id A500F9CBD1F for ; Wed, 8 Aug 2018 12:15:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mdc-berlin.de; h= content-transfer-encoding:content-type:content-type:mime-version :x-mailer:message-id:date:date:subject:subject:from:from :received:received:received; s=mdc; t=1533723312; x=1535537713; bh=pf/hkLKnO7WByLWDYfScg2ioyNwpQz53+hXXboQbaB0=; b=nJXMisq6r58n OsnTEIwDUjhxsQkE6CXQyv5rlcaaLSOPF5RweQ24lJaSC3kE5M6vOWbZ/0YhLkFa Jcde5RIQh2gJQTLnmB78B8XdMw4QcmtnZgAUbh5LPR4jO4RbLEoGfFVWZ3GuflSz gb804kNNDun586XtiXAkeAH/IKu68sY= X-Virus-Scanned: amavisd-new at mdc-berlin.de Received: from pegasus.bbbm.mdc-berlin.de ([127.0.0.1]) by localhost (pegasus.bbbm.mdc-berlin.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ehVHiEMh5YPc for ; Wed, 8 Aug 2018 12:15:12 +0200 (CEST) Received: from SW-IT-P-CAS2.mdc-berlin.net (puck.citx.mdc-berlin.de [141.80.36.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by pegasus.bbbm.mdc-berlin.de (Postfix) with ESMTPS for ; Wed, 8 Aug 2018 12:15:12 +0200 (CEST) Received: from localhost (141.80.113.103) by SW-IT-P-CAS2.mdc-berlin.net (141.80.113.54) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 8 Aug 2018 12:15:11 +0200 From: Ricardo Wurmus Date: Wed, 8 Aug 2018 12:15:10 +0200 Message-ID: <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Originating-IP: [141.80.113.103] X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24018.006 X-TM-AS-Result: No-7.287100-8.000000-10 X-TMASE-MatchedRID: IP2XlN8ufaPyZ92BnYqk5nypjffgdgMPbv16+gil4jfZ7ve0lygT2HB4 4IkzjfYyVztt14qydosljkpeyO8ULdH/WqWljGhSaK+MsTwM+1l/aDoolm3GXWojx25puFlrgS4 a4c3Y4FCxJzDWm+S1XZgRu5dLmW5VWU/fB/XFmJy04Y/NhTxUgkDwlkRNC6PCjUp+3PMrJQVYyL J7di4un++LD5U7gwmCZXDWyW7bCwObazeBmCbenufHZObG8Jso+LidURF+DB1qv/+QKNcPLmg8o DsJzg8MFSXsFuBarekTR6MsfJbuq1I3mP8aC0PBylAqNTt8FdXs5ES0wcUpgL/A+0D1to6PdYTq lSETYVZ8+Raoy35fmAB8fFQwSq9hqt8A/tDktzZKNzbmytc2CI+YVJqrrEz4IhQZBgv5jSKWqqS OH0FEDMxMN0D2Pm2wX7bicKxRIU2No+PRbWqfRMprJP8FBOIaK1fZidXeHDnrOjDwCZfQ9uL615 D3REyuiqIprxD4/idyFe4wzKaObA== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--7.287100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24018.006 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) * guix/import/hackage.scm (hackage-recursive-import): New procedure. (hackage-module->sexp): Return dependencies alongside dependencies. (hackage->guix-package): Memoize results. * guix/scripts/import/hackage.scm (%options, guix-import-hackage): Suppor= t recursive importing. * doc/guix.texi (Invoking guix import): Document option. --- doc/guix.texi | 5 ++ guix/import/hackage.scm | 124 ++++++++++++++++++-------------- guix/scripts/import/hackage.scm | 24 +++++-- 3 files changed, 94 insertions(+), 59 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 080b091b3..d833e12cb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -6661,6 +6661,11 @@ The value associated with a flag has to be either = the symbol has to conform to the Cabal file format definition. The default value associated with the keys @code{os}, @code{arch} and @code{impl} is @samp{linux}, @samp{x86_64} and @samp{ghc}, respectively. +@item --recursive +@itemx -r +Traverse the dependency graph of the given upstream package recursively +and generate package expressions for all those packages that are not yet +in Guix. @end table =20 The command below imports metadata for the latest version of the diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm index 3b138f8c9..74b497045 100644 --- a/guix/import/hackage.scm +++ b/guix/import/hackage.scm @@ -30,15 +30,17 @@ #:use-module ((guix utils) #:select (package-name->name+version canonical-newline-port)) #:use-module (guix http-client) - #:use-module ((guix import utils) #:select (factorize-uri)) + #:use-module ((guix import utils) #:select (factorize-uri recursive-im= port)) #:use-module (guix import cabal) #:use-module (guix store) #:use-module (guix hash) #:use-module (guix base32) + #:use-module (guix memoization) #:use-module (guix upstream) #:use-module (guix packages) #:use-module ((guix utils) #:select (call-with-temporary-output-file)) #:export (hackage->guix-package + hackage-recursive-import %hackage-updater =20 guix-package->hackage-name @@ -205,32 +207,34 @@ representation of a Cabal file as produced by 'read= -cabal'." (define source-url (hackage-source-url name version)) =20 + (define hackage-dependencies + ((compose (cut filter-dependencies <> + (cabal-package-name cabal)) + (cut cabal-dependencies->names <>)) + cabal)) + + (define hackage-native-dependencies + ((compose (cut filter-dependencies <> + (cabal-package-name cabal)) + ;; FIXME: Check include-test-dependencies? + (lambda (cabal) + (append (if include-test-dependencies? + (cabal-test-dependencies->names cabal) + '()) + (cabal-custom-setup-dependencies->names cabal)))= ) + cabal)) + (define dependencies - (let ((names - (map hackage-name->package-name - ((compose (cut filter-dependencies <> - (cabal-package-name cabal)) - (cut cabal-dependencies->names <>)) - cabal)))) - (map (lambda (name) - (list name (list 'unquote (string->symbol name)))) - names))) + (map (lambda (name) + (list name (list 'unquote (string->symbol name)))) + (map hackage-name->package-name + hackage-dependencies))) =20 (define native-dependencies - (let ((names - (map hackage-name->package-name - ((compose (cut filter-dependencies <> - (cabal-package-name cabal)) - ;; FIXME: Check include-test-dependencies? - (lambda (cabal) - (append (if include-test-dependencies? - (cabal-test-dependencies->names = cabal) - '()) - (cabal-custom-setup-dependencies->na= mes cabal)))) - cabal)))) - (map (lambda (name) - (list name (list 'unquote (string->symbol name)))) - names))) + (map (lambda (name) + (list name (list 'unquote (string->symbol name)))) + (map hackage-name->package-name + hackage-native-dependencies))) =20 (define (maybe-inputs input-type inputs) (match inputs @@ -247,31 +251,35 @@ representation of a Cabal file as produced by 'read= -cabal'." =20 (let ((tarball (with-store store (download-to-store store source-url)))) - `(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 tarb= all)) - "failed to download tar archive"))))) - (build-system haskell-build-system) - ,@(maybe-inputs 'inputs dependencies) - ,@(maybe-inputs 'native-inputs native-dependencies) - ,@(maybe-arguments) - (home-page ,(cabal-package-home-page cabal)) - (synopsis ,(cabal-package-synopsis cabal)) - (description ,(cabal-package-description cabal)) - (license ,(string->license (cabal-package-license cabal)))))) + (values + `(package + (name ,(hackage-name->package-name name)) + (version ,version) + (source (origin + (method url-fetch) + (uri (string-append ,@(factorize-uri source-url versio= n))) + (sha256 + (base32 + ,(if tarball + (bytevector->nix-base32-string (file-sha256 tar= ball)) + "failed to download tar archive"))))) + (build-system haskell-build-system) + ,@(maybe-inputs 'inputs dependencies) + ,@(maybe-inputs 'native-inputs native-dependencies) + ,@(maybe-arguments) + (home-page ,(cabal-package-home-page cabal)) + (synopsis ,(cabal-package-synopsis cabal)) + (description ,(cabal-package-description cabal)) + (license ,(string->license (cabal-package-license cabal)))) + (append hackage-dependencies hackage-native-dependencies)))) =20 -(define* (hackage->guix-package package-name #:key - (include-test-dependencies? #t) - (port #f) - (cabal-environment '())) - "Fetch the Cabal file for PACKAGE-NAME from hackage.haskell.org, or, i= f the +(define hackage->guix-package + (memoize + (lambda* (package-name #:key + (include-test-dependencies? #t) + (port #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. CABAL-ENVIRONMENT is an alist defining the environment in which the Caba= l @@ -281,13 +289,19 @@ symbol 'true' or 'false'. The value associated wit= h other keys has to conform to the Cabal file format definition. The default value associated with = the keys \"os\", \"arch\" and \"impl\" is \"linux\", \"x86_64\" and \"ghc\" respectively." - (let ((cabal-meta (if port - (read-cabal (canonical-newline-port port)) - (hackage-fetch package-name)))) - (and=3D> cabal-meta (compose (cut hackage-module->sexp <> - #:include-test-dependencies?=20 - include-test-dependencies?) - (cut eval-cabal <> cabal-environment))))) + (let ((cabal-meta (if port + (read-cabal (canonical-newline-port port)) + (hackage-fetch package-name)))) + (and=3D> cabal-meta (compose (cut hackage-module->sexp <> + #:include-test-dependencies? + include-test-dependencies?) + (cut eval-cabal <> cabal-environment))= ))))) + +(define* (hackage-recursive-import package-name) + (recursive-import package-name #f + #:repo->guix-package (lambda (name repo) + (hackage->guix-package name)) + #:guix-name hackage-name->package-name)) =20 (define (hackage-package? package) "Return #t if PACKAGE is a Haskell package from Hackage." diff --git a/guix/scripts/import/hackage.scm b/guix/scripts/import/hackag= e.scm index 969f63784..8cf670e85 100644 --- a/guix/scripts/import/hackage.scm +++ b/guix/scripts/import/hackage.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015 Federico Beffa +;;; Copyright =C2=A9 2018 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,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-hackage)) @@ -89,6 +91,9 @@ version.\n")) (alist-cons 'cabal-environment (read/eval arg) (alist-delete 'cabal-environment result)))) + (option '(#\r "recursive") #f #f + (lambda (opt name arg result) + (alist-cons 'recursive #t result))) %standard-import-options)) =20 =0C @@ -136,11 +141,22 @@ from standard input~%"))))) (leave (G_ "too many arguments~%")))) (match args ((package-name) - (run-importer package-name opts - (lambda () - (leave (G_ "failed to download cabal file \ + (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 + (hackage-recursive-import package-name)))) + ;; Single import + (run-importer package-name opts + (lambda () + (leave (G_ "failed to download cabal file= \ for package '~a'~%") - package-name)))) + package-name))))) (() (leave (G_ "too few arguments~%"))) ((many ...) --=20 2.18.0 From unknown Sun Jun 22 00:54:43 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#32396] [PATCH] import: hackage: Support recursive importing. References: <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> In-Reply-To: <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> Resent-From: Ricardo Wurmus Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 08 Aug 2018 13:30:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 32396 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: <32396@debbugs.gnu.org> Cc: Ricardo Wurmus Received: via spool by 32396-submit@debbugs.gnu.org id=B32396.15337349693080 (code B ref 32396); Wed, 08 Aug 2018 13:30:02 +0000 Received: (at 32396) by debbugs.gnu.org; 8 Aug 2018 13:29:29 +0000 Received: from localhost ([127.0.0.1]:44286 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fnOWn-0000nb-4q for submit@debbugs.gnu.org; Wed, 08 Aug 2018 09:29:29 -0400 Received: from sinope02.bbbm.mdc-berlin.de ([141.80.25.24]:38134) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fnOWk-0000nT-Vn for 32396@debbugs.gnu.org; Wed, 08 Aug 2018 09:29:27 -0400 Received: from localhost (localhost [127.0.0.1]) by sinope02.bbbm.mdc-berlin.de (Postfix) with ESMTP id 09BAF122DC37 for <32396@debbugs.gnu.org>; Wed, 8 Aug 2018 15:29:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mdc-berlin.de; h= content-transfer-encoding:content-type:content-type:mime-version :x-mailer:message-id:date:date:subject:subject:from:from :received:received:received; s=mdc; t=1533734960; x=1535549361; bh=GzyeOqAo5dWFVEHHwzZDwMUBGsQyLbw8z1GCLl1urhA=; b=Gvpwi3WQpn4u fShyF2YejLgxzno5WaWduhuotTEiOmFIakLNo0Rg8Oc3JF7/reGcyvzoXpmeQVqx ZW9guhYOWZGqU6+6J7JSGH/eh9txq0itAIT/bZze0mEepgt+oELZcrKUfODH1hhG ACMBodlkKM8yKb1pnV57hn0pIJfegYI= X-Virus-Scanned: amavisd-new at mdc-berlin.de Received: from sinope02.bbbm.mdc-berlin.de ([127.0.0.1]) by localhost (sinope02.bbbm.mdc-berlin.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id aaWI0WWEHP7T for <32396@debbugs.gnu.org>; Wed, 8 Aug 2018 15:29:20 +0200 (CEST) Received: from SW-IT-P-CAS3.mdc-berlin.net (puck.citx.mdc-berlin.de [141.80.36.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by sinope02.bbbm.mdc-berlin.de (Postfix) with ESMTPS for <32396@debbugs.gnu.org>; Wed, 8 Aug 2018 15:29:20 +0200 (CEST) Received: from localhost (141.80.113.103) by SW-IT-P-CAS3.mdc-berlin.net (141.80.113.58) with Microsoft SMTP Server (TLS) id 14.3.399.0; Wed, 8 Aug 2018 15:29:20 +0200 From: Ricardo Wurmus Date: Wed, 8 Aug 2018 15:29:18 +0200 Message-ID: <20180808132918.29564-1-ricardo.wurmus@mdc-berlin.de> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [141.80.113.103] X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24018.006 X-TM-AS-Result: No-6.588100-8.000000-10 X-TMASE-MatchedRID: IP2XlN8ufaPyZ92BnYqk5nypjffgdgMPbv16+gil4jfZ7ve0lygT2HB4 4IkzjfYyVztt14qydosljkpeyO8ULdH/WqWljGhSaK+MsTwM+1l/aDoolm3GXWojx25puFlrgS4 a4c3Y4FCxJzDWm+S1XZgRu5dLmW5VWU/fB/XFmJy04Y/NhTxUgkDwlkRNC6PCjUp+3PMrJQVYyL J7di4un++LD5U7gwmCZXDWyW7bCwObazeBmCbenufHZObG8Jso+LidURF+DB1qv/+QKNcPLmg8o DsJzg8MFSXsFuBarekTR6MsfJbuq1I3mP8aC0PBylAqNTt8FdXs5ES0wcUpgL/A+0D1to6PdYTq lSETYVZ8+Raoy35fmAB8fFQwSq9h8zWY0cbqPL5xfk94zHLa/uZ0LhZsHFMkIhQZBgv5jSJBxy3 sKYShPufOVcxjDhcw6A6rUGAnOXcLbigRnpKlKTpcQTtiHDgWKsg4YDoJon+oVy5UjFixZ2p3Sr slWnKbLK8wFrmDgtCRm94PKgp30w== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--6.588100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24018.006 X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * guix/import/hackage.scm (hackage-recursive-import): New procedure. (hackage-module->sexp): Return dependencies alongside dependencies. (hackage->guix-package): Memoize results. * guix/scripts/import/hackage.scm (show-help, %options, guix-import-hackage): Support recursive importing. * doc/guix.texi (Invoking guix import): Document option. --- doc/guix.texi | 5 ++ guix/import/hackage.scm | 124 ++++++++++++++++++-------------- guix/scripts/import/hackage.scm | 37 +++++++--- 3 files changed, 102 insertions(+), 64 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 080b091b3..d833e12cb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -6661,6 +6661,11 @@ The value associated with a flag has to be either the symbol has to conform to the Cabal file format definition. The default value associated with the keys @code{os}, @code{arch} and @code{impl} is @samp{linux}, @samp{x86_64} and @samp{ghc}, respectively. +@item --recursive +@itemx -r +Traverse the dependency graph of the given upstream package recursively +and generate package expressions for all those packages that are not yet +in Guix. @end table The command below imports metadata for the latest version of the diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm index 3b138f8c9..3c00f680b 100644 --- a/guix/import/hackage.scm +++ b/guix/import/hackage.scm @@ -30,15 +30,17 @@ #:use-module ((guix utils) #:select (package-name->name+version canonical-newline-port)) #:use-module (guix http-client) - #:use-module ((guix import utils) #:select (factorize-uri)) + #:use-module ((guix import utils) #:select (factorize-uri recursive-import)) #:use-module (guix import cabal) #:use-module (guix store) #:use-module (guix hash) #:use-module (guix base32) + #:use-module (guix memoization) #:use-module (guix upstream) #:use-module (guix packages) #:use-module ((guix utils) #:select (call-with-temporary-output-file)) #:export (hackage->guix-package + hackage-recursive-import %hackage-updater guix-package->hackage-name @@ -205,32 +207,34 @@ representation of a Cabal file as produced by 'read-cabal'." (define source-url (hackage-source-url name version)) + (define hackage-dependencies + ((compose (cut filter-dependencies <> + (cabal-package-name cabal)) + (cut cabal-dependencies->names <>)) + cabal)) + + (define hackage-native-dependencies + ((compose (cut filter-dependencies <> + (cabal-package-name cabal)) + ;; FIXME: Check include-test-dependencies? + (lambda (cabal) + (append (if include-test-dependencies? + (cabal-test-dependencies->names cabal) + '()) + (cabal-custom-setup-dependencies->names cabal)))) + cabal)) + (define dependencies - (let ((names - (map hackage-name->package-name - ((compose (cut filter-dependencies <> - (cabal-package-name cabal)) - (cut cabal-dependencies->names <>)) - cabal)))) - (map (lambda (name) - (list name (list 'unquote (string->symbol name)))) - names))) + (map (lambda (name) + (list name (list 'unquote (string->symbol name)))) + (map hackage-name->package-name + hackage-dependencies))) (define native-dependencies - (let ((names - (map hackage-name->package-name - ((compose (cut filter-dependencies <> - (cabal-package-name cabal)) - ;; FIXME: Check include-test-dependencies? - (lambda (cabal) - (append (if include-test-dependencies? - (cabal-test-dependencies->names cabal) - '()) - (cabal-custom-setup-dependencies->names cabal)))) - cabal)))) - (map (lambda (name) - (list name (list 'unquote (string->symbol name)))) - names))) + (map (lambda (name) + (list name (list 'unquote (string->symbol name)))) + (map hackage-name->package-name + hackage-native-dependencies))) (define (maybe-inputs input-type inputs) (match inputs @@ -247,31 +251,35 @@ representation of a Cabal file as produced by 'read-cabal'." (let ((tarball (with-store store (download-to-store store source-url)))) - `(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"))))) - (build-system haskell-build-system) - ,@(maybe-inputs 'inputs dependencies) - ,@(maybe-inputs 'native-inputs native-dependencies) - ,@(maybe-arguments) - (home-page ,(cabal-package-home-page cabal)) - (synopsis ,(cabal-package-synopsis cabal)) - (description ,(cabal-package-description cabal)) - (license ,(string->license (cabal-package-license cabal)))))) + (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"))))) + (build-system haskell-build-system) + ,@(maybe-inputs 'inputs dependencies) + ,@(maybe-inputs 'native-inputs native-dependencies) + ,@(maybe-arguments) + (home-page ,(cabal-package-home-page cabal)) + (synopsis ,(cabal-package-synopsis cabal)) + (description ,(cabal-package-description cabal)) + (license ,(string->license (cabal-package-license cabal)))) + (append hackage-dependencies hackage-native-dependencies)))) -(define* (hackage->guix-package package-name #:key - (include-test-dependencies? #t) - (port #f) - (cabal-environment '())) - "Fetch the Cabal file for PACKAGE-NAME from hackage.haskell.org, or, if the +(define hackage->guix-package + (memoize + (lambda* (package-name #:key + (include-test-dependencies? #t) + (port #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. CABAL-ENVIRONMENT is an alist defining the environment in which the Cabal @@ -281,13 +289,19 @@ symbol 'true' or 'false'. The value associated with other keys has to conform to the Cabal file format definition. The default value associated with the keys \"os\", \"arch\" and \"impl\" is \"linux\", \"x86_64\" and \"ghc\" respectively." - (let ((cabal-meta (if port - (read-cabal (canonical-newline-port port)) - (hackage-fetch package-name)))) - (and=> cabal-meta (compose (cut hackage-module->sexp <> - #:include-test-dependencies? - include-test-dependencies?) - (cut eval-cabal <> cabal-environment))))) + (let ((cabal-meta (if port + (read-cabal (canonical-newline-port port)) + (hackage-fetch package-name)))) + (and=> cabal-meta (compose (cut hackage-module->sexp <> + #:include-test-dependencies? + include-test-dependencies?) + (cut eval-cabal <> cabal-environment))))))) + +(define* (hackage-recursive-import package-name . args) + (recursive-import package-name #f + #:repo->guix-package (lambda (name repo) + (apply hackage->guix-package (cons name args))) + #:guix-name hackage-name->package-name)) (define (hackage-package? package) "Return #t if PACKAGE is a Haskell package from Hackage." diff --git a/guix/scripts/import/hackage.scm b/guix/scripts/import/hackage.scm index 969f63784..f4aac6107 100644 --- a/guix/scripts/import/hackage.scm +++ b/guix/scripts/import/hackage.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa +;;; Copyright © 2018 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,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-hackage)) @@ -57,6 +59,8 @@ version.\n")) (display (G_ " -h, --help display this help and exit")) (display (G_ " + -r, --recursive import packages recursively")) + (display (G_ " -s, --stdin read from standard input")) (display (G_ " -t, --no-test-dependencies don't include test-only dependencies")) @@ -89,6 +93,9 @@ version.\n")) (alist-cons 'cabal-environment (read/eval arg) (alist-delete 'cabal-environment result)))) + (option '(#\r "recursive") #f #f + (lambda (opt name arg result) + (alist-cons 'recursive #t result))) %standard-import-options)) @@ -107,15 +114,27 @@ version.\n")) %default-options)) (define (run-importer package-name opts error-fn) - (let ((sexp (hackage->guix-package - package-name - #:include-test-dependencies? - (assoc-ref opts 'include-test-dependencies?) - #:port (if (assoc-ref opts 'read-from-stdin?) - (current-input-port) - #f) - #:cabal-environment - (assoc-ref opts 'cabal-environment)))) + (let* ((arguments (list + package-name + #:include-test-dependencies? + (assoc-ref opts 'include-test-dependencies?) + #:port (if (assoc-ref opts 'read-from-stdin?) + (current-input-port) + #f) + #:cabal-environment + (assoc-ref opts 'cabal-environment))) + (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 + (apply hackage-recursive-import arguments)))) + ;; Single import + (apply hackage->guix-package arguments)))) (unless sexp (error-fn)) sexp)) -- 2.18.0 From unknown Sun Jun 22 00:54:43 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#32396] [PATCH] import: hackage: Support recursive importing. Resent-From: Danny Milosavljevic Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 09 Aug 2018 22:57:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 32396 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Ricardo Wurmus Cc: 32396@debbugs.gnu.org Received: via spool by 32396-submit@debbugs.gnu.org id=B32396.153385538312783 (code B ref 32396); Thu, 09 Aug 2018 22:57:02 +0000 Received: (at 32396) by debbugs.gnu.org; 9 Aug 2018 22:56:23 +0000 Received: from localhost ([127.0.0.1]:46234 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fntqx-0003K7-GQ for submit@debbugs.gnu.org; Thu, 09 Aug 2018 18:56:23 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:41644) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fntqv-0003Jz-PX for 32396@debbugs.gnu.org; Thu, 09 Aug 2018 18:56:22 -0400 Received: from localhost (178.112.190.94.wireless.dyn.drei.com [178.112.190.94]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 44B4D3360176; Fri, 10 Aug 2018 00:56:20 +0200 (CEST) Date: Fri, 10 Aug 2018 00:56:15 +0200 From: Danny Milosavljevic Message-ID: <20180810005615.35f4be57@scratchpost.org> In-Reply-To: <20180808132918.29564-1-ricardo.wurmus@mdc-berlin.de> References: <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> <20180808132918.29564-1-ricardo.wurmus@mdc-berlin.de> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/9Y6U+=rg6TaLuV2.U/F7+eq"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --Sig_/9Y6U+=rg6TaLuV2.U/F7+eq Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable LGTM! --Sig_/9Y6U+=rg6TaLuV2.U/F7+eq Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAltsxo8ACgkQ5xo1VCww uqVqZwgAi9NaJ+Ewwp14c8mjFykh1f6YtO0Jjy9Uq4IALAILIMKkq5qM7E8ahv49 d5sH+37KBn5yptQmzziAueMT6cjCNI++i3jKMadCgr9shnVJbwAronS55yofHrXN QrHgmkypcclsivgGs+Z8wml7v/FwsnBGgmM4T+RhvKHak7Yrwmik92LPUXdnLLm2 s+sSuR9o4ELYUN4bSR2i3WXBxkimKM/zrwtd4HLjoimoOT08jVPC7HMqTNnCsh1v //HXn//RVx3MtdXeIbFQ4pneYCkcvjfQ3mp1erntyIzqoi8c/8X1fQhfq6P6ahR2 XEeplMJeizhp7TeiJol/DDrPrO7hbQ== =TGoU -----END PGP SIGNATURE----- --Sig_/9Y6U+=rg6TaLuV2.U/F7+eq-- From unknown Sun Jun 22 00:54:43 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Ricardo Wurmus Subject: bug#32396: closed (Re: [bug#32396] [PATCH] import: hackage: Support recursive importing.) Message-ID: References: <87sh3kc08p.fsf@mdc-berlin.de> <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> X-Gnu-PR-Message: they-closed 32396 X-Gnu-PR-Package: guix-patches X-Gnu-PR-Keywords: patch Reply-To: 32396@debbugs.gnu.org Date: Sat, 11 Aug 2018 16:55:04 +0000 Content-Type: multipart/mixed; boundary="----------=_1534006504-15879-1" This is a multi-part message in MIME format... ------------=_1534006504-15879-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #32396: [PATCH] import: hackage: Support recursive importing. which was filed against the guix-patches package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 32396@debbugs.gnu.org. --=20 32396: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D32396 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1534006504-15879-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 32396-done) by debbugs.gnu.org; 11 Aug 2018 16:54:36 +0000 Received: from localhost ([127.0.0.1]:48339 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1foX9w-00047T-75 for submit@debbugs.gnu.org; Sat, 11 Aug 2018 12:54:36 -0400 Received: from venus.bbbm.mdc-berlin.de ([141.80.25.30]:49556) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1foX9t-00047J-Rq for 32396-done@debbugs.gnu.org; Sat, 11 Aug 2018 12:54:34 -0400 Received: from localhost (localhost [127.0.0.1]) by venus.bbbm.mdc-berlin.de (Postfix) with ESMTP id 893C5380EBA; Sat, 11 Aug 2018 18:54:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mdc-berlin.de; h= content-transfer-encoding:content-type:content-type:mime-version :message-id:date:date:in-reply-to:subject:subject:from:from :user-agent:references:received:received:received; s=mdc; t= 1534006471; x=1535820872; bh=6xwO0zQdvihWTj9OBnv1tmDEmFSrE6Qe8vE Wz38IsKg=; b=EuJQBaaDbW3D+/4GWW1jM+iAzrTbaqBGntVo1bZ90OZRolFpOqe o4V8++Hf7tNPrayVSwhjCwYPdRujoPpAubxmjjdW8gsY99b67E/c3vVcSYzwmxVF in7TBfjdA1JLnqXenjhh+jNnoCr6j3/hLwwD6PihUQRzRQsrTTvkQTkI= X-Virus-Scanned: amavisd-new at mdc-berlin.de Received: from venus.bbbm.mdc-berlin.de ([127.0.0.1]) by localhost (venus.bbbm.mdc-berlin.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZkIVfIyx2X2p; Sat, 11 Aug 2018 18:54:31 +0200 (CEST) Received: from SW-IT-P-CAS1.mdc-berlin.net (puck.citx.mdc-berlin.de [141.80.36.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by venus.bbbm.mdc-berlin.de (Postfix) with ESMTPS; Sat, 11 Aug 2018 18:54:31 +0200 (CEST) Received: from localhost (92.200.43.86) by SW-IT-P-CAS1.mdc-berlin.net (141.80.113.53) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sat, 11 Aug 2018 18:54:31 +0200 References: <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> <20180808132918.29564-1-ricardo.wurmus@mdc-berlin.de> <20180810005615.35f4be57@scratchpost.org> User-agent: mu4e 1.0; emacs 26.1 From: Ricardo Wurmus To: Danny Milosavljevic Subject: Re: [bug#32396] [PATCH] import: hackage: Support recursive importing. In-Reply-To: <20180810005615.35f4be57@scratchpost.org> X-URL: https://elephly.net X-PGP-Key: https://elephly.net/rekado.pubkey X-PGP-Fingerprint: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC Date: Sat, 11 Aug 2018 18:54:30 +0200 Message-ID: <87sh3kc08p.fsf@mdc-berlin.de> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [92.200.43.86] X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24026.001 X-TM-AS-Result: No-2.514600-8.000000-10 X-TMASE-MatchedRID: 4kTn4W3NajN73HU3OUveQfHkpkyUphL9EtdrY/Wb3fN9+lncXG9c96PF jJEFr+ol+S9X7PfvVMo+GGpFZnfeJN0H8LFZNFG71sULACB0qRKcAGoFGASuf5xOm6PROGeOPOx tWKlub42IwszzkydXtH7Cc6lAUSayC5pVR6pYhkCLpC3buVhDdnayERGQn68SRoiLyDRxhr5+3B ndfXUhXQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.514600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24026.001 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 32396-done Cc: 32396-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Danny Milosavljevic writes: > LGTM! Thanks. Pushed to the =E2=80=9Cmaster=E2=80=9D branch with commit a92859616201dbf0cec36d3c746125d645c88c79. -- Ricardo ------------=_1534006504-15879-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 8 Aug 2018 10:15:38 +0000 Received: from localhost ([127.0.0.1]:44223 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fnLVB-0002NU-Tp for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:38 -0400 Received: from eggs.gnu.org ([208.118.235.92]:38678) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fnLV8-0002ND-9K for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fnLV1-0000za-5t for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:28 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_DKIM_INVALID, T_FILL_THIS_FORM_SHORT autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:40750) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fnLV1-0000yj-1f for submit@debbugs.gnu.org; Wed, 08 Aug 2018 06:15:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57837) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fnLUy-00054k-FG for guix-patches@gnu.org; Wed, 08 Aug 2018 06:15:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fnLUv-0000vd-4A for guix-patches@gnu.org; Wed, 08 Aug 2018 06:15:24 -0400 Received: from pegasus.bbbm.mdc-berlin.de ([141.80.25.20]:57588) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fnLUt-0000uN-Pi for guix-patches@gnu.org; Wed, 08 Aug 2018 06:15:20 -0400 Received: from localhost (localhost [127.0.0.1]) by pegasus.bbbm.mdc-berlin.de (Postfix) with ESMTP id A500F9CBD1F for ; Wed, 8 Aug 2018 12:15:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mdc-berlin.de; h= content-transfer-encoding:content-type:content-type:mime-version :x-mailer:message-id:date:date:subject:subject:from:from :received:received:received; s=mdc; t=1533723312; x=1535537713; bh=pf/hkLKnO7WByLWDYfScg2ioyNwpQz53+hXXboQbaB0=; b=nJXMisq6r58n OsnTEIwDUjhxsQkE6CXQyv5rlcaaLSOPF5RweQ24lJaSC3kE5M6vOWbZ/0YhLkFa Jcde5RIQh2gJQTLnmB78B8XdMw4QcmtnZgAUbh5LPR4jO4RbLEoGfFVWZ3GuflSz gb804kNNDun586XtiXAkeAH/IKu68sY= X-Virus-Scanned: amavisd-new at mdc-berlin.de Received: from pegasus.bbbm.mdc-berlin.de ([127.0.0.1]) by localhost (pegasus.bbbm.mdc-berlin.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ehVHiEMh5YPc for ; Wed, 8 Aug 2018 12:15:12 +0200 (CEST) Received: from SW-IT-P-CAS2.mdc-berlin.net (puck.citx.mdc-berlin.de [141.80.36.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by pegasus.bbbm.mdc-berlin.de (Postfix) with ESMTPS for ; Wed, 8 Aug 2018 12:15:12 +0200 (CEST) Received: from localhost (141.80.113.103) by SW-IT-P-CAS2.mdc-berlin.net (141.80.113.54) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 8 Aug 2018 12:15:11 +0200 From: Ricardo Wurmus To: Subject: [PATCH] import: hackage: Support recursive importing. Date: Wed, 8 Aug 2018 12:15:10 +0200 Message-ID: <20180808101510.12136-1-ricardo.wurmus@mdc-berlin.de> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Originating-IP: [141.80.113.103] X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24018.006 X-TM-AS-Result: No-7.287100-8.000000-10 X-TMASE-MatchedRID: IP2XlN8ufaPyZ92BnYqk5nypjffgdgMPbv16+gil4jfZ7ve0lygT2HB4 4IkzjfYyVztt14qydosljkpeyO8ULdH/WqWljGhSaK+MsTwM+1l/aDoolm3GXWojx25puFlrgS4 a4c3Y4FCxJzDWm+S1XZgRu5dLmW5VWU/fB/XFmJy04Y/NhTxUgkDwlkRNC6PCjUp+3PMrJQVYyL J7di4un++LD5U7gwmCZXDWyW7bCwObazeBmCbenufHZObG8Jso+LidURF+DB1qv/+QKNcPLmg8o DsJzg8MFSXsFuBarekTR6MsfJbuq1I3mP8aC0PBylAqNTt8FdXs5ES0wcUpgL/A+0D1to6PdYTq lSETYVZ8+Raoy35fmAB8fFQwSq9hqt8A/tDktzZKNzbmytc2CI+YVJqrrEz4IhQZBgv5jSKWqqS OH0FEDMxMN0D2Pm2wX7bicKxRIU2No+PRbWqfRMprJP8FBOIaK1fZidXeHDnrOjDwCZfQ9uL615 D3REyuiqIprxD4/idyFe4wzKaObA== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--7.287100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24018.006 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit Cc: Ricardo Wurmus X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) * guix/import/hackage.scm (hackage-recursive-import): New procedure. (hackage-module->sexp): Return dependencies alongside dependencies. (hackage->guix-package): Memoize results. * guix/scripts/import/hackage.scm (%options, guix-import-hackage): Suppor= t recursive importing. * doc/guix.texi (Invoking guix import): Document option. --- doc/guix.texi | 5 ++ guix/import/hackage.scm | 124 ++++++++++++++++++-------------- guix/scripts/import/hackage.scm | 24 +++++-- 3 files changed, 94 insertions(+), 59 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 080b091b3..d833e12cb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -6661,6 +6661,11 @@ The value associated with a flag has to be either = the symbol has to conform to the Cabal file format definition. The default value associated with the keys @code{os}, @code{arch} and @code{impl} is @samp{linux}, @samp{x86_64} and @samp{ghc}, respectively. +@item --recursive +@itemx -r +Traverse the dependency graph of the given upstream package recursively +and generate package expressions for all those packages that are not yet +in Guix. @end table =20 The command below imports metadata for the latest version of the diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm index 3b138f8c9..74b497045 100644 --- a/guix/import/hackage.scm +++ b/guix/import/hackage.scm @@ -30,15 +30,17 @@ #:use-module ((guix utils) #:select (package-name->name+version canonical-newline-port)) #:use-module (guix http-client) - #:use-module ((guix import utils) #:select (factorize-uri)) + #:use-module ((guix import utils) #:select (factorize-uri recursive-im= port)) #:use-module (guix import cabal) #:use-module (guix store) #:use-module (guix hash) #:use-module (guix base32) + #:use-module (guix memoization) #:use-module (guix upstream) #:use-module (guix packages) #:use-module ((guix utils) #:select (call-with-temporary-output-file)) #:export (hackage->guix-package + hackage-recursive-import %hackage-updater =20 guix-package->hackage-name @@ -205,32 +207,34 @@ representation of a Cabal file as produced by 'read= -cabal'." (define source-url (hackage-source-url name version)) =20 + (define hackage-dependencies + ((compose (cut filter-dependencies <> + (cabal-package-name cabal)) + (cut cabal-dependencies->names <>)) + cabal)) + + (define hackage-native-dependencies + ((compose (cut filter-dependencies <> + (cabal-package-name cabal)) + ;; FIXME: Check include-test-dependencies? + (lambda (cabal) + (append (if include-test-dependencies? + (cabal-test-dependencies->names cabal) + '()) + (cabal-custom-setup-dependencies->names cabal)))= ) + cabal)) + (define dependencies - (let ((names - (map hackage-name->package-name - ((compose (cut filter-dependencies <> - (cabal-package-name cabal)) - (cut cabal-dependencies->names <>)) - cabal)))) - (map (lambda (name) - (list name (list 'unquote (string->symbol name)))) - names))) + (map (lambda (name) + (list name (list 'unquote (string->symbol name)))) + (map hackage-name->package-name + hackage-dependencies))) =20 (define native-dependencies - (let ((names - (map hackage-name->package-name - ((compose (cut filter-dependencies <> - (cabal-package-name cabal)) - ;; FIXME: Check include-test-dependencies? - (lambda (cabal) - (append (if include-test-dependencies? - (cabal-test-dependencies->names = cabal) - '()) - (cabal-custom-setup-dependencies->na= mes cabal)))) - cabal)))) - (map (lambda (name) - (list name (list 'unquote (string->symbol name)))) - names))) + (map (lambda (name) + (list name (list 'unquote (string->symbol name)))) + (map hackage-name->package-name + hackage-native-dependencies))) =20 (define (maybe-inputs input-type inputs) (match inputs @@ -247,31 +251,35 @@ representation of a Cabal file as produced by 'read= -cabal'." =20 (let ((tarball (with-store store (download-to-store store source-url)))) - `(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 tarb= all)) - "failed to download tar archive"))))) - (build-system haskell-build-system) - ,@(maybe-inputs 'inputs dependencies) - ,@(maybe-inputs 'native-inputs native-dependencies) - ,@(maybe-arguments) - (home-page ,(cabal-package-home-page cabal)) - (synopsis ,(cabal-package-synopsis cabal)) - (description ,(cabal-package-description cabal)) - (license ,(string->license (cabal-package-license cabal)))))) + (values + `(package + (name ,(hackage-name->package-name name)) + (version ,version) + (source (origin + (method url-fetch) + (uri (string-append ,@(factorize-uri source-url versio= n))) + (sha256 + (base32 + ,(if tarball + (bytevector->nix-base32-string (file-sha256 tar= ball)) + "failed to download tar archive"))))) + (build-system haskell-build-system) + ,@(maybe-inputs 'inputs dependencies) + ,@(maybe-inputs 'native-inputs native-dependencies) + ,@(maybe-arguments) + (home-page ,(cabal-package-home-page cabal)) + (synopsis ,(cabal-package-synopsis cabal)) + (description ,(cabal-package-description cabal)) + (license ,(string->license (cabal-package-license cabal)))) + (append hackage-dependencies hackage-native-dependencies)))) =20 -(define* (hackage->guix-package package-name #:key - (include-test-dependencies? #t) - (port #f) - (cabal-environment '())) - "Fetch the Cabal file for PACKAGE-NAME from hackage.haskell.org, or, i= f the +(define hackage->guix-package + (memoize + (lambda* (package-name #:key + (include-test-dependencies? #t) + (port #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. CABAL-ENVIRONMENT is an alist defining the environment in which the Caba= l @@ -281,13 +289,19 @@ symbol 'true' or 'false'. The value associated wit= h other keys has to conform to the Cabal file format definition. The default value associated with = the keys \"os\", \"arch\" and \"impl\" is \"linux\", \"x86_64\" and \"ghc\" respectively." - (let ((cabal-meta (if port - (read-cabal (canonical-newline-port port)) - (hackage-fetch package-name)))) - (and=3D> cabal-meta (compose (cut hackage-module->sexp <> - #:include-test-dependencies?=20 - include-test-dependencies?) - (cut eval-cabal <> cabal-environment))))) + (let ((cabal-meta (if port + (read-cabal (canonical-newline-port port)) + (hackage-fetch package-name)))) + (and=3D> cabal-meta (compose (cut hackage-module->sexp <> + #:include-test-dependencies? + include-test-dependencies?) + (cut eval-cabal <> cabal-environment))= ))))) + +(define* (hackage-recursive-import package-name) + (recursive-import package-name #f + #:repo->guix-package (lambda (name repo) + (hackage->guix-package name)) + #:guix-name hackage-name->package-name)) =20 (define (hackage-package? package) "Return #t if PACKAGE is a Haskell package from Hackage." diff --git a/guix/scripts/import/hackage.scm b/guix/scripts/import/hackag= e.scm index 969f63784..8cf670e85 100644 --- a/guix/scripts/import/hackage.scm +++ b/guix/scripts/import/hackage.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015 Federico Beffa +;;; Copyright =C2=A9 2018 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,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-hackage)) @@ -89,6 +91,9 @@ version.\n")) (alist-cons 'cabal-environment (read/eval arg) (alist-delete 'cabal-environment result)))) + (option '(#\r "recursive") #f #f + (lambda (opt name arg result) + (alist-cons 'recursive #t result))) %standard-import-options)) =20 =0C @@ -136,11 +141,22 @@ from standard input~%"))))) (leave (G_ "too many arguments~%")))) (match args ((package-name) - (run-importer package-name opts - (lambda () - (leave (G_ "failed to download cabal file \ + (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 + (hackage-recursive-import package-name)))) + ;; Single import + (run-importer package-name opts + (lambda () + (leave (G_ "failed to download cabal file= \ for package '~a'~%") - package-name)))) + package-name))))) (() (leave (G_ "too few arguments~%"))) ((many ...) --=20 2.18.0 ------------=_1534006504-15879-1--