diff mbox series

[bug#68346,1/2] import: crate: Update to latest semver version.

Message ID 95ec7b98522617a6e033bfba98384b88c5535264.1704805408.git.efraim@flashner.co.il
State New
Headers show
Series semver aware cargo refresh | expand

Commit Message

Efraim Flashner Jan. 9, 2024, 1:07 p.m. UTC
* guix/import/crate.scm (max-crate-version-of-semver,
nonyanked-crate-versions): New procedures.
(import-release)[version]: Update to the requested version or the newest
semver-compatible version.

Change-Id: I72b081147c4eb9faf482f159b7145aaaf9f91f29
---
 guix/import/crate.scm | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/guix/import/crate.scm b/guix/import/crate.scm
index c57bd0bc6a..43f80f3fb7 100644
--- a/guix/import/crate.scm
+++ b/guix/import/crate.scm
@@ -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))