mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
import: crate: Comment out missing dependencies.
* guix/import/crate.scm (package-names->package-inputs): Emit comments. (make-crate-sexp): Make input into comment if missing. (crate->guix-package): Take #:mark-missing? argument. [dependency-name+missing+version+yanked]: Mark as missing. Rename from dependency-name+version+yanked. [sort-map-dependencies]: Adjust. [remove-missing+yanked-info]: Remove missing info. Rename from remove-yanked-info. * guix/scripts/import/crate.scm (show-help): Explain --mark-missing. (%options): Add mark-missing option. (guix-import-crate): Pass mark-missing option as #:mark-missing?. * doc/guix.texi (Invoking guix import): Document --mark-missing. * tests/crate.scm ("crate->guix-package-marks-missing-packages"): Add test. Change-Id: I065d394e1c04fdc332b8f7f8b9fcbd87c14c6512 Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
48c5942a1e
commit
6b55b971c8
4 changed files with 123 additions and 41 deletions
|
@ -124,7 +124,7 @@ Copyright @copyright{} 2023 Thomas Ieong@*
|
||||||
Copyright @copyright{} 2023 Saku Laesvuori@*
|
Copyright @copyright{} 2023 Saku Laesvuori@*
|
||||||
Copyright @copyright{} 2023 Graham James Addis@*
|
Copyright @copyright{} 2023 Graham James Addis@*
|
||||||
Copyright @copyright{} 2023, 2024 Tomas Volf@*
|
Copyright @copyright{} 2023, 2024 Tomas Volf@*
|
||||||
Copyright @copyright{} 2024 Herman Rimm@*
|
Copyright @copyright{} 2024, 2025 Herman Rimm@*
|
||||||
Copyright @copyright{} 2024 Matthew Trzcinski@*
|
Copyright @copyright{} 2024 Matthew Trzcinski@*
|
||||||
Copyright @copyright{} 2024 Richard Sent@*
|
Copyright @copyright{} 2024 Richard Sent@*
|
||||||
Copyright @copyright{} 2024 Dariqq@*
|
Copyright @copyright{} 2024 Dariqq@*
|
||||||
|
@ -14687,6 +14687,10 @@ imported as well.
|
||||||
@item --allow-yanked
|
@item --allow-yanked
|
||||||
If no non-yanked version of a crate is available, use the latest yanked
|
If no non-yanked version of a crate is available, use the latest yanked
|
||||||
version instead instead of aborting.
|
version instead instead of aborting.
|
||||||
|
@item --mark-missing
|
||||||
|
If a crate dependency is not (yet) packaged, make the corresponding
|
||||||
|
input in @code{#:cargo-inputs} or @code{#:cargo-development-inputs} into
|
||||||
|
a comment.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item elm
|
@item elm
|
||||||
|
|
|
@ -156,6 +156,7 @@ use in an 'inputs' field of a package definition."
|
||||||
|
|
||||||
(map (match-lambda
|
(map (match-lambda
|
||||||
((input version) (make-input input version))
|
((input version) (make-input input version))
|
||||||
|
((? blank? comment) comment)
|
||||||
(input (make-input input #f)))
|
(input (make-input input #f)))
|
||||||
names))
|
names))
|
||||||
|
|
||||||
|
@ -194,11 +195,16 @@ and LICENSE."
|
||||||
(define (format-inputs inputs)
|
(define (format-inputs inputs)
|
||||||
(map
|
(map
|
||||||
(match-lambda
|
(match-lambda
|
||||||
((name version yanked)
|
((name missing version yanked)
|
||||||
(list (crate-name->package-name name)
|
(let ((input (list (crate-name->package-name name)
|
||||||
(if yanked
|
(if yanked
|
||||||
(string-append version "-yanked")
|
(string-append version "-yanked")
|
||||||
(version->semver-prefix version)))))
|
(version->semver-prefix version)))))
|
||||||
|
(if missing
|
||||||
|
(comment
|
||||||
|
(string-append ";; " (string-join input "-") "\n")
|
||||||
|
#f)
|
||||||
|
input))))
|
||||||
inputs))
|
inputs))
|
||||||
|
|
||||||
(let* ((port (http-fetch (crate-uri name version)))
|
(let* ((port (http-fetch (crate-uri name version)))
|
||||||
|
@ -318,7 +324,8 @@ priority."
|
||||||
|
|
||||||
(define* (crate->guix-package
|
(define* (crate->guix-package
|
||||||
crate-name
|
crate-name
|
||||||
#:key version include-dev-deps? allow-yanked? #:allow-other-keys)
|
#:key version include-dev-deps? allow-yanked? mark-missing?
|
||||||
|
#:allow-other-keys)
|
||||||
"Fetch the metadata for CRATE-NAME from crates.io, and return the
|
"Fetch the metadata for CRATE-NAME from crates.io, and return the
|
||||||
`package' s-expression corresponding to that package, or #f on failure.
|
`package' s-expression corresponding to that package, or #f on failure.
|
||||||
When VERSION is specified, convert it into a semver range and attempt to fetch
|
When VERSION is specified, convert it into a semver range and attempt to fetch
|
||||||
|
@ -358,13 +365,13 @@ look up the development dependencs for the given crate."
|
||||||
;; If no non-yanked existing package version was found, check the upstream
|
;; If no non-yanked existing package version was found, check the upstream
|
||||||
;; versions. If a non-yanked upsteam version exists, use it instead,
|
;; versions. If a non-yanked upsteam version exists, use it instead,
|
||||||
;; otherwise use the existing package version, provided it exists.
|
;; otherwise use the existing package version, provided it exists.
|
||||||
(define (dependency-name+version+yanked dep)
|
(define (dependency-name+missing+version+yanked dep)
|
||||||
(let* ((name (crate-dependency-id dep))
|
(let* ((name (crate-dependency-id dep))
|
||||||
(req (crate-dependency-requirement dep))
|
(req (crate-dependency-requirement dep))
|
||||||
(existing-version
|
(existing-version
|
||||||
(find-package-version name req allow-yanked?)))
|
(find-package-version name req allow-yanked?)))
|
||||||
(if (and existing-version (not (second existing-version)))
|
(if (and existing-version (not (second existing-version)))
|
||||||
(cons name existing-version)
|
(cons* name #f existing-version)
|
||||||
(let* ((crate (lookup-crate* name))
|
(let* ((crate (lookup-crate* name))
|
||||||
(ver (find-crate-version crate req)))
|
(ver (find-crate-version crate req)))
|
||||||
(if existing-version
|
(if existing-version
|
||||||
|
@ -374,14 +381,15 @@ look up the development dependencs for the given crate."
|
||||||
(begin
|
(begin
|
||||||
(warning (G_ "~A: version ~a is no longer yanked~%")
|
(warning (G_ "~A: version ~a is no longer yanked~%")
|
||||||
name (first existing-version))
|
name (first existing-version))
|
||||||
(cons name existing-version))
|
(cons* name #f existing-version))
|
||||||
(list name
|
(list name
|
||||||
|
#f
|
||||||
(crate-version-number ver)
|
(crate-version-number ver)
|
||||||
(crate-version-yanked? ver)))
|
(crate-version-yanked? ver)))
|
||||||
(begin
|
(begin
|
||||||
(warning (G_ "~A: using existing version ~a, which was yanked~%")
|
(warning (G_ "~A: using existing version ~a, which was yanked~%")
|
||||||
name (first existing-version))
|
name (first existing-version))
|
||||||
(cons name existing-version)))
|
(cons* name #f existing-version)))
|
||||||
(begin
|
(begin
|
||||||
(unless ver
|
(unless ver
|
||||||
(leave (G_ "~A: no version found for requirement ~a~%") name req))
|
(leave (G_ "~A: no version found for requirement ~a~%") name req))
|
||||||
|
@ -389,6 +397,7 @@ look up the development dependencs for the given crate."
|
||||||
(warning (G_ "~A: imported version ~a was yanked~%")
|
(warning (G_ "~A: imported version ~a was yanked~%")
|
||||||
name (crate-version-number ver)))
|
name (crate-version-number ver)))
|
||||||
(list name
|
(list name
|
||||||
|
mark-missing?
|
||||||
(crate-version-number ver)
|
(crate-version-number ver)
|
||||||
(crate-version-yanked? ver))))))))
|
(crate-version-yanked? ver))))))))
|
||||||
|
|
||||||
|
@ -400,14 +409,14 @@ look up the development dependencs for the given crate."
|
||||||
;; sort and map the dependencies to a list containing
|
;; sort and map the dependencies to a list containing
|
||||||
;; pairs of (name version)
|
;; pairs of (name version)
|
||||||
(define (sort-map-dependencies deps)
|
(define (sort-map-dependencies deps)
|
||||||
(sort (map dependency-name+version+yanked
|
(sort (map dependency-name+missing+version+yanked
|
||||||
deps)
|
deps)
|
||||||
(match-lambda* (((name _ _) ...)
|
(match-lambda* (((name _ _ _) ...)
|
||||||
(apply string-ci<? name)))))
|
(apply string-ci<? name)))))
|
||||||
|
|
||||||
(define (remove-yanked-info deps)
|
(define (remove-missing+yanked-info deps)
|
||||||
(map
|
(map
|
||||||
(match-lambda ((name version yanked)
|
(match-lambda ((name missing version yanked)
|
||||||
(list name version)))
|
(list name version)))
|
||||||
deps))
|
deps))
|
||||||
|
|
||||||
|
@ -438,8 +447,8 @@ look up the development dependencs for the given crate."
|
||||||
#:license (and=> (crate-version-license version*)
|
#:license (and=> (crate-version-license version*)
|
||||||
string->license))
|
string->license))
|
||||||
(append
|
(append
|
||||||
(remove-yanked-info cargo-inputs)
|
(remove-missing+yanked-info cargo-inputs)
|
||||||
(remove-yanked-info cargo-development-inputs))))
|
(remove-missing+yanked-info cargo-development-inputs))))
|
||||||
(values #f '())))
|
(values #f '())))
|
||||||
|
|
||||||
(define* (crate-recursive-import
|
(define* (crate-recursive-import
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
|
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
|
||||||
;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
|
;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
|
||||||
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
|
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
|
||||||
|
;;; Copyright © 2025 Herman Rimm <herman@rimm.ee>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -54,6 +55,9 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
|
||||||
(display (G_ "
|
(display (G_ "
|
||||||
--allow-yanked allow importing yanked crates if no alternative
|
--allow-yanked allow importing yanked crates if no alternative
|
||||||
satisfying the version requirement is found"))
|
satisfying the version requirement is found"))
|
||||||
|
(display (G_ "
|
||||||
|
--mark-missing comment out the desired dependency if no
|
||||||
|
sufficient package exists for it"))
|
||||||
(newline)
|
(newline)
|
||||||
(display (G_ "
|
(display (G_ "
|
||||||
-h, --help display this help and exit"))
|
-h, --help display this help and exit"))
|
||||||
|
@ -80,6 +84,9 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
|
||||||
(option '("allow-yanked") #f #f
|
(option '("allow-yanked") #f #f
|
||||||
(lambda (opt name arg result)
|
(lambda (opt name arg result)
|
||||||
(alist-cons 'allow-yanked #t result)))
|
(alist-cons 'allow-yanked #t result)))
|
||||||
|
(option '("mark-missing") #f #f
|
||||||
|
(lambda (opt name arg result)
|
||||||
|
(alist-cons 'mark-missing #t result)))
|
||||||
%standard-import-options))
|
%standard-import-options))
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,7 +119,8 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
|
||||||
#:allow-yanked? (assoc-ref opts 'allow-yanked))
|
#:allow-yanked? (assoc-ref opts 'allow-yanked))
|
||||||
(crate->guix-package
|
(crate->guix-package
|
||||||
name #:version version #:include-dev-deps? #t
|
name #:version version #:include-dev-deps? #t
|
||||||
#:allow-yanked? (assoc-ref opts 'allow-yanked)))
|
#:allow-yanked? (assoc-ref opts 'allow-yanked)
|
||||||
|
#:mark-missing? (assoc-ref opts 'mark-missing)))
|
||||||
((or #f '())
|
((or #f '())
|
||||||
(leave (G_ "failed to download meta-data for package '~a'~%")
|
(leave (G_ "failed to download meta-data for package '~a'~%")
|
||||||
(if version
|
(if version
|
||||||
|
|
107
tests/crate.scm
107
tests/crate.scm
|
@ -5,6 +5,7 @@
|
||||||
;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
|
;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
|
||||||
;;; Copyright © 2023, 2025 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2023, 2025 Efraim Flashner <efraim@flashner.co.il>
|
||||||
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
|
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
|
||||||
|
;;; Copyright © 2025 Herman Rimm <herman@rimm.ee>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -446,6 +447,29 @@
|
||||||
(define have-guile-semver?
|
(define have-guile-semver?
|
||||||
(false-if-exception (resolve-interface '(semver))))
|
(false-if-exception (resolve-interface '(semver))))
|
||||||
|
|
||||||
|
(define rust-leaf-bob-3
|
||||||
|
(package
|
||||||
|
(name "rust-leaf-bob")
|
||||||
|
(version "3.0.1")
|
||||||
|
(source #f)
|
||||||
|
(build-system #f)
|
||||||
|
(home-page #f)
|
||||||
|
(synopsis #f)
|
||||||
|
(description #f)
|
||||||
|
(license #f)))
|
||||||
|
|
||||||
|
(define rust-leaf-bob-3.0.2-yanked
|
||||||
|
(package
|
||||||
|
(name "rust-leaf-bob")
|
||||||
|
(version "3.0.2")
|
||||||
|
(source #f)
|
||||||
|
(properties '((crate-version-yanked? . #t)))
|
||||||
|
(build-system #f)
|
||||||
|
(home-page #f)
|
||||||
|
(synopsis #f)
|
||||||
|
(description #f)
|
||||||
|
(license #f)))
|
||||||
|
|
||||||
|
|
||||||
(test-begin "crate")
|
(test-begin "crate")
|
||||||
|
|
||||||
|
@ -510,6 +534,66 @@
|
||||||
(x
|
(x
|
||||||
(pk 'fail x #f)))))
|
(pk 'fail x #f)))))
|
||||||
|
|
||||||
|
(unless have-guile-semver? (test-skip 1))
|
||||||
|
(test-assert "crate->guix-package-marks-missing-packages"
|
||||||
|
(mock
|
||||||
|
((gnu packages) find-packages-by-name
|
||||||
|
(lambda* (name #:optional version)
|
||||||
|
(match name
|
||||||
|
("rust-leaf-bob"
|
||||||
|
(list rust-leaf-bob-3.0.2-yanked))
|
||||||
|
(_ '()))))
|
||||||
|
(mock
|
||||||
|
((guix http-client) http-fetch
|
||||||
|
(lambda (url . rest)
|
||||||
|
(match url
|
||||||
|
("https://crates.io/api/v1/crates/intermediate-b"
|
||||||
|
(open-input-string test-intermediate-b-crate))
|
||||||
|
("https://crates.io/api/v1/crates/intermediate-b/1.2.3/download"
|
||||||
|
(set! test-source-hash
|
||||||
|
(bytevector->nix-base32-string
|
||||||
|
(gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
|
||||||
|
(open-input-string "empty file\n"))
|
||||||
|
("https://crates.io/api/v1/crates/intermediate-b/1.2.3/dependencies"
|
||||||
|
(open-input-string test-intermediate-b-dependencies))
|
||||||
|
("https://crates.io/api/v1/crates/leaf-bob"
|
||||||
|
(open-input-string test-leaf-bob-crate))
|
||||||
|
("https://crates.io/api/v1/crates/leaf-bob/3.0.1/download"
|
||||||
|
(set! test-source-hash
|
||||||
|
(bytevector->nix-base32-string
|
||||||
|
(gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
|
||||||
|
(open-input-string "empty file\n"))
|
||||||
|
(_ (error "Unexpected URL: " url)))))
|
||||||
|
(match (crate->guix-package "intermediate-b" #:mark-missing? #t)
|
||||||
|
((define-public 'rust-intermediate-b-1
|
||||||
|
(package
|
||||||
|
(name "rust-intermediate-b")
|
||||||
|
(version "1.2.3")
|
||||||
|
(source
|
||||||
|
(origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (crate-uri "intermediate-b" version))
|
||||||
|
(file-name
|
||||||
|
(string-append name "-" version ".tar.gz"))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
(? string? hash)))))
|
||||||
|
(build-system cargo-build-system)
|
||||||
|
(arguments
|
||||||
|
('quasiquote
|
||||||
|
(#:skip-build? #t
|
||||||
|
#:cargo-inputs
|
||||||
|
(($ <comment> ";; rust-leaf-bob-3\n" #f)))))
|
||||||
|
(home-page "http://example.com")
|
||||||
|
(synopsis "summary")
|
||||||
|
(description "This package provides summary.")
|
||||||
|
(license (list license:expat license:asl2.0))))
|
||||||
|
#t)
|
||||||
|
(x
|
||||||
|
(pk 'fail
|
||||||
|
(pretty-print-with-comments (current-output-port) x)
|
||||||
|
#f))))))
|
||||||
|
|
||||||
(unless have-guile-semver? (test-skip 1))
|
(unless have-guile-semver? (test-skip 1))
|
||||||
(test-assert "crate-recursive-import"
|
(test-assert "crate-recursive-import"
|
||||||
;; Replace network resources with sample data.
|
;; Replace network resources with sample data.
|
||||||
|
@ -883,29 +967,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define rust-leaf-bob-3
|
|
||||||
(package
|
|
||||||
(name "rust-leaf-bob")
|
|
||||||
(version "3.0.1")
|
|
||||||
(source #f)
|
|
||||||
(build-system #f)
|
|
||||||
(home-page #f)
|
|
||||||
(synopsis #f)
|
|
||||||
(description #f)
|
|
||||||
(license #f)))
|
|
||||||
|
|
||||||
(define rust-leaf-bob-3.0.2-yanked
|
|
||||||
(package
|
|
||||||
(name "rust-leaf-bob")
|
|
||||||
(version "3.0.2")
|
|
||||||
(source #f)
|
|
||||||
(properties '((crate-version-yanked? . #t)))
|
|
||||||
(build-system #f)
|
|
||||||
(home-page #f)
|
|
||||||
(synopsis #f)
|
|
||||||
(description #f)
|
|
||||||
(license #f)))
|
|
||||||
|
|
||||||
(unless have-guile-semver? (test-skip 1))
|
(unless have-guile-semver? (test-skip 1))
|
||||||
(test-assert "crate-recursive-import-honors-existing-packages"
|
(test-assert "crate-recursive-import-honors-existing-packages"
|
||||||
(mock
|
(mock
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue