Message ID | b6fc67c8-d529-8f95-a36f-407a0216f8b3@riseup.net |
---|---|
State | Accepted |
Headers | show |
Series | None | expand |
Context | Check | Description |
---|---|---|
cbaines/comparison | success | View comparision |
cbaines/git branch | success | View Git branch |
cbaines/applying patch | fail | View Laminar job |
Hi Martin & all, I apologize for taking so long and dropping the ball. Partly that’s because this is non-trivial, thanks for working on it, Martin! Some quick comments: Martin Becze <mjbecze@riseup.net> skribis: > From 494f7c874781f64b702e31841c95c95c68fb28fc Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Fri, 21 Feb 2020 10:41:44 -0500 > Subject: [PATCH v12 8/8] guix: self: Adds guile-semver as a depenedency. > > * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. Good. > From 492db2aed32bb68e50eb43660d5ec3811fdb9a80 Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Sun, 23 Feb 2020 04:27:42 -0500 > Subject: [PATCH v12 7/8] gnu: Add guile3.0-semver. > > * gnu/packages/guile-xyz.scm (guile3.0-semver): New variable. Applied. > From 2561fbf64e7ea47a0436b3751cbeea0032f8a77b Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Mon, 3 Feb 2020 16:19:49 -0500 > Subject: [PATCH v12 6/8] import: crate: Parametrized importing of dev > dependencies. > > This changes the behavoir of the recusive crate importer so that it will > include importing of development dependencies for the top level package > but will not inculded the development dependencies for any other imported > package. > > * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. > (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. > (crate-recursive-import): Likewise. > * guix/scripts/import/crate.scm (guix-import-crate): Likewise. > * tests/crate.scm (cargo-recursive-import): Likewise. LGTM. > From cb69a7c4844c68f89b783a1026751ab945fcab5d Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Thu, 30 Jan 2020 11:19:13 -0500 > Subject: [PATCH v12 5/8] import: utils: Trim patch version from names. > > This remove the the patch version from input names. For example > 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' > > * guix/import/utils.scm (package->definition): Trim patch version from > generated package names. > * tests/crate.scm: (cargo>guix-package): Likewise. > (cargo-recursive-import): Likewise. LGTM. > From 3f2dbc2a47a2e5e46871fbdeabe951f55d26b557 Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Thu, 30 Jan 2020 11:17:00 -0500 > Subject: [PATCH v12 4/8] import: crate: Memorize crate->guix-package. > > This adds memorization to procedures that involve network lookups. > 'mem-lookup-crate; is used on every dependency of a package to find > it's versions. 'mem-crate->guix-package; is needed becuase > 'topological-sort' depduplicates after dependencies have been turned > into packages. > > * guix/import/crate.scm (mem-crate->guix-package): New procedure. > (mem-lookup-crate): New procedure. This should also mention changes to ‘crate-recursive-import’. Regarding identifiers, please avoid abbreviations (info "(guix) Formatting Code"). > +(define mem-lookup-crate (memoize lookup-crate)) > + > (define (crate-version-dependencies version) > "Return the list of <crate-dependency> records of VERSION, a > <crate-version>." > @@ -216,7 +219,7 @@ latest version of CRATE-NAME." > (eq? (crate-dependency-kind dependency) 'normal))) > > (define crate > - (lookup-crate crate-name)) > + (mem-lookup-crate crate-name)) I’d suggest calling ‘mem-lookup-crate’ ‘lookup-crate*’ for instance. Can we also make its definition local to ‘crate-version-dependencies’ or would that defeat your caching goals? > (define version-number > (or version > @@ -238,7 +241,7 @@ latest version of CRATE-NAME." > containing pairs of (name version)" > (sort (map (lambda (dep) > (let* ((name (crate-dependency-id dep)) > - (crate (lookup-crate name)) > + (crate (mem-lookup-crate name)) > (req (crate-dependency-requirement dep)) > (ver (find-version crate req))) > (list name > @@ -265,9 +268,11 @@ latest version of CRATE-NAME." > string->license)) > cargo-inputs)))) > > +(define mem-crate->guix-package (memoize crate->guix-package)) > + > (define* (crate-recursive-import crate-name #:key version) > (recursive-import crate-name > - #:repo->guix-package crate->guix-package > + #:repo->guix-package mem-crate->guix-package Please make ‘mem-crate->guix-package’ local to ‘crate-recursive-import’ and call it ‘crate->guix-package*’ for instance. (Memoization should always be used as a last resort: it’s a neat hack, but it’s a hack. :-) In particular, it has the problem that its cache cannot be easily invalidated. That said, I realize that other importers do this already, so that’s OK.) > From 81056961d065e197fe8f1f2096c858776debf485 Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Thu, 30 Jan 2020 10:52:28 -0500 > Subject: [PATCH v12 3/8] import: crate: Deduplicate dependencies. > > * guix/import/crate.scm (crate-version-dependencies): Deduplicate crate dependencies. Applied. > From 98129432b4d746fd2a12a005ebe2d36e8ee0f600 Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Tue, 4 Feb 2020 03:50:48 -0500 > Subject: [PATCH v12 2/8] import: crate: Use guile-semver to resovle module ^^ Typo. :-) > * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build > system args. Pass a VERSION argument to 'cargo-inputs'. Move > 'package-definition' from scripts/import/crate.scm to here. > (crate->guix-package): Use guile-semver to resolve the correct module versions. > (crate-name->package-name): Reuse the procedure 'guix-name' instead of > duplicating its logic. > (module) Added guile-semver as a soft dependency. > * guix/import/utils.scm (package-names->package-inputs): Implemented > handling of (name version) pairs. > * guix/scripts/import/crate.scm (guix-import-crate): Move > 'package-definition' from here to guix/import/crate.scm. > * tests/crate.scm: (recursuve-import) Added version data to the test. [...] > + (define (format-inputs inputs) > + (map > + (match-lambda > + ((name version) (list (crate-name->package-name name) > + (version-major+minor version)))) > + inputs)) Nitpick: please format as: (map (match-lambda ((name version) (list …))) inputs) > +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) Please avoid #:allow-other-keys. In general, it’s best to know exactly what parameters a procedure expects and to benefit from compile-time warnings when we make a mistake; thus, #:allow-other-keys should only be used as a last resort. > + (define (find-version crate range) > + "finds the a vesion of a crate that fulfils the semver <range>" ^ ^ Typos. For inner procedures, please write a comment instead of a docstring. > From 356bf29011097367a6e95dd45e71050db8bfa8e4 Mon Sep 17 00:00:00 2001 > From: Martin Becze <mjbecze@riseup.net> > Date: Tue, 4 Feb 2020 07:18:18 -0500 > Subject: [PATCH v12 1/8] import: utils: 'recursive-import' accepts an optional > version parameter. > > This adds a key VERSION to 'recursive-import' and move the paramter REPO to a > key. This also changes all the things that rely on 'recursive-import' > > * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a > key. > (package->definition): Added optional 'append-version?'. > * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. > (cran-recursive-import): Likewise. > * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. > (elpa-recursive-import): Likewise. > * guix/import/gem.scm (gem->guix-package): Likewise. > (recursive-import): Likewise. > * guix/import/opam.scm (opam-recurive-import): Likewise. > * guix/import/pypi.scm (pypi-recursive-import): Likewise. > * guix/import/stackage.scm (stackage-recursive-import): Likewise. > * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. > * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. > * tests/elpa.scm: (eval-test-with-elpa) Likewise. > * tests/import-utils.scm Likewise. [...] > (define cran->guix-package > (memoize > - (lambda* (package-name #:optional (repo 'cran)) > + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) I would change #:allow-other-keys to just ‘version’ (a #:version parameter) in all the importers. It does mean that #:version would be ignored by those importers, so perhaps we can add a TODO comment, but eventually someone might implement it. If you want you can resubmit patches #1 and #2 to begin with. Thank you! Ludo’.
Thanks for the feedback Ludo! I will try to get this done today. On 3/24/20 6:18 AM, Ludovic Courtès wrote: > Hi Martin & all, > > I apologize for taking so long and dropping the ball. Partly that’s > because this is non-trivial, thanks for working on it, Martin! > > Some quick comments: > > Martin Becze <mjbecze@riseup.net> skribis: > >> From 494f7c874781f64b702e31841c95c95c68fb28fc Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Fri, 21 Feb 2020 10:41:44 -0500 >> Subject: [PATCH v12 8/8] guix: self: Adds guile-semver as a depenedency. >> >> * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. > > Good. > >> From 492db2aed32bb68e50eb43660d5ec3811fdb9a80 Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Sun, 23 Feb 2020 04:27:42 -0500 >> Subject: [PATCH v12 7/8] gnu: Add guile3.0-semver. >> >> * gnu/packages/guile-xyz.scm (guile3.0-semver): New variable. > > Applied. > >> From 2561fbf64e7ea47a0436b3751cbeea0032f8a77b Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Mon, 3 Feb 2020 16:19:49 -0500 >> Subject: [PATCH v12 6/8] import: crate: Parametrized importing of dev >> dependencies. >> >> This changes the behavoir of the recusive crate importer so that it will >> include importing of development dependencies for the top level package >> but will not inculded the development dependencies for any other imported >> package. >> >> * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. >> (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. >> (crate-recursive-import): Likewise. >> * guix/scripts/import/crate.scm (guix-import-crate): Likewise. >> * tests/crate.scm (cargo-recursive-import): Likewise. > > LGTM. > >> From cb69a7c4844c68f89b783a1026751ab945fcab5d Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Thu, 30 Jan 2020 11:19:13 -0500 >> Subject: [PATCH v12 5/8] import: utils: Trim patch version from names. >> >> This remove the the patch version from input names. For example >> 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' >> >> * guix/import/utils.scm (package->definition): Trim patch version from >> generated package names. >> * tests/crate.scm: (cargo>guix-package): Likewise. >> (cargo-recursive-import): Likewise. > > LGTM. > >> From 3f2dbc2a47a2e5e46871fbdeabe951f55d26b557 Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Thu, 30 Jan 2020 11:17:00 -0500 >> Subject: [PATCH v12 4/8] import: crate: Memorize crate->guix-package. >> >> This adds memorization to procedures that involve network lookups. >> 'mem-lookup-crate; is used on every dependency of a package to find >> it's versions. 'mem-crate->guix-package; is needed becuase >> 'topological-sort' depduplicates after dependencies have been turned >> into packages. >> >> * guix/import/crate.scm (mem-crate->guix-package): New procedure. >> (mem-lookup-crate): New procedure. > > This should also mention changes to ‘crate-recursive-import’. > > Regarding identifiers, please avoid abbreviations (info "(guix) > Formatting Code"). > >> +(define mem-lookup-crate (memoize lookup-crate)) >> + >> (define (crate-version-dependencies version) >> "Return the list of <crate-dependency> records of VERSION, a >> <crate-version>." >> @@ -216,7 +219,7 @@ latest version of CRATE-NAME." >> (eq? (crate-dependency-kind dependency) 'normal))) >> >> (define crate >> - (lookup-crate crate-name)) >> + (mem-lookup-crate crate-name)) > > I’d suggest calling ‘mem-lookup-crate’ ‘lookup-crate*’ for instance. > Can we also make its definition local to ‘crate-version-dependencies’ or > would that defeat your caching goals? > >> (define version-number >> (or version >> @@ -238,7 +241,7 @@ latest version of CRATE-NAME." >> containing pairs of (name version)" >> (sort (map (lambda (dep) >> (let* ((name (crate-dependency-id dep)) >> - (crate (lookup-crate name)) >> + (crate (mem-lookup-crate name)) >> (req (crate-dependency-requirement dep)) >> (ver (find-version crate req))) >> (list name >> @@ -265,9 +268,11 @@ latest version of CRATE-NAME." >> string->license)) >> cargo-inputs)))) >> >> +(define mem-crate->guix-package (memoize crate->guix-package)) >> + >> (define* (crate-recursive-import crate-name #:key version) >> (recursive-import crate-name >> - #:repo->guix-package crate->guix-package >> + #:repo->guix-package mem-crate->guix-package > > Please make ‘mem-crate->guix-package’ local to ‘crate-recursive-import’ > and call it ‘crate->guix-package*’ for instance. > > (Memoization should always be used as a last resort: it’s a neat hack, > but it’s a hack. :-) In particular, it has the problem that its cache > cannot be easily invalidated. That said, I realize that other importers > do this already, so that’s OK.) > >> From 81056961d065e197fe8f1f2096c858776debf485 Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Thu, 30 Jan 2020 10:52:28 -0500 >> Subject: [PATCH v12 3/8] import: crate: Deduplicate dependencies. >> >> * guix/import/crate.scm (crate-version-dependencies): Deduplicate crate dependencies. > > Applied. > >> From 98129432b4d746fd2a12a005ebe2d36e8ee0f600 Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Tue, 4 Feb 2020 03:50:48 -0500 >> Subject: [PATCH v12 2/8] import: crate: Use guile-semver to resovle module > ^^ > Typo. :-) > > >> * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build >> system args. Pass a VERSION argument to 'cargo-inputs'. Move >> 'package-definition' from scripts/import/crate.scm to here. >> (crate->guix-package): Use guile-semver to resolve the correct module versions. >> (crate-name->package-name): Reuse the procedure 'guix-name' instead of >> duplicating its logic. >> (module) Added guile-semver as a soft dependency. >> * guix/import/utils.scm (package-names->package-inputs): Implemented >> handling of (name version) pairs. >> * guix/scripts/import/crate.scm (guix-import-crate): Move >> 'package-definition' from here to guix/import/crate.scm. >> * tests/crate.scm: (recursuve-import) Added version data to the test. > > [...] > >> + (define (format-inputs inputs) >> + (map >> + (match-lambda >> + ((name version) (list (crate-name->package-name name) >> + (version-major+minor version)))) >> + inputs)) > > Nitpick: please format as: > > (map (match-lambda > ((name version) > (list …))) > inputs) > >> +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) > > Please avoid #:allow-other-keys. In general, it’s best to know exactly > what parameters a procedure expects and to benefit from compile-time > warnings when we make a mistake; thus, #:allow-other-keys should only be > used as a last resort. > >> + (define (find-version crate range) >> + "finds the a vesion of a crate that fulfils the semver <range>" > ^ ^ > Typos. > For inner procedures, please write a comment instead of a docstring. > >> From 356bf29011097367a6e95dd45e71050db8bfa8e4 Mon Sep 17 00:00:00 2001 >> From: Martin Becze <mjbecze@riseup.net> >> Date: Tue, 4 Feb 2020 07:18:18 -0500 >> Subject: [PATCH v12 1/8] import: utils: 'recursive-import' accepts an optional >> version parameter. >> >> This adds a key VERSION to 'recursive-import' and move the paramter REPO to a >> key. This also changes all the things that rely on 'recursive-import' >> >> * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a >> key. >> (package->definition): Added optional 'append-version?'. >> * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. >> (cran-recursive-import): Likewise. >> * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. >> (elpa-recursive-import): Likewise. >> * guix/import/gem.scm (gem->guix-package): Likewise. >> (recursive-import): Likewise. >> * guix/import/opam.scm (opam-recurive-import): Likewise. >> * guix/import/pypi.scm (pypi-recursive-import): Likewise. >> * guix/import/stackage.scm (stackage-recursive-import): Likewise. >> * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. >> * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. >> * tests/elpa.scm: (eval-test-with-elpa) Likewise. >> * tests/import-utils.scm Likewise. > > [...] > >> (define cran->guix-package >> (memoize >> - (lambda* (package-name #:optional (repo 'cran)) >> + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) > > I would change #:allow-other-keys to just ‘version’ (a #:version > parameter) in all the importers. > > It does mean that #:version would be ignored by those importers, so > perhaps we can add a TODO comment, but eventually someone might > implement it. > > If you want you can resubmit patches #1 and #2 to begin with. > > Thank you! > > Ludo’. >
From 356bf29011097367a6e95dd45e71050db8bfa8e4 Mon Sep 17 00:00:00 2001 From: Martin Becze <mjbecze@riseup.net> Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v12 1/8] import: utils: 'recursive-import' accepts an optional version parameter. This adds a key VERSION to 'recursive-import' and move the paramter REPO to a key. This also changes all the things that rely on 'recursive-import' * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Added optional 'append-version?'. * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package): Likewise. (recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. * tests/elpa.scm: (eval-test-with-elpa) Likewise. * tests/import-utils.scm Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 5 +-- guix/import/pypi.scm | 5 +-- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 72 insertions(+), 42 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bb8226f714..2cef1f4d4a 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -511,7 +512,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -526,8 +527,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type '<elpa-package>'." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type '<elpa-package>'." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..345d6f003c 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com> ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com> ;;; Copyright © 2020 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index ae7df8a8b5..5e09220386 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller <julien@lepiller.eu> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index f93fa8831f..46012cb135 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> ;;; Copyright © 2020 Lars-Dominik Braun <ldb@leibniz-psychology.org> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -492,8 +493,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 94c8cb040b..cd92cf7dd8 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com> ;;; Copyright © 2019 Robert Vollmert <rob@vllmrt.net> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -391,32 +395,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type <node> - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2020 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com> +;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.1