Intervalles de compat et fonctions associées

Hello,

J’investigue depuis hier les fonctions associées à la gestion des intervalles de compatibilité.
J’ai déjà corrigé un bug d’inclusion des bornes dans la fonction extraire_bornes().

J’étais en train de vérifier/corriger la fonction compiler_branches_spip() et je suis tombé sur un comportement bizarre de spip_version_compare().
Cette fonction, il y a des lustres, a été mise à jour pour prendre en compte les versions avec étoile comme 3.0..
La fonction compare v1 à v2 selon l’opérateur précisé.
Elle accepte que seule v2 puisse avoir une étoile et dès lors remplace l’étoile par la valeur idoine issue de v1.
De fait, si on fait le test 3.0.1 < 3.0.
on obtient false car on compare 3.0.1 < 3.0.1.

Dans mon esprit, ‹ * › devrait exprimer la valeur max possible.
Si on parle de versions spip, ça serait donc 3.0.999.

Le souci c’est que je ne sais pas si on utilise spip_version_compare() avec des étoiles uniquement pour comparer des versions spip provenant des intervalles de compat ou pas.
Ce qui pose un problème pour décider de la correction à apporter.

Des avis ou des idées ?

Sur les utilisations réelles je ne sais pas, mais sur la logique c'est un peu plus compliqué non ? L'étoile devrait représenter le max possible 999 si c'est la borne sup d'une comparaison MAIS devrait représenter 0 c'est si la borne inférieure, non ?

3.0.* < 3.0.7 ça devrait faire 3.0.0 < 3.0.7 ?

Et qui dire de la comparaison spip_version_compare('3.0.7', '3.0.*', '=')

?

Yop,

Sur les utilisations réelles je ne sais pas, mais sur la logique c’est un peu plus compliqué non ? L’étoile devrait représenter le max possible 999 si c’est la borne sup d’une comparaison MAIS devrait représenter 0 c’est si la borne inférieure, non ?
3.0.* < 3.0.7 ça devrait faire 3.0.0 < 3.0.7 ?

Ta proposition est logique oui.

Je me disais sinon que l’étoile pourrait ne pas être utilisée en borne inf mais uniquement la borne sup (ce que je viens de coder en local d’ailleurs).
A priori l’étoile n’est jamais utilisée en borne inf actuellement mais c’est exact que l’utiliser règlerait le problème des alpha, beta et autres pré-releases.

Re,

Et qui dire de la comparaison spip_version_compare(‹ 3.0.7 ›, ‹ 3.0.* ›, ‹ = ›)

La même chose, c’est la même incohérence

J’ai plus l’impression que la fonction spip_version_compare() tente de
retourner une comparaison entre un élément et une plage. Ça me semble
difficilement réalisable.

Au bout du compte si tu mets spip_version_compare(« 3.0.7 », « 3.0.* »,
« >= ») (ou tout autre opérateur)

c’est un peu comme comparer spip_version_compare(« 3.0.7 », « [3.0.0;
3.0.999] », « >= »), et… ça ne veut rien dire.

Comparer une valeur et un intervalle, c’est dire la valeur est inclue ou
exclue de l’intervalle. On peut pas dire grand chose de plus. Me semble
t’il.

MM.

Non je ne crois pas.
Je pense qu’à l’époque l’introduction de l’étoile a été mal gérée ou mal comprise. L’étoile veut dire borne max de la branche c’est tout.
Je ne sais plus si c’est moi qui ait fait cette modification ou pas mais aujourd’hui je ne la comprend plus.