@@ -5,7 +5,7 @@
;;; Copyright © 2021 Nicolas Goaziou <mail@nicolasgoaziou.fr>
;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
-;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2023, 2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
;;;
;;; This file is part of GNU Guix.
@@ -233,6 +233,27 @@ (define (string->license string)
'unknown-license!)))
(string-split string (string->char-set " /"))))
+(define (max-crate-version-of-semver semver-range range)
+ "Returns a <crate-version> of the highest version within the semver range."
+ (let ((matching-crates
+ (sort
+ (filter (lambda (entry)
+ (semver-range-contains?
+ semver-range
+ (string->semver (crate-version-number entry))))
+ range)
+ (lambda (entry1 entry2)
+ (version>? (crate-version-number entry1)
+ (crate-version-number entry2))))))
+ (and (not (null-list? matching-crates))
+ (first matching-crates))))
+
+(define (nonyanked-crate-versions crate)
+ "Returns a list of <crate-version>s which are not yanked by upstream."
+ (filter (lambda (entry)
+ (not (crate-version-yanked? entry)))
+ (crate-versions crate)))
+
(define* (crate->guix-package
crate-name
#:key version include-dev-deps? allow-yanked? #:allow-other-keys)
@@ -427,6 +448,7 @@ (define (guix-package->crate-name package)
(define (crate-name->package-name name)
(guix-name "rust-" name))
+
;;;
;;; Updater
@@ -440,7 +462,12 @@ (define* (import-release package #:key (version #f))
include a VERSION string to fetch a specific version."
(let* ((crate-name (guix-package->crate-name package))
(crate (lookup-crate crate-name))
- (version (or version (crate-latest-version crate)))
+ (version (or version
+ (crate-version-number
+ (max-crate-version-of-semver
+ (string->semver-range
+ (string-append "^" (package-version package)))
+ (nonyanked-crate-versions crate)))))
(url (crate-uri crate-name version)))
(upstream-source
(package (package-name package))