[PATCH 0/2] Allow 'guix refresh' to downgrade packages when asked to

  • Done
  • quality assurance status badge
Details
One participant
  • Ludovic Courtès
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 27 Dec 2022 23:11
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20221227221156.25323-1-ludo@gnu.org
Hi Hartmut,

I figured changes from https://issues.guix.gnu.org/57460 were not
applicable in some cases because of things that guard against
downgrade.

The following patches fix the use case where the user is explicitly
asking for a downgrade, as in:

guix refresh guile@3.0=2.2.7
guix refresh -u guile=3.0.0

Previously these wouldn’t do anything.

WDYT?

Ludo’.

Ludovic Courtès (2):
refresh: Honor user-provided target version and report downgrades.
upstream: Allow downgrades.

guix/scripts/refresh.scm | 46 +++++++++++++++++++++++++++-------------
guix/upstream.scm | 17 ++++++++++++---
2 files changed, 45 insertions(+), 18 deletions(-)


base-commit: fd0e69984f25bdf2405cf33b15a8bbb2010a7b85
--
2.38.1
L
L
Ludovic Courtès wrote on 27 Dec 2022 23:21
[PATCH 1/2] refresh: Honor user-provided target version and report downgrades.
(address . 60368@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20221227222110.25440-1-ludo@gnu.org
Previously, 'guix refresh guile=3.0.0' would print:

3.0.8 is already the latest version of guile

With this change, it prints:

guile would be downgraded from 3.0.8 to 3.0.0

This is a followup to 8aeccc6240ec45f0bc7bed655e0c8149ae4253eb.

* guix/scripts/refresh.scm (check-for-package-update): Take an
<update-spec> instead of a <package>. Report downgrades as such when
UPDATE-SPEC specifies a target version.
(guix-refresh): Adjust caller.
---
guix/scripts/refresh.scm | 46 +++++++++++++++++++++++++++-------------
1 file changed, 31 insertions(+), 15 deletions(-)

Toggle diff (78 lines)
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index e0b94ce48d..65c3ce9c16 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -382,10 +382,15 @@ (define change-name
(when warn?
(warn-no-updater package))))
-(define* (check-for-package-update package updaters #:key warn?)
- "Check whether an update is available for PACKAGE and print a message. When
-WARN? is true and no updater exists for PACKAGE, print a warning."
- (match (package-latest-release package updaters)
+(define* (check-for-package-update update-spec updaters #:key warn?)
+ "Check whether UPDATE-SPEC is feasible, and print a message.
+When WARN? is true and no updater exists for PACKAGE, print a warning."
+ (define package
+ (update-spec-package update-spec))
+
+ (match (package-latest-release package updaters
+ #:version
+ (update-spec-version update-spec))
((? upstream-source? source)
(let ((loc (or (package-field-location package 'version)
(package-location package))))
@@ -403,23 +408,34 @@ (define* (check-for-package-update package updaters #:key warn?)
(package-version package)
(package-name package))))
(else
- (when warn?
- (warning loc
- (G_ "~a is greater than \
+ (if (update-spec-version update-spec)
+ (info loc
+ (G_ "~a would be downgraded from ~a to ~a~%")
+ (package-name package)
+ (package-version package)
+ (upstream-source-version source))
+ (when warn?
+ (warning loc
+ (G_ "~a is greater than \
the latest known version of ~a (~a)~%")
- (package-version package)
- (package-name package)
- (upstream-source-version source)))))))
+ (package-version package)
+ (package-name package)
+ (upstream-source-version source))))))))
(#f
(when warn?
;; Distinguish between "no updater" and "failing updater."
(match (lookup-updater package updaters)
((? upstream-updater? updater)
- (warning (package-location package)
- (G_ "'~a' updater failed to determine available \
+ (if (update-spec-version update-spec)
+ (warning (G_ "'~a' updater failed to find version ~a of '~a'~%")
+ (upstream-updater-name updater)
+ (update-spec-version update-spec)
+ (package-name package))
+ (warning (package-location package)
+ (G_ "'~a' updater failed to determine available \
releases for ~a~%")
- (upstream-updater-name updater)
- (package-name package)))
+ (upstream-updater-name updater)
+ (package-name package))))
(#f
(warn-no-updater package)))))))
@@ -591,5 +607,5 @@ (define (options->updaters opts)
(else
(for-each (cut check-for-package-update <> updaters
#:warn? warn?)
- (map update-spec-package update-specs))
+ update-specs)
(return #t)))))))))
--
2.38.1
L
L
Ludovic Courtès wrote on 27 Dec 2022 23:21
[PATCH 2/2] upstream: Allow downgrades.
(address . 60368@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20221227222110.25440-2-ludo@gnu.org
Previously, 'guix refresh -u guile=3.0.0' would do nothing. With this
change, it actually downgrades 'guile'.

This is a followup to 8aeccc6240ec45f0bc7bed655e0c8149ae4253eb.

* guix/upstream.scm (package-update): Ignore 'version>?' check
when #:version is passed. Warn about downgrades.
---
guix/upstream.scm | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)

Toggle diff (32 lines)
diff --git a/guix/upstream.scm b/guix/upstream.scm
index f3ab9ab78b..4c72388bf3 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -501,11 +501,22 @@ (define* (package-update store package
changes for PACKAGE; return #f (three values) when PACKAGE is up-to-date;
raise an error when the updater could not determine available releases.
KEY-DOWNLOAD specifies a download policy for missing OpenPGP keys; allowed
-values: 'always', 'never', and 'interactive' (default)."
+values: 'always', 'never', and 'interactive' (default).
+
+When VERSION is specified, update PACKAGE to that version, even if that is a
+downgrade."
(match (package-latest-release package updaters #:version version)
((? upstream-source? source)
- (if (version>? (upstream-source-version source)
- (package-version package))
+ (if (or (version>? (upstream-source-version source)
+ (package-version package))
+ (and version
+ (begin
+ (warning (package-location package)
+ (G_ "downgrading '~a' from ~a to ~a~%")
+ (package-name package)
+ (package-version package)
+ (upstream-source-version source))
+ #t)))
(let ((method (match (package-source package)
((? origin? origin)
(origin-method origin))
--
2.38.1
L
L
Ludovic Courtès wrote on 3 Jan 2023 12:32
Re: bug#60368: [PATCH 0/2] Allow 'guix refresh' to downgrade packages when asked to
(address . 60368-done@debbugs.gnu.org)(name . Hartmut Goebel)(address . h.goebel@crazy-compilers.com)
87ilhn97ld.fsf@gnu.org
Hi Hartmut and all,

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

Toggle quote (14 lines)
> Hi Hartmut,
>
> I figured changes from <https://issues.guix.gnu.org/57460> were not
> applicable in some cases because of things that guard against
> downgrade.
>
> The following patches fix the use case where the user is explicitly
> asking for a downgrade, as in:
>
> guix refresh guile@3.0=2.2.7
> guix refresh -u guile=3.0.0
>
> Previously these wouldn’t do anything.

I went ahead and pushed these:

11235dd85a refresh: Honor user-provided target version and report downgrades.
a330bfdf5b upstream: Allow downgrades.

Thanks,
Ludo’.
Closed
?