diff options
| author | David Elsing <david.elsing@posteo.net> | 2023-12-21 22:01:50 +0000 |
|---|---|---|
| committer | Efraim Flashner <efraim@flashner.co.il> | 2024-01-09 09:38:38 +0200 |
| commit | 9f44ff2bb47c964d53905cea17c4bda758cce509 (patch) | |
| tree | f902e562dc7fedb465d4cc3fec710664921450dd | |
| parent | 4b0aa65c0a9301a70c798ea76a493f67ef8371f4 (diff) | |
import: crate: Optionally import dev-dependencies recursively.
If --recursive-dev-dependencies is specified, development dependencies
are also included for all recursively imported packages.
* doc/guix.texi (Invoking guix import): Mention --recursive-dev-dependencies.
* guix/import/crate.scm (crate-recursive-import): Add
recursive-dev-dependencies? argument.
* guix/scripts/import/crate.scm (show-help, guix-import-crate): Add
"--recursive-dev-dependencies".
* tests/crate.scm: Test both #f and #t for #:recursive-dev-dependencies?
in the 'cargo-recursive-import' test.
(test-root-dependencies): Add intermediate-c as dev-dependency.
(test-intermediate-c-crate, test-intermediate-c-dependencies): New
variables.
Signed-off-by: Efraim Flashner <efraim@flashner.co.il>
Change-Id: Iae89794681155d77f128733120e60f03bc297717
| -rw-r--r-- | doc/guix.texi | 4 | ||||
| -rw-r--r-- | guix/import/crate.scm | 7 | ||||
| -rw-r--r-- | guix/scripts/import/crate.scm | 12 | ||||
| -rw-r--r-- | tests/crate.scm | 228 |
4 files changed, 244 insertions, 7 deletions
diff --git a/doc/guix.texi b/doc/guix.texi index 96035bd97c1..544f86a6ac6 100644 --- a/doc/guix.texi +++ b/doc/guix.texi | |||
| @@ -14585,6 +14585,10 @@ Additional options include: | |||
| 14585 | Traverse the dependency graph of the given upstream package recursively | 14585 | Traverse the dependency graph of the given upstream package recursively |
| 14586 | and generate package expressions for all those packages that are not yet | 14586 | and generate package expressions for all those packages that are not yet |
| 14587 | in Guix. | 14587 | in Guix. |
| 14588 | @item --recursive-dev-dependencies | ||
| 14589 | If @option{--recursive-dev-dependencies} is specified, also the recursively | ||
| 14590 | imported packages contain their development dependencies, which are recursively | ||
| 14591 | imported as well. | ||
| 14588 | @end table | 14592 | @end table |
| 14589 | 14593 | ||
| 14590 | @item elm | 14594 | @item elm |
diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 07874bdb268..db5461312f4 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm | |||
| @@ -328,14 +328,17 @@ look up the development dependencs for the given crate." | |||
| 328 | (append cargo-inputs cargo-development-inputs))) | 328 | (append cargo-inputs cargo-development-inputs))) |
| 329 | (values #f '()))) | 329 | (values #f '()))) |
| 330 | 330 | ||
| 331 | (define* (crate-recursive-import crate-name #:key version) | 331 | (define* (crate-recursive-import |
| 332 | crate-name #:key version recursive-dev-dependencies?) | ||
| 332 | (recursive-import | 333 | (recursive-import |
| 333 | crate-name | 334 | crate-name |
| 334 | #:repo->guix-package | 335 | #:repo->guix-package |
| 335 | (let ((crate->guix-package* (memoize crate->guix-package))) | 336 | (let ((crate->guix-package* (memoize crate->guix-package))) |
| 336 | (lambda* params | 337 | (lambda* params |
| 337 | ;; download development dependencies only for the top level package | 338 | ;; download development dependencies only for the top level package |
| 338 | (let ((include-dev-deps? (equal? (car params) crate-name))) | 339 | (let ((include-dev-deps? |
| 340 | (or (equal? (car params) crate-name) | ||
| 341 | recursive-dev-dependencies?))) | ||
| 339 | (apply crate->guix-package* | 342 | (apply crate->guix-package* |
| 340 | (append params `(#:include-dev-deps? ,include-dev-deps?)))))) | 343 | (append params `(#:include-dev-deps? ,include-dev-deps?)))))) |
| 341 | #:version version | 344 | #:version version |
diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 038faa87db2..b13b6636a6a 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | ;;; Copyright © 2019, 2020 Martin Becze <mjbecze@riseup.net> | 5 | ;;; Copyright © 2019, 2020 Martin Becze <mjbecze@riseup.net> |
| 6 | ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev> | 6 | ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev> |
| 7 | ;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com> | 7 | ;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com> |
| 8 | ;;; Copyright © 2023 David Elsing <david.elsing@posteo.net> | ||
| 8 | ;;; | 9 | ;;; |
| 9 | ;;; This file is part of GNU Guix. | 10 | ;;; This file is part of GNU Guix. |
| 10 | ;;; | 11 | ;;; |
| @@ -47,6 +48,9 @@ | |||
| 47 | Import and convert the crates.io package for PACKAGE-NAME.\n")) | 48 | Import and convert the crates.io package for PACKAGE-NAME.\n")) |
| 48 | (display (G_ " | 49 | (display (G_ " |
| 49 | -r, --recursive import packages recursively")) | 50 | -r, --recursive import packages recursively")) |
| 51 | (display (G_ " | ||
| 52 | --recursive-dev-dependencies | ||
| 53 | include dev-dependencies recursively")) | ||
| 50 | (newline) | 54 | (newline) |
| 51 | (display (G_ " | 55 | (display (G_ " |
| 52 | -h, --help display this help and exit")) | 56 | -h, --help display this help and exit")) |
| @@ -67,6 +71,9 @@ Import and convert the crates.io package for PACKAGE-NAME.\n")) | |||
| 67 | (option '(#\r "recursive") #f #f | 71 | (option '(#\r "recursive") #f #f |
| 68 | (lambda (opt name arg result) | 72 | (lambda (opt name arg result) |
| 69 | (alist-cons 'recursive #t result))) | 73 | (alist-cons 'recursive #t result))) |
| 74 | (option '("recursive-dev-dependencies") #f #f | ||
| 75 | (lambda (opt name arg result) | ||
| 76 | (alist-cons 'recursive-dev-dependencies #t result))) | ||
| 70 | %standard-import-options)) | 77 | %standard-import-options)) |
| 71 | 78 | ||
| 72 | 79 | ||
| @@ -92,7 +99,10 @@ Import and convert the crates.io package for PACKAGE-NAME.\n")) | |||
| 92 | (package-name->name+version spec)) | 99 | (package-name->name+version spec)) |
| 93 | 100 | ||
| 94 | (match (if (assoc-ref opts 'recursive) | 101 | (match (if (assoc-ref opts 'recursive) |
| 95 | (crate-recursive-import name #:version version) | 102 | (crate-recursive-import |
| 103 | name #:version version | ||
| 104 | #:recursive-dev-dependencies? | ||
| 105 | (assoc-ref opts 'recursive-dev-dependencies)) | ||
| 96 | (crate->guix-package name #:version version #:include-dev-deps? #t)) | 106 | (crate->guix-package name #:version version #:include-dev-deps? #t)) |
| 97 | ((or #f '()) | 107 | ((or #f '()) |
| 98 | (leave (G_ "failed to download meta-data for package '~a'~%") | 108 | (leave (G_ "failed to download meta-data for package '~a'~%") |
diff --git a/tests/crate.scm b/tests/crate.scm index 5aea5efaf3e..1b9ad88358a 100644 --- a/tests/crate.scm +++ b/tests/crate.scm | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | ;;; Copyright © 2019, 2020, 2022 Ludovic Courtès <ludo@gnu.org> | 4 | ;;; Copyright © 2019, 2020, 2022 Ludovic Courtès <ludo@gnu.org> |
| 5 | ;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> | 5 | ;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net> |
| 6 | ;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il> | 6 | ;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il> |
| 7 | ;;; Copyright © 2023 David Elsing <david.elsing@posteo.net> | ||
| 7 | ;;; | 8 | ;;; |
| 8 | ;;; This file is part of GNU Guix. | 9 | ;;; This file is part of GNU Guix. |
| 9 | ;;; | 10 | ;;; |
| @@ -40,10 +41,11 @@ | |||
| 40 | ;; | 41 | ;; |
| 41 | ;; root-1.0.0 | 42 | ;; root-1.0.0 |
| 42 | ;; root-1.0.4 | 43 | ;; root-1.0.4 |
| 43 | ;; intermediate-a 1.0.42 | 44 | ;; intermediate-a 1.0.42 |
| 44 | ;; intermeidate-b ^1.0.0 | 45 | ;; intermediate-b ^1.0.0 |
| 45 | ;; leaf-alice ^0.7 | 46 | ;; leaf-alice ^0.7 |
| 46 | ;; leaf-bob ^3 | 47 | ;; leaf-bob ^3 |
| 48 | ;; intermediate-c 1 (dev-dependency) | ||
| 47 | ;; | 49 | ;; |
| 48 | ;; intermediate-a-1.0.40 | 50 | ;; intermediate-a-1.0.40 |
| 49 | ;; intermediate-a-1.0.42 | 51 | ;; intermediate-a-1.0.42 |
| @@ -55,6 +57,9 @@ | |||
| 55 | ;; intermediate-b-1.2.3 | 57 | ;; intermediate-b-1.2.3 |
| 56 | ;; leaf-bob 3.0.1 | 58 | ;; leaf-bob 3.0.1 |
| 57 | ;; | 59 | ;; |
| 60 | ;; intermediate-c-1.0.1 | ||
| 61 | ;; leaf-alice 0.7.5 (dev-dependency) | ||
| 62 | ;; | ||
| 58 | ;; leaf-alice-0.7.3 | 63 | ;; leaf-alice-0.7.3 |
| 59 | ;; leaf-alice-0.7.5 | 64 | ;; leaf-alice-0.7.5 |
| 60 | ;; | 65 | ;; |
| @@ -164,6 +169,11 @@ | |||
| 164 | \"crate_id\": \"leaf-bob\", | 169 | \"crate_id\": \"leaf-bob\", |
| 165 | \"kind\": \"normal\", | 170 | \"kind\": \"normal\", |
| 166 | \"req\": \"^3\" | 171 | \"req\": \"^3\" |
| 172 | }, | ||
| 173 | { | ||
| 174 | \"crate_id\": \"intermediate-c\", | ||
| 175 | \"kind\": \"dev\", | ||
| 176 | \"req\": \"1\" | ||
| 167 | } | 177 | } |
| 168 | ] | 178 | ] |
| 169 | }") | 179 | }") |
| @@ -262,6 +272,40 @@ | |||
| 262 | ] | 272 | ] |
| 263 | }") | 273 | }") |
| 264 | 274 | ||
| 275 | (define test-intermediate-c-crate | ||
| 276 | "{ | ||
| 277 | \"crate\": { | ||
| 278 | \"max_version\": \"1.0.1\", | ||
| 279 | \"name\": \"intermediate-c\", | ||
| 280 | \"description\": \"summary\", | ||
| 281 | \"homepage\": \"http://example.com\", | ||
| 282 | \"repository\": \"http://example.com\", | ||
| 283 | \"keywords\": [\"dummy\", \"test\"], | ||
| 284 | \"categories\": [\"test\"], | ||
| 285 | \"actual_versions\": [ | ||
| 286 | { \"id\": 234290, | ||
| 287 | \"num\": \"1.0.1\", | ||
| 288 | \"license\": \"MIT OR Apache-2.0\", | ||
| 289 | \"links\": { | ||
| 290 | \"dependencies\": \"/api/v1/crates/intermediate-c/1.0.1/dependencies\" | ||
| 291 | }, | ||
| 292 | \"yanked\": false | ||
| 293 | } | ||
| 294 | ] | ||
| 295 | } | ||
| 296 | }") | ||
| 297 | |||
| 298 | (define test-intermediate-c-dependencies | ||
| 299 | "{ | ||
| 300 | \"dependencies\": [ | ||
| 301 | { | ||
| 302 | \"crate_id\": \"leaf-alice\", | ||
| 303 | \"kind\": \"dev\", | ||
| 304 | \"req\": \"0.7.5\" | ||
| 305 | } | ||
| 306 | ] | ||
| 307 | }") | ||
| 308 | |||
| 265 | (define test-leaf-alice-crate | 309 | (define test-leaf-alice-crate |
| 266 | "{ | 310 | "{ |
| 267 | \"crate\": { | 311 | \"crate\": { |
| @@ -430,6 +474,15 @@ | |||
| 430 | (open-input-string "empty file\n")) | 474 | (open-input-string "empty file\n")) |
| 431 | ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/dependencies" | 475 | ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/dependencies" |
| 432 | (open-input-string test-intermediate-b-dependencies)) | 476 | (open-input-string test-intermediate-b-dependencies)) |
| 477 | ("https://crates.io/api/v1/crates/intermediate-c" | ||
| 478 | (open-input-string test-intermediate-c-crate)) | ||
| 479 | ("https://crates.io/api/v1/crates/intermediate-c/1.0.1/download" | ||
| 480 | (set! test-source-hash | ||
| 481 | (bytevector->nix-base32-string | ||
| 482 | (sha256 (string->bytevector "empty file\n" "utf-8")))) | ||
| 483 | (open-input-string "empty file\n")) | ||
| 484 | ("https://crates.io/api/v1/crates/intermediate-c/1.0.1/dependencies" | ||
| 485 | (open-input-string test-intermediate-c-dependencies)) | ||
| 433 | ("https://crates.io/api/v1/crates/leaf-alice" | 486 | ("https://crates.io/api/v1/crates/leaf-alice" |
| 434 | (open-input-string test-leaf-alice-crate)) | 487 | (open-input-string test-leaf-alice-crate)) |
| 435 | ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download" | 488 | ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download" |
| @@ -452,7 +505,27 @@ | |||
| 452 | (match (crate-recursive-import "root") | 505 | (match (crate-recursive-import "root") |
| 453 | ;; rust-intermediate-b has no dependency on the rust-leaf-alice | 506 | ;; rust-intermediate-b has no dependency on the rust-leaf-alice |
| 454 | ;; package, so this is a valid ordering | 507 | ;; package, so this is a valid ordering |
| 455 | (((define-public 'rust-leaf-alice-0.7 | 508 | (((define-public 'rust-intermediate-c-1 |
| 509 | (package | ||
| 510 | (name "rust-intermediate-c") | ||
| 511 | (version "1.0.1") | ||
| 512 | (source | ||
| 513 | (origin | ||
| 514 | (method url-fetch) | ||
| 515 | (uri (crate-uri "intermediate-c" version)) | ||
| 516 | (file-name | ||
| 517 | (string-append name "-" version ".tar.gz")) | ||
| 518 | (sha256 | ||
| 519 | (base32 | ||
| 520 | (? string? hash))))) | ||
| 521 | (build-system cargo-build-system) | ||
| 522 | (arguments | ||
| 523 | ('quasiquote (#:skip-build? #t))) | ||
| 524 | (home-page "http://example.com") | ||
| 525 | (synopsis "summary") | ||
| 526 | (description "summary") | ||
| 527 | (license (list license:expat license:asl2.0)))) | ||
| 528 | (define-public 'rust-leaf-alice-0.7 | ||
| 456 | (package | 529 | (package |
| 457 | (name "rust-leaf-alice") | 530 | (name "rust-leaf-alice") |
| 458 | (version "0.7.5") | 531 | (version "0.7.5") |
| @@ -563,10 +636,157 @@ | |||
| 563 | ("rust-leaf-alice" | 636 | ("rust-leaf-alice" |
| 564 | ('unquote 'rust-leaf-alice-0.7)) | 637 | ('unquote 'rust-leaf-alice-0.7)) |
| 565 | ("rust-leaf-bob" | 638 | ("rust-leaf-bob" |
| 639 | ('unquote rust-leaf-bob-3))) | ||
| 640 | #:cargo-development-inputs | ||
| 641 | (("rust-intermediate-c" | ||
| 642 | ('unquote rust-intermediate-c-1)))))) | ||
| 643 | (home-page "http://example.com") | ||
| 644 | (synopsis "summary") | ||
| 645 | (description "summary") | ||
| 646 | (license (list license:expat license:asl2.0))))) | ||
| 647 | #t) | ||
| 648 | (x | ||
| 649 | (pk 'fail x #f))) | ||
| 650 | (match (crate-recursive-import "root" | ||
| 651 | #:recursive-dev-dependencies? #t) | ||
| 652 | ;; rust-intermediate-b has no dependency on the rust-leaf-alice | ||
| 653 | ;; package, so this is a valid ordering | ||
| 654 | (((define-public 'rust-intermediate-c-1 | ||
| 655 | (package | ||
| 656 | (name "rust-intermediate-c") | ||
| 657 | (version "1.0.1") | ||
| 658 | (source | ||
| 659 | (origin | ||
| 660 | (method url-fetch) | ||
| 661 | (uri (crate-uri "intermediate-c" version)) | ||
| 662 | (file-name | ||
| 663 | (string-append name "-" version ".tar.gz")) | ||
| 664 | (sha256 | ||
| 665 | (base32 | ||
| 666 | (? string? hash))))) | ||
| 667 | (build-system cargo-build-system) | ||
| 668 | (arguments | ||
| 669 | ('quasiquote (#:cargo-development-inputs | ||
| 670 | (("rust-leaf-alice" | ||
| 671 | ('unquote rust-leaf-alice-0.7)))))) | ||
| 672 | (home-page "http://example.com") | ||
| 673 | (synopsis "summary") | ||
| 674 | (description "summary") | ||
| 675 | (license (list license:expat license:asl2.0)))) | ||
| 676 | (define-public 'rust-leaf-alice-0.7 | ||
| 677 | (package | ||
| 678 | (name "rust-leaf-alice") | ||
| 679 | (version "0.7.5") | ||
| 680 | (source | ||
| 681 | (origin | ||
| 682 | (method url-fetch) | ||
| 683 | (uri (crate-uri "leaf-alice" version)) | ||
| 684 | (file-name | ||
| 685 | (string-append name "-" version ".tar.gz")) | ||
| 686 | (sha256 | ||
| 687 | (base32 | ||
| 688 | (? string? hash))))) | ||
| 689 | (build-system cargo-build-system) | ||
| 690 | (home-page "http://example.com") | ||
| 691 | (synopsis "summary") | ||
| 692 | (description "summary") | ||
| 693 | (license (list license:expat license:asl2.0)))) | ||
| 694 | (define-public 'rust-leaf-bob-3 | ||
| 695 | (package | ||
| 696 | (name "rust-leaf-bob") | ||
| 697 | (version "3.0.1") | ||
| 698 | (source | ||
| 699 | (origin | ||
| 700 | (method url-fetch) | ||
| 701 | (uri (crate-uri "leaf-bob" version)) | ||
| 702 | (file-name | ||
| 703 | (string-append name "-" version ".tar.gz")) | ||
| 704 | (sha256 | ||
| 705 | (base32 | ||
| 706 | (? string? hash))))) | ||
| 707 | (build-system cargo-build-system) | ||
| 708 | (home-page "http://example.com") | ||
| 709 | (synopsis "summary") | ||
| 710 | (description "summary") | ||
| 711 | (license (list license:expat license:asl2.0)))) | ||
| 712 | (define-public 'rust-intermediate-b-1 | ||
| 713 | (package | ||
| 714 | (name "rust-intermediate-b") | ||
| 715 | (version "1.2.3") | ||
| 716 | (source | ||
| 717 | (origin | ||
| 718 | (method url-fetch) | ||
| 719 | (uri (crate-uri "intermediate-b" version)) | ||
| 720 | (file-name | ||
| 721 | (string-append name "-" version ".tar.gz")) | ||
| 722 | (sha256 | ||
| 723 | (base32 | ||
| 724 | (? string? hash))))) | ||
| 725 | (build-system cargo-build-system) | ||
| 726 | (arguments | ||
| 727 | ('quasiquote (#:cargo-inputs | ||
| 728 | (("rust-leaf-bob" | ||
| 729 | ('unquote rust-leaf-bob-3)))))) | ||
| 730 | (home-page "http://example.com") | ||
| 731 | (synopsis "summary") | ||
| 732 | (description "summary") | ||
| 733 | (license (list license:expat license:asl2.0)))) | ||
| 734 | (define-public 'rust-intermediate-a-1 | ||
| 735 | (package | ||
| 736 | (name "rust-intermediate-a") | ||
| 737 | (version "1.0.42") | ||
| 738 | (source | ||
| 739 | (origin | ||
| 740 | (method url-fetch) | ||
| 741 | (uri (crate-uri "intermediate-a" version)) | ||
| 742 | (file-name | ||
| 743 | (string-append name "-" version ".tar.gz")) | ||
| 744 | (sha256 | ||
| 745 | (base32 | ||
| 746 | (? string? hash))))) | ||
| 747 | (build-system cargo-build-system) | ||
| 748 | (arguments | ||
| 749 | ('quasiquote (#:cargo-inputs | ||
| 750 | (("rust-intermediate-b" | ||
| 751 | ('unquote rust-intermediate-b-1)) | ||
| 752 | ("rust-leaf-alice" | ||
| 753 | ('unquote 'rust-leaf-alice-0.7)) | ||
| 754 | ("rust-leaf-bob" | ||
| 566 | ('unquote rust-leaf-bob-3)))))) | 755 | ('unquote rust-leaf-bob-3)))))) |
| 567 | (home-page "http://example.com") | 756 | (home-page "http://example.com") |
| 568 | (synopsis "summary") | 757 | (synopsis "summary") |
| 569 | (description "summary") | 758 | (description "summary") |
| 759 | (license (list license:expat license:asl2.0)))) | ||
| 760 | (define-public 'rust-root-1 | ||
| 761 | (package | ||
| 762 | (name "rust-root") | ||
| 763 | (version "1.0.4") | ||
| 764 | (source | ||
| 765 | (origin | ||
| 766 | (method url-fetch) | ||
| 767 | (uri (crate-uri "root" version)) | ||
| 768 | (file-name | ||
| 769 | (string-append name "-" version ".tar.gz")) | ||
| 770 | (sha256 | ||
| 771 | (base32 | ||
| 772 | (? string? hash))))) | ||
| 773 | (build-system cargo-build-system) | ||
| 774 | (arguments | ||
| 775 | ('quasiquote (#:cargo-inputs | ||
| 776 | (("rust-intermediate-a" | ||
| 777 | ('unquote rust-intermediate-a-1)) | ||
| 778 | ("rust-intermediate-b" | ||
| 779 | ('unquote rust-intermediate-b-1)) | ||
| 780 | ("rust-leaf-alice" | ||
| 781 | ('unquote 'rust-leaf-alice-0.7)) | ||
| 782 | ("rust-leaf-bob" | ||
| 783 | ('unquote rust-leaf-bob-3))) | ||
| 784 | #:cargo-development-inputs | ||
| 785 | (("rust-intermediate-c" | ||
| 786 | ('unquote rust-intermediate-c-1)))))) | ||
| 787 | (home-page "http://example.com") | ||
| 788 | (synopsis "summary") | ||
| 789 | (description "summary") | ||
| 570 | (license (list license:expat license:asl2.0))))) | 790 | (license (list license:expat license:asl2.0))))) |
| 571 | #t) | 791 | #t) |
| 572 | (x | 792 | (x |
