Hi, Currently the updaters are run in the order of their alphabetical names. For example, with the following instrumentation to see the updater names tried in guix/upstream.scm:
--8<---------------cut here---------------start------------->8--- @@ -259,6 +271,7 @@ (define* (package-latest-release package one." (any (match-lambda (($ <upstream-updater> name description pred import) + (pk 'trying-updater: name) (and (pred package) (import package #:version version)))) updaters)) --8<---------------cut here---------------end--------------->8--- attempting to update gnome-desktop produces: --8<---------------cut here---------------start------------->8--- ./pre-inst-env guix refresh gnome-desktop ;;; (trying-updater: bioconductor) ;;; (trying-updater: composer) ;;; (trying-updater: cpan) ;;; (trying-updater: cran) ;;; (trying-updater: crate) ;;; (trying-updater: egg) ;;; (trying-updater: elpa) ;;; (trying-updater: gem) ;;; (trying-updater: generic-git) ;;; (trying-updater: generic-html) gnu/packages/gnome.scm:2265:13: gnome-desktop would be upgraded from 44.0 to 44.1 --8<---------------cut here---------------end--------------->8--- It seems to me the generic updaters, being generic thus less likely to be precise/correct, should be tried last by 'guix refresh'. This is ensured with the following patch: --8<---------------cut here---------------start------------->8--- modified guix/upstream.scm @@ -48,6 +48,7 @@ (define-module (guix upstream) #:use-module (srfi srfi-26) #:use-module (srfi srfi-34) #:use-module (srfi srfi-35) + #:use-module (srfi srfi-71) #:use-module (rnrs bytevectors) #:use-module (ice-9 match) #:use-module (ice-9 regex) @@ -226,15 +227,26 @@ (define (importer-modules) (define %updaters ;; The list of publically-known updaters, alphabetically sorted. (delay - (sort (fold-module-public-variables (lambda (obj result) - (if (upstream-updater? obj) - (cons obj result) - result)) - '() - (importer-modules)) - (lambda (updater1 updater2) - (string<? (symbol->string (upstream-updater-name updater1)) - (symbol->string (upstream-updater-name updater2))))))) + (let* ((updaters + (sort (fold-module-public-variables + (lambda (obj result) + (if (upstream-updater? obj) + (cons obj result) + result)) + '() + (importer-modules)) + (lambda (updater1 updater2) + (string<? + (symbol->string (upstream-updater-name updater1)) + (symbol->string (upstream-updater-name updater2)))))) + (generic-updaters rest (partition + (compose (cut string-prefix? "generic" <>) + symbol->string + upstream-updater-name) + updaters))) + ;; Ensure the generic updaters are tried last, as otherwise they could + ;; return less accurate results. + (append rest generic-updaters)))) ;; Tests need to mock this variable so mark it as "non-declarative". (set! %updaters %updaters) @@ -259,6 +271,7 @@ (define* (package-latest-release package --8<---------------cut here---------------end--------------->8--- Now, the 'gnome-updater' at least ends up being tried before the 'generic-html': --8<---------------cut here---------------start------------->8--- ;;; (trying-updater: bioconductor) ;;; (trying-updater: composer) ;;; (trying-updater: cpan) ;;; (trying-updater: cran) ;;; (trying-updater: crate) ;;; (trying-updater: egg) ;;; (trying-updater: elpa) ;;; (trying-updater: gem) ;;; (trying-updater: github) ;;; (trying-updater: gnome) gnu/packages/gnome.scm:2265:13: gnome-desktop would be upgraded from 44.0 to 44.1 --8<---------------cut here---------------end--------------->8--- I'll send a 'git format-patch' version in a follow-up. -- Thanks, Maxim