From patchwork Thu Sep 30 21:01:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ludovic_Court=C3=A8s?= X-Patchwork-Id: 33473 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 1B4F927BBE3; Thu, 30 Sep 2021 22:08:57 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id E8CEC27BBE1 for ; Thu, 30 Sep 2021 22:08:55 +0100 (BST) Received: from localhost ([::1]:39152 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mW3IV-0006UZ-03 for patchwork@mira.cbaines.net; Thu, 30 Sep 2021 17:08:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33302) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mW3Co-000780-O2 for guix-patches@gnu.org; Thu, 30 Sep 2021 17:03:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:42605) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mW3Co-0004K7-DN for guix-patches@gnu.org; Thu, 30 Sep 2021 17:03:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mW3Co-00068w-9q for guix-patches@gnu.org; Thu, 30 Sep 2021 17:03:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#50922] [PATCH 1/2] import: stackage: Use 'define-json-mapping'. References: <20210930205454.1157-1-ludo@gnu.org> In-Reply-To: <20210930205454.1157-1-ludo@gnu.org> Resent-From: Ludovic =?utf-8?q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 30 Sep 2021 21:03:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 50922 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 50922@debbugs.gnu.org Cc: Ludovic =?utf-8?q?Court=C3=A8s?= Received: via spool by 50922-submit@debbugs.gnu.org id=B50922.163303572823536 (code B ref 50922); Thu, 30 Sep 2021 21:03:02 +0000 Received: (at 50922) by debbugs.gnu.org; 30 Sep 2021 21:02:08 +0000 Received: from localhost ([127.0.0.1]:54150 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mW3Bq-00067N-SY for submit@debbugs.gnu.org; Thu, 30 Sep 2021 17:02:08 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56176) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mW3Bn-00066h-BJ for 50922@debbugs.gnu.org; Thu, 30 Sep 2021 17:02:00 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:59942) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mW3Bi-0003X2-3H; Thu, 30 Sep 2021 17:01:54 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=36446 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mW3Bh-0006lk-RA; Thu, 30 Sep 2021 17:01:54 -0400 From: Ludovic =?utf-8?q?Court=C3=A8s?= Date: Thu, 30 Sep 2021 23:01:43 +0200 Message-Id: <20210930210144.1798-1-ludo@gnu.org> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches * guix/import/stackage.scm (, ) (): New record types and JSON mappings. (lts-info-packages, stackage-package-name) (stackage-package-version): Remove. (lts-package-version): Rename 'pkgs-info' to 'packages'; assume 'packages' is a list of . (stackage->guix-package): Use 'stackage-lts-packages' instead of 'lts-info-packages'. Rename 'packages-info' to 'packages'. (latest-lts-release): Likewise. (stackage-package?): Rename to... (stackage-lts-package?): ... this. Adjust to new API. (%stackage-updater)[pred]: Update accordingly. * tests/lint.scm ("haskell-stackage"): Add "snapshot" entry in JSON snippet. --- guix/import/stackage.scm | 79 ++++++++++++++++++++++------------------ tests/lint.scm | 6 ++- 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 731e69651e..4eff09ad01 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018 Ricardo Wurmus ;;; Copyright © 2020 Martin Becze ;;; Copyright © 2021 Xinglu Chem +;;; Copyright © 2021 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,13 +22,10 @@ (define-module (guix import stackage) #:use-module (ice-9 match) - #:use-module (ice-9 regex) - #:use-module (ice-9 control) + #:use-module (json) #:use-module (srfi srfi-1) - #:use-module (srfi srfi-26) #:use-module (srfi srfi-34) #:use-module (srfi srfi-35) - #:use-module (srfi srfi-43) #:use-module (guix import json) #:use-module (guix import hackage) #:use-module (guix import utils) @@ -50,9 +48,28 @@ ;; Latest LTS version compatible with GHC 8.6.5. (define %default-lts-version "14.27") -(define (lts-info-packages lts-info) - "Returns the alist of packages contained in LTS-INFO." - (or (assoc-ref lts-info "packages") '())) +(define-json-mapping make-stackage-lts + stackage-lts? + json->stackage-lts + (snapshot stackage-lts-snapshot "snapshot" json->snapshot) + (packages stackage-lts-packages "packages" + (lambda (vector) + (map json->stackage-package (vector->list vector))))) + +(define-json-mapping make-snapshot + stackage-snapshot? + json->snapshot + (name snapshot-name) + (ghc-version snapshot-ghc-version) + (compiler snapshot-compiler)) + +(define-json-mapping make-stackage-package + stackage-package? + json->stackage-package + (origin stackage-package-origin) + (name stackage-package-name) + (version stackage-package-version) + (synopsis stackage-package-synopsis)) (define (leave-with-message fmt . args) (raise (condition (&message (message (apply format #f fmt args)))))) @@ -65,21 +82,14 @@ "/lts-" (if (string-null? version) %default-lts-version version))) - (lts-info (json-fetch url))) - (if lts-info - (reverse lts-info) + (lts-info (and=> (json-fetch url) json->stackage-lts))) + (or lts-info (leave-with-message "LTS release version not found: ~a" version)))))) -(define (stackage-package-name pkg-info) - (assoc-ref pkg-info "name")) - -(define (stackage-package-version pkg-info) - (assoc-ref pkg-info "version")) - -(define (lts-package-version pkgs-info name) - "Return the version of the package with upstream NAME included in PKGS-INFO." +(define (lts-package-version packages name) + "Return the version of the package with upstream NAME included in PACKAGES." (let ((pkg (find (lambda (pkg) (string=? (stackage-package-name pkg) name)) - (vector->list pkgs-info)))) + packages))) (stackage-package-version pkg))) @@ -96,15 +106,15 @@ #:key (include-test-dependencies? #t) (lts-version %default-lts-version) - (packages-info - (lts-info-packages + (packages + (stackage-lts-packages (stackage-lts-info-fetch lts-version)))) "Fetch Cabal file for PACKAGE-NAME from hackage.haskell.org. The retrieved version corresponds to the version of PACKAGE-NAME specified in the LTS-VERSION release at stackage.org. Return the `package' S-expression corresponding to that package, or #f on failure. PACKAGES-INFO is the alist with the packages included in the Stackage LTS release." - (let* ((version (lts-package-version packages-info package-name)) + (let* ((version (lts-package-version packages package-name)) (name-version (hackage-name-version package-name version))) (if name-version (hackage->guix-package name-version @@ -124,14 +134,15 @@ included in the Stackage LTS release." ;;; (define latest-lts-release - (let ((pkgs-info - (mlambda () (lts-info-packages - (stackage-lts-info-fetch %default-lts-version))))) + (let ((packages + (mlambda () + (stackage-lts-packages + (stackage-lts-info-fetch %default-lts-version))))) (lambda* (package) "Return an for the latest Stackage LTS release of PACKAGE or #f if the package is not included in the Stackage LTS release." (let* ((hackage-name (guix-package->hackage-name package)) - (version (lts-package-version (pkgs-info) hackage-name)) + (version (lts-package-version (packages) hackage-name)) (name-version (hackage-name-version hackage-name version))) (match (and=> name-version hackage-fetch) (#f (format (current-error-port) @@ -144,23 +155,21 @@ PACKAGE or #f if the package is not included in the Stackage LTS release." (version version) (urls (list url)))))))))) -(define (stackage-package? package) - "Whether PACKAGE is available on the default Stackage LTS release." +(define (stackage-lts-package? package) + "Return whether PACKAGE is available on the default Stackage LTS release." (and (hackage-package? package) - (let ((packages (lts-info-packages + (let ((packages (stackage-lts-packages (stackage-lts-info-fetch %default-lts-version))) (hackage-name (guix-package->hackage-name package))) - (vector-any identity - (vector-map - (lambda (_ metadata) - (string=? (cdr (list-ref metadata 2)) hackage-name)) - packages))))) + (find (lambda (package) + (string=? (stackage-package-name package) hackage-name)) + packages)))) (define %stackage-updater (upstream-updater (name 'stackage) (description "Updater for Stackage LTS packages") - (pred stackage-package?) + (pred stackage-lts-package?) (latest latest-lts-release))) ;;; stackage.scm ends here diff --git a/tests/lint.scm b/tests/lint.scm index e96265a55a..699a750eb9 100644 --- a/tests/lint.scm +++ b/tests/lint.scm @@ -1319,7 +1319,11 @@ (let* ((stackage (string-append "{ \"packages\": [{" " \"name\":\"pandoc\"," " \"synopsis\":\"synopsis\"," - " \"version\":\"1.0\" }]}")) + " \"version\":\"1.0\" }]," + " \"snapshot\": {" + " \"ghc\": \"8.6.5\"," + " \"name\": \"lts-14.27\"" + " }}")) (packages (map (lambda (version) (dummy-package "ghc-pandoc" From patchwork Thu Sep 30 21:01:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ludovic_Court=C3=A8s?= X-Patchwork-Id: 33472 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id B351127BBE3; Thu, 30 Sep 2021 22:08:35 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 7914827BBE1 for ; Thu, 30 Sep 2021 22:08:35 +0100 (BST) Received: from localhost ([::1]:38610 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mW3IA-00067z-H0 for patchwork@mira.cbaines.net; Thu, 30 Sep 2021 17:08:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33296) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mW3Co-00076O-9O for guix-patches@gnu.org; Thu, 30 Sep 2021 17:03:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:42604) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mW3Co-0004Jy-0A for guix-patches@gnu.org; Thu, 30 Sep 2021 17:03:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mW3Cn-00068p-TA for guix-patches@gnu.org; Thu, 30 Sep 2021 17:03:01 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#50922] [PATCH 2/2] import: stackage: Use the standard diagnostic procedures. Resent-From: Ludovic =?utf-8?q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 30 Sep 2021 21:03:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 50922 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 50922@debbugs.gnu.org Cc: Ludovic =?utf-8?q?Court=C3=A8s?= Received: via spool by 50922-submit@debbugs.gnu.org id=B50922.163303572323524 (code B ref 50922); Thu, 30 Sep 2021 21:03:01 +0000 Received: (at 50922) by debbugs.gnu.org; 30 Sep 2021 21:02:03 +0000 Received: from localhost ([127.0.0.1]:54148 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mW3Bq-000677-BG for submit@debbugs.gnu.org; Thu, 30 Sep 2021 17:02:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56186) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mW3Bo-00066k-0A for 50922@debbugs.gnu.org; Thu, 30 Sep 2021 17:02:00 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:59944) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mW3Bi-0003XE-OZ; Thu, 30 Sep 2021 17:01:54 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=36446 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mW3Bi-0006lk-CU; Thu, 30 Sep 2021 17:01:54 -0400 From: Ludovic =?utf-8?q?Court=C3=A8s?= Date: Thu, 30 Sep 2021 23:01:44 +0200 Message-Id: <20210930210144.1798-2-ludo@gnu.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210930210144.1798-1-ludo@gnu.org> References: <20210930210144.1798-1-ludo@gnu.org> MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches * guix/import/stackage.scm (leave-with-message): Remove. (stackage-lts-info-fetch): Use 'raise' and 'formatted-message'. (stackage->guix-package): Likewise. (latest-lts-release): Use 'warning' instead of 'format'. --- guix/import/stackage.scm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 4eff09ad01..b4b20ebcf0 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -32,6 +32,8 @@ #:use-module (guix memoization) #:use-module (guix packages) #:use-module (guix upstream) + #:use-module (guix diagnostics) + #:use-module (guix i18n) #:export (%stackage-url stackage->guix-package stackage-recursive-import @@ -71,9 +73,6 @@ (version stackage-package-version) (synopsis stackage-package-synopsis)) -(define (leave-with-message fmt . args) - (raise (condition (&message (message (apply format #f fmt args)))))) - (define stackage-lts-info-fetch ;; "Retrieve the information about the LTS Stackage release VERSION." (memoize @@ -84,7 +83,8 @@ version))) (lts-info (and=> (json-fetch url) json->stackage-lts))) (or lts-info - (leave-with-message "LTS release version not found: ~a" version)))))) + (raise (formatted-message (G_ "LTS release version not found: ~a") + version))))))) (define (lts-package-version packages name) "Return the version of the package with upstream NAME included in PACKAGES." @@ -120,7 +120,8 @@ included in the Stackage LTS release." (hackage->guix-package name-version #:include-test-dependencies? include-test-dependencies?) - (leave-with-message "~a: Stackage package not found" package-name)))))) + (raise (formatted-message (G_ "~a: Stackage package not found") + package-name))))))) (define (stackage-recursive-import package-name . args) (recursive-import package-name @@ -145,10 +146,10 @@ PACKAGE or #f if the package is not included in the Stackage LTS release." (version (lts-package-version (packages) hackage-name)) (name-version (hackage-name-version hackage-name version))) (match (and=> name-version hackage-fetch) - (#f (format (current-error-port) - "warning: failed to parse ~a~%" - (hackage-cabal-url hackage-name)) - #f) + (#f + (warning (G_ "failed to parse ~a~%") + (hackage-cabal-url hackage-name)) + #f) (_ (let ((url (hackage-source-url hackage-name version))) (upstream-source (package (package-name package))