[PATCH] refresh: Add --to-version option.

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Maxim Cournoyer
Owner
unassigned
Submitted by
Maxim Cournoyer
Severity
normal
M
M
Maxim Cournoyer wrote on 11 Aug 2023 23:45
7abba6f5c3c2cc32a0f21fa701e64fffe7d27861.1691790311.git.maxim.cournoyer@gmail.com
* guix/scripts/refresh.scm (%options): Register 'to-version' long version.
(update-specification->update-spec): Add a fallback-version argument.
(options->update-specs): Honor to-version option.
* tests/guix-refresh.sh: Test it.
* doc/guix.texi (Invoking guix refresh): Document it.
---
doc/guix.texi | 20 ++++++++++++++++++++
guix/scripts/refresh.scm | 31 +++++++++++++++++++++++--------
tests/guix-refresh.sh | 7 +++++++
3 files changed, 50 insertions(+), 8 deletions(-)

Toggle diff (133 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 409ca2ad62..ade80dd72a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -14529,6 +14529,26 @@ Invoking guix refresh
@dots{}
@end example
+In some specific cases, you may have many packages specified via a
+manifest or a module selection which should all be updated together; for
+these cases, the @option{--to-version} option can be provided to have
+them all refreshed to the same version, as shown in the examples below:
+
+@example
+$ guix refresh qtbase qtdeclarative --to-version=6.5.2
+gnu/packages/qt.scm:1248:13: qtdeclarative would be upgraded from 6.3.2 to 6.5.2
+gnu/packages/qt.scm:584:2: qtbase would be upgraded from 6.3.2 to 6.5.2
+@end example
+
+@example
+$ guix refresh --manifest=qt5-manifest.scm --to-version=5.15.10
+gnu/packages/qt.scm:1173:13: qtxmlpatterns would be upgraded from 5.15.8 to 5.15.10
+gnu/packages/qt.scm:1202:13: qtdeclarative would be upgraded from 5.15.8 to 5.15.10
+gnu/packages/qt.scm:1762:13: qtserialbus would be upgraded from 5.15.8 to 5.15.10
+gnu/packages/qt.scm:2070:13: qtquickcontrols2 would be upgraded from 5.15.8 to 5.15.10
+@dots{}
+@end example
+
Sometimes the upstream name differs from the package name used in Guix,
and @command{guix refresh} needs a little help. Most updaters honor the
@code{upstream-name} property in package definitions, which can be used
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index a9241aa20d..54ac7ceea3 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -10,6 +10,7 @@
;;; Copyright © 2020 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
+;;; Copyright © 2023 Maxim Cournoyer maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -106,6 +107,9 @@ (define %options
(option '(#\m "manifest") #t #f
(lambda (opt name arg result)
(alist-cons 'manifest arg result)))
+ (option '("to-version") #t #f
+ (lambda (opt name arg result)
+ (alist-cons 'to-version arg result)))
(option '(#\e "expression") #t #f
(lambda (opt name arg result)
(alist-cons 'expression arg result)))
@@ -164,6 +168,9 @@ (define (show-help)
'module:(gnu packages guile)'"))
(display (G_ "
-m, --manifest=FILE select all the packages from the manifest in FILE"))
+ (display (G_ "
+ --to-version=VERSION
+ update the package or packages to VERSION"))
(display (G_ "
-t, --type=UPDATER,... restrict to updates from the specified updaters
(e.g., 'gnu')"))
@@ -213,17 +220,20 @@ (define-record-type <update-spec>
(define* (update-spec package #:optional version)
(%update-spec package version))
-(define (update-specification->update-spec spec)
+(define (update-specification->update-spec spec fallback-version)
"Given SPEC, a package name like \"guile@2.0=2.0.8\", return a <update>
-record with two fields: the package to upgrade, and the target version."
+record with two fields: the package to upgrade, and the target version. When
+SPEC lacks a version, use FALLBACK-VERSION."
(match (string-rindex spec #\=)
- (#f (update-spec (specification->package spec) #f))
+ (#f (update-spec (specification->package spec) fallback-version))
(idx (update-spec (specification->package (substring spec 0 idx))
(substring spec (1+ idx))))))
(define (options->update-specs opts)
"Return the list of <update-spec> records requested by OPTS, honoring
options like '--recursive'."
+ (define to-version (assoc-ref opts 'to-version))
+
(define core-package?
(let* ((input->package (match-lambda
((name (? package? package) _ ...) package)
@@ -263,13 +273,18 @@ (define (options->update-specs opts)
;; Update specs explicitly passed as command-line arguments.
(match (append-map (match-lambda
(('argument . spec)
- ;; Take either the specified version or the
- ;; latest one.
- (list (update-specification->update-spec spec)))
+ ;; Take either the specified version or the latest
+ ;; one. The version specified as part of a spec
+ ;; takes precedence, with the command-line specified
+ ;; --to-version used as a fallback.
+ (list (update-specification->update-spec spec
+ to-version)))
(('expression . exp)
- (list (update-spec (read/eval-package-expression exp))))
+ (list (update-spec (read/eval-package-expression exp)
+ to-version)))
(('manifest . manifest)
- (map update-spec (packages-from-manifest manifest)))
+ (map (cut update-spec <> to-version)
+ (packages-from-manifest manifest)))
(_
'()))
opts)
diff --git a/tests/guix-refresh.sh b/tests/guix-refresh.sh
index 51d34c4b51..a2be93fce4 100644
--- a/tests/guix-refresh.sh
+++ b/tests/guix-refresh.sh
@@ -109,6 +109,13 @@ case "$(guix refresh -t test guile=2.0.0 2>&1)" in
*"failed to find"*"2.0.0"*) true;;
*) false;;
esac
+
+guix refresh -t test guile --to-version=2.0.0 # XXX: should return non-zero?
+case "$(guix refresh -t test guile --to-version=2.0.0 2>&1)" in
+ *"failed to find"*"2.0.0"*) true;;
+ *) false;;
+esac
+
for spec in "guile=1.6.4" "guile@3=1.6.4"
do
guix refresh -t test "$spec"

base-commit: 77251c5f5af193dcd031dffef744001cfc48f7e5
--
2.41.0
L
L
Ludovic Courtès wrote on 15 Aug 2023 12:39
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87fs4ka8sr.fsf@gnu.org
Hi Maxim,

Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (6 lines)
> * guix/scripts/refresh.scm (%options): Register 'to-version' long version.
> (update-specification->update-spec): Add a fallback-version argument.
> (options->update-specs): Honor to-version option.
> * tests/guix-refresh.sh: Test it.
> * doc/guix.texi (Invoking guix refresh): Document it.

[...]

Toggle quote (20 lines)
> +In some specific cases, you may have many packages specified via a
> +manifest or a module selection which should all be updated together; for
> +these cases, the @option{--to-version} option can be provided to have
> +them all refreshed to the same version, as shown in the examples below:
> +
> +@example
> +$ guix refresh qtbase qtdeclarative --to-version=6.5.2
> +gnu/packages/qt.scm:1248:13: qtdeclarative would be upgraded from 6.3.2 to 6.5.2
> +gnu/packages/qt.scm:584:2: qtbase would be upgraded from 6.3.2 to 6.5.2
> +@end example
> +
> +@example
> +$ guix refresh --manifest=qt5-manifest.scm --to-version=5.15.10
> +gnu/packages/qt.scm:1173:13: qtxmlpatterns would be upgraded from 5.15.8 to 5.15.10
> +gnu/packages/qt.scm:1202:13: qtdeclarative would be upgraded from 5.15.8 to 5.15.10
> +gnu/packages/qt.scm:1762:13: qtserialbus would be upgraded from 5.15.8 to 5.15.10
> +gnu/packages/qt.scm:2070:13: qtquickcontrols2 would be upgraded from 5.15.8 to 5.15.10
> +@dots{}
> +@end example

So the main goal is to avoid repeating the ‘=’ sign as in
‘qtbase=6.5.2’, right? That makes a lot of sense to me.

I’d maybe prefer ‘--target-version’ but otherwise LGTM!

Thanks,
Ludo’.
M
M
Maxim Cournoyer wrote on 15 Aug 2023 16:02
(name . Ludovic Courtès)(address . ludo@gnu.org)
87o7j8jtdf.fsf_-_@gmail.com
Hi,

Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (37 lines)
> Hi Maxim,
>
> Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:
>
>> * guix/scripts/refresh.scm (%options): Register 'to-version' long version.
>> (update-specification->update-spec): Add a fallback-version argument.
>> (options->update-specs): Honor to-version option.
>> * tests/guix-refresh.sh: Test it.
>> * doc/guix.texi (Invoking guix refresh): Document it.
>
> [...]
>
>> +In some specific cases, you may have many packages specified via a
>> +manifest or a module selection which should all be updated together; for
>> +these cases, the @option{--to-version} option can be provided to have
>> +them all refreshed to the same version, as shown in the examples below:
>> +
>> +@example
>> +$ guix refresh qtbase qtdeclarative --to-version=6.5.2
>> +gnu/packages/qt.scm:1248:13: qtdeclarative would be upgraded from 6.3.2 to 6.5.2
>> +gnu/packages/qt.scm:584:2: qtbase would be upgraded from 6.3.2 to 6.5.2
>> +@end example
>> +
>> +@example
>> +$ guix refresh --manifest=qt5-manifest.scm --to-version=5.15.10
>> +gnu/packages/qt.scm:1173:13: qtxmlpatterns would be upgraded from 5.15.8 to 5.15.10
>> +gnu/packages/qt.scm:1202:13: qtdeclarative would be upgraded from 5.15.8 to 5.15.10
>> +gnu/packages/qt.scm:1762:13: qtserialbus would be upgraded from 5.15.8 to 5.15.10
>> +gnu/packages/qt.scm:2070:13: qtquickcontrols2 would be upgraded from 5.15.8 to 5.15.10
>> +@dots{}
>> +@end example
>
> So the main goal is to avoid repeating the ‘=’ sign as in
> ‘qtbase=6.5.2’, right? That makes a lot of sense to me.
>
> I’d maybe prefer ‘--target-version’ but otherwise LGTM!

I've attempted a quick poll on #guix and Efraim also voted vote
--target-version, so I've made change and pushed! Tobias had suggested
'--update-version', which also made sense.

Thanks for the review!

--
Maxim
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 65235@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 65235
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch