From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id 8FXUMOHiAGIcQAEAgWs5BA (envelope-from ) for ; Mon, 07 Feb 2022 10:14:09 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id mOdhLeHiAGJkJwEAauVa8A (envelope-from ) for ; Mon, 07 Feb 2022 10:14:09 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 91196A79A for ; Mon, 7 Feb 2022 10:14:08 +0100 (CET) Received: from localhost ([::1]:40054 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nH063-0005IU-CA for larch@yhetil.org; Mon, 07 Feb 2022 04:14:07 -0500 Received: from eggs.gnu.org ([209.51.188.92]:59484) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nGzNS-00060g-Ru for guix-patches@gnu.org; Mon, 07 Feb 2022 03:28:04 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:46928) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nGzNS-00079C-IB for guix-patches@gnu.org; Mon, 07 Feb 2022 03:28:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nGzNS-0005hX-FG for guix-patches@gnu.org; Mon, 07 Feb 2022 03:28:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#53828] [PATCH] guix: opam: Allow importing local files. Resent-From: Xinglu Chen Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Mon, 07 Feb 2022 08:28:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 53828 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Julien Lepiller , 53828@debbugs.gnu.org Received: via spool by 53828-submit@debbugs.gnu.org id=B53828.164422247521897 (code B ref 53828); Mon, 07 Feb 2022 08:28:02 +0000 Received: (at 53828) by debbugs.gnu.org; 7 Feb 2022 08:27:55 +0000 Received: from localhost ([127.0.0.1]:40825 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nGzNK-0005h3-Cn for submit@debbugs.gnu.org; Mon, 07 Feb 2022 03:27:55 -0500 Received: from h178-251-242-94.cust.a3fiber.se ([178.251.242.94]:54446 helo=mail.yoctocell.xyz) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nGzNE-0005gd-Ds for 53828@debbugs.gnu.org; Mon, 07 Feb 2022 03:27:52 -0500 From: Xinglu Chen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yoctocell.xyz; s=mail; t=1644222460; bh=qHPRTx3d9xugIG/M1mi0pRqjU0ZKV/Zd94Ts1hg6GAU=; h=From:To:Subject:In-Reply-To:References:Date; b=rDbsDfLhzRu3i62spNo/cCJhnvJWaNRGUu/vvbhcKWTuhguFu/acQ0uDDRuyKpuAF NJAl0CBT6lfkPZUAHAlK+YOqorEZQk34ZzyMvOOYkAylBPlwt2uyAU3NG2sNQyJZ7t 5GihoWCmlFOtCUbMghN+yXHNqx1Uei4vA9P0RKTY= In-Reply-To: <20220206224130.2220aae9@tachikoma.lepiller.eu> References: <20220206224130.2220aae9@tachikoma.lepiller.eu> Date: Mon, 07 Feb 2022 09:27:39 +0100 Message-ID: <87k0e713pg.fsf@yoctocell.xyz> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" 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+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1644225249; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=qHPRTx3d9xugIG/M1mi0pRqjU0ZKV/Zd94Ts1hg6GAU=; b=FVrMlcWZb+FPwzEfQGN4DN5WCje9Sl3gihgoW3g08YYwtjp3AOaHnJDbB/FkmzIwGwNZAq BALgdk/xQ0SN1vuIw0fkNA/l3mvTY1lMFHIgZpMeoW68zNxSAKTA4tegKTZ13H0P9fHcSQ VBj2JBvLBowO9GDA52ezEV2JFboexJIL5rlXbKodqkpsEzUuOWlIyLR3chMNNky2do/TA/ EAfc9aH3blK4qQjnckHVMeLAVMTJNWfk1qqHCOwGKHqDp2bhc4Ps52NhgGuqXY2FqU9KyJ tHGjUflxDo8P0OojSY1yl5hr77Ilqvv4LNEan88JUmHX6IIsGNIua5idluaDzg== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1644225249; a=rsa-sha256; cv=none; b=UwMeJQm9p7rac0vBTbMOqmFeC/FGOa7XspGOCsuc8L5tdK+4jUWbhilUwFpgRPdUirvJPE MSLr7It2G1sCjbG09ACuSaQGHJXFICPIn8wFn8Hr/JnTo/A5ChoxmtqMg/TRwO1MYeeNd0 80+XcuQTgAtWXkhcCxgPNyJbSqCrhHpnvAgOU+XKYg4QqP7YD5701YXGcZvHfjcxt2lkWr agEv5uuV/0EtODcro9OQAA4csdyZ3QbOO4hpCvh9jssBCHU8uPu69AJHtUXXdHy9VqgMts GQQd9jC22LOdJdRx4C4AulF0M1/69hyDkA5a2bTawp83ww6UeL6JeSQC2s84UA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=yoctocell.xyz header.s=mail header.b=rDbsDfLh; dmarc=fail reason="SPF not aligned (relaxed)" header.from=yoctocell.xyz (policy=none); spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: -4.13 Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=yoctocell.xyz header.s=mail header.b=rDbsDfLh; dmarc=fail reason="SPF not aligned (relaxed)" header.from=yoctocell.xyz (policy=none); spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: 91196A79A X-Spam-Score: -4.13 X-Migadu-Scanner: scn1.migadu.com X-TUID: 1XptRpHYBdjn --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Julien schrieb am Sonntag der 06. Februar 2022 um 22:41 +01: > Hi Guix! > > This patch lets you import opam packages from a local file. This is a > feature that was requested a few times, and there it is :) > > Now, if you have an OCaml package sources that provides an opam file > (usually called opam, or with the .opam extension), you can import the > package, recursively or not with something like: > > guix import opam foo -f foo.opam -r > > instead of fetching foo from the repositories, it will fetch the data > directly from the given file. WDYT? Why just limit it to local files? What about accepting a tarball on the internet or any VCS repository? This could generally be useful for any importer. Also, since we already know the name of the package, maybe specifying the directory that contains the OCaml project would be enough? guix import opam foo --type=3Dlocal /path/to/directory guix import opam foo --type=3Dtarball https://example.org/foo.tar.gz guix import opam foo --type=3Dgit https://git.example.org/foo =E2=80=A6 Or am I asking for too much? :-) > From b027391357eef4d6fa1bb8741528cf9650aef568 Mon Sep 17 00:00:00 2001 > Message-Id: > From: Julien Lepiller > Date: Sun, 6 Feb 2022 22:35:14 +0100 > Subject: [PATCH] guix: opam: Allow importing local files. It should be =E2=80=9Cimport: opam: =E2=80=A6=E2=80=9D. > * guix/scripts/import/opam.scm (guix-import-opam): Support `--file` flag. > * guix/import/utils.scm (recursive-import): Add optional file argument. > Pass it to the first iteration when available. > * guix/import/opam.scm (opam-fetch): Fetch from file when available. > (opam->guix-source): Factorize source out of opam->guix-package. > (opam->guix-package): Add file argument. Ensure it does not fail when > name, version and url are not available. > --- > guix/import/opam.scm | 101 +++++++++++++++++++---------------- > guix/import/utils.scm | 17 +++--- > guix/scripts/import/opam.scm | 11 +++- > 3 files changed, 75 insertions(+), 54 deletions(-) > > diff --git a/guix/import/opam.scm b/guix/import/opam.scm > index a6f6fe8c9f..05f79110f8 100644 > --- a/guix/import/opam.scm > +++ b/guix/import/opam.scm > @@ -310,8 +310,11 @@ (define (dependency-list->inputs lst) > (map string->symbol > (ocaml-names->guix-names lst))) >=20=20 > -(define* (opam-fetch name #:optional (repositories-specs '("opam"))) > - (or (fold (lambda (repository others) > +(define* (opam-fetch name #:optional (repositories-specs '("opam")) (fil= e #f)) > + (or (and file (let ((metadata (get-metadata file))) > + `(("metadata" . ,metadata) > + ("version" . #f)))) > + (fold (lambda (repository others) > (match (find-latest-version name repository) > ((_ version file) `(("metadata" ,@(get-metadata file)) > ("version" . ,version))) > @@ -320,17 +323,29 @@ (define* (opam-fetch name #:optional (repositories-= specs '("opam"))) > (filter-map get-opam-repository repositories-specs)) > (warning (G_ "opam: package '~a' not found~%") name))) >=20=20 > -(define* (opam->guix-package name #:key (repo 'opam) version) > +(define (opam->guix-source url-dict) > + (let ((source-url (and url-dict > + (or (metadata-ref url-dict "src") > + (metadata-ref url-dict "archive"))))) > + (if source-url > + (call-with-temporary-output-file > + (lambda (temp port) > + (and (url-fetch source-url temp) > + `(origin > + (method url-fetch) > + (uri ,source-url) > + (sha256 (base32 ,(guix-hash-url temp))))))) > + 'no-source-information))) I would use =E2=80=98and-let*=E2=80=99 instead of =E2=80=98let=E2=80=99, an= d drop the =E2=80=98if=E2=80=99 form. The ability to import from a local file seems to mostly be useful when the package isn=E2=80=99t meant to be submitted to Guix, right? Wouldn=E2= =80=99t it make more sense to make the source a =E2=80=98local-file=E2=80=99 object in= stead of just setting it to #f? > +(define* (opam->guix-package name #:key (repo '("opam")) (file #f) versi= on) > "Import OPAM package NAME from REPOSITORY (a directory name) or, if > -REPOSITORY is #f, from the official OPAM repository. Return a 'package'= sexp > +REPOSITORY is #f, from the official OPAM repository. When FILE is defin= ed, > +import the packaged defined in the opam FILE instead. Return a 'package= ' sexp s/packaged/package/ > (and-let* ((with-opam (if (member "opam" repo) repo (cons "opam" repo)= )) > - (opam-file (opam-fetch name with-opam)) > - (version (assoc-ref opam-file "version")) > + (opam-file (opam-fetch name with-opam file)) > (opam-content (assoc-ref opam-file "metadata")) > - (url-dict (metadata-ref opam-content "url")) > - (source-url (or (metadata-ref url-dict "src") > - (metadata-ref url-dict "archive"))) > + (source (opam->guix-source (metadata-ref opam-content "url"= ))) > (requirements (metadata-ref opam-content "depends")) > (names (dependency-list->names requirements)) > (dependencies (filter-dependencies names)) > @@ -344,47 +359,41 @@ (define* (opam->guix-package name #:key (repo 'opam= ) version) > (not (member name '("dune" "jbuilder")= ))) > native-dependencies)))) > (let ((use-dune? (member "dune" names))) > - (call-with-temporary-output-file > - (lambda (temp port) > - (and (url-fetch source-url temp) > - (values > - `(package > - (name ,(ocaml-name->guix-name name)) > - (version ,version) > - (source > - (origin > - (method url-fetch) > - (uri ,source-url) > - (sha256 (base32 ,(guix-hash-url temp))))) > - (build-system ,(if use-dune? > - 'dune-build-system > - 'ocaml-build-system)) > - ,@(if (null? inputs) > - '() > - `((propagated-inputs (list ,@inputs)))) > - ,@(if (null? native-inputs) > - '() > - `((native-inputs (list ,@native-inputs)))) > - ,@(if (equal? name (guix-name->opam-name (ocaml-n= ame->guix-name name))) > - '() > - `((properties > - ,(list 'quasiquote `((upstream-name . ,na= me)))))) > - (home-page ,(metadata-ref opam-content "homepage"= )) > - (synopsis ,(metadata-ref opam-content "synopsis")) > - (description ,(beautify-description > - (metadata-ref opam-content "descri= ption"))) > - (license ,(spdx-string->license > - (metadata-ref opam-content "license"))= )) > - (filter > - (lambda (name) > - (not (member name '("dune" "jbuilder")))) > - dependencies)))))))) > + (values > + `(package > + (name ,(and name (ocaml-name->guix-name name))) > + (version ,(assoc-ref opam-file "version")) > + (source ,source) > + (build-system ,(if use-dune? > + 'dune-build-system > + 'ocaml-build-system)) > + ,@(if (null? inputs) > + '() > + `((propagated-inputs (list ,@inputs)))) > + ,@(if (null? native-inputs) > + '() > + `((native-inputs (list ,@native-inputs)))) > + ,@(if (and name (equal? name (guix-name->opam-name (ocaml-= name->guix-name name)))) > + '() > + `((properties > + ,(list 'quasiquote `((upstream-name . ,name)))))) > + (home-page ,(metadata-ref opam-content "homepage")) > + (synopsis ,(metadata-ref opam-content "synopsis")) > + (description ,(beautify-description > + (metadata-ref opam-content "description"))) > + (license ,(spdx-string->license > + (metadata-ref opam-content "license")))) > + (filter > + (lambda (name) > + (not (member name '("dune" "jbuilder")))) > + dependencies))))) >=20=20 > -(define* (opam-recursive-import package-name #:key repo) > +(define* (opam-recursive-import package-name #:key repo file) > (recursive-import package-name > #:repo->guix-package opam->guix-package > #:guix-name ocaml-name->guix-name > - #:repo repo)) > + #:repo repo > + #:file file)) >=20=20 > (define (guix-name->opam-name name) > (if (string-prefix? "ocaml-" name) > diff --git a/guix/import/utils.scm b/guix/import/utils.scm > index 1c3cfa3e0b..ab35b8a4fc 100644 > --- a/guix/import/utils.scm > +++ b/guix/import/utils.scm > @@ -470,7 +470,7 @@ (define (topological-sort nodes > (set-insert (node-name head) visited)))))))) >=20=20 > (define* (recursive-import package-name > - #:key repo->guix-package guix-name version re= po > + #:key repo->guix-package guix-name version re= po file > #:allow-other-keys) > "Return a list of package expressions for PACKAGE-NAME and all its > dependencies, sorted in topological order. For each package, The docstrings should also be updated. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQJJBAEBCAAzFiEEAVhh4yyK5+SEykIzrPUJmaL7XHkFAmIA1/sVHHB1YmxpY0B5 b2N0b2NlbGwueHl6AAoJEKz1CZmi+1x5i1oP/1TZbQVKhanj9SBwv1P4b1Fp6/0e PQAVN2Koms7eSLsSmApR3Fw6k5HBPWMbBlwcY7UaRBg1eZai0Nbzc7IfEWG3WDNO XjRTT5DNK3ek74Ibq5LZVv9HLyLg59/E3fjr91JVKHesdDCTvSJOz3Zi+u2FXd/7 TWfJfeZIP/L8Y5L819IKyKcnH6oQYocSgnhXUPrbVATWvvd6wk6a7clOZN30pPmK rwruQyfSwe12gCIxYx9bDELeRLTUz7tVw7Lm0MA5xDnBy+RwS4xv0WLOobO+vL8K qCTWloJL3hKRYSu56P24tALQgdfBRAzrXRIKi4dHeMVhRr9AwYLo6DOcNDm9Q6M3 g4KF9l8fqUwuiRCzeKj3V9gs6db76LhsugJPfxCBeaVNg3rX6oo09Q/mKENrR4a2 A/cso8cR7wgViwtD9vUqN9W/YQCuKHFnT8lwb7lRi93TOn59r7Q+Mr7dS8ZgPmL2 ZA2r3+OcVyMLioyPxhQ2OPfHiayY1zAmJl7M5C/pJ0xYy3aZdWqMrbHDePCvNy3K uYTvUSQPWLox37kMAXqAWgN+ElQnQb/d7U72erGlgF3imh1JQTcH4boWgJSVSvZN 6IOEcqG+Vm4iJkKWoJafS8rmyS8FP19sZCQ4TYf6oPFCApw3cHpYlYHfnELNu4J7 mbsgpexm6KbIwJhC =1m+M -----END PGP SIGNATURE----- --=-=-=--