diff --git a/guix/upstream.scm b/guix/upstream.scm index af09f620880..259c0744126 100644 --- a/guix/upstream.scm +++ b/guix/upstream.scm @@ -525,39 +525,44 @@ downgrade. When PARTIAL-VERSION? is true, treat VERSION as having been only partially specified, in which case the package will be updated to the newest compatible version if there are no exact match for VERSION. For example, providing \"46\" as the version may update the package to version \"46.6.4\"." + (define (update* source) + (let ((method (match (package-source package) + ((? origin? origin) + (origin-method origin)) + (_ + #f)))) + (match (assq method %method-updates) + (#f + (raise (make-compound-condition + (formatted-message (G_ "cannot download for \ +this method: ~s") + method) + (condition + (&error-location + (location (package-location package))))))) + ((_ . update) + (update store package source + #:key-server key-server + #:key-download key-download))))) + (match (package-latest-release package updaters #:version version #:partial-version? partial-version?) ((? upstream-source? source) - (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)) - (_ - #f)))) - (match (assq method %method-updates) - (#f - (raise (make-compound-condition - (formatted-message (G_ "cannot download for \ -this method: ~s") - method) - (condition - (&error-location - (location (package-location package))))))) - ((_ . update) - (update store package source - #:key-server key-server - #:key-download key-download)))) - (values #f #f #f))) + (case (version-compare (upstream-source-version source) + (package-version package)) + ((>) + (update* source)) + ((<) + (and version + (warning (package-location package) + (G_ "downgrading '~a' from ~a to ~a~%") + (package-name package) + (package-version package) + (upstream-source-version source))) + (update* source)) + (else + (values #f #f #f)))) (#f ;; Warn rather than abort so that other updates can still take place. (if version diff --git a/tests/guix-refresh.sh b/tests/guix-refresh.sh index b5b38189cb3..0f1af8cae7c 100644 --- a/tests/guix-refresh.sh +++ b/tests/guix-refresh.sh @@ -44,6 +44,15 @@ case "$(guix refresh -t test idutils 2>&1)" in *"$idutils_version"*"already the latest version"*) true;; *) false;; esac + +# No-op when updating to same version. +case "$(guix refresh -t test -u idutils \ +--target-version=$idutils_version 2>&1)" in + *downgrading*) false;; + *updating*) false;; + *) true;; +esac + guix refresh -t test libreoffice # XXX: should return non-zero? case "$(guix refresh -t test libreoffice 2>&1)" in *"greater than the latest known version"*"1.0"*) true;;