Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Comparaison de version de l'eggdrop
#1
Information 
Plusieurs scripts sont fait pour fonctionner avec une version minimale d'eggdrop, en s'appuyant sur la variable $::version

Cette variable a changé depuis eggdrop 1.8, précédement elle ne contenait que le N° de version d'eggdrop, désormais elle contient la version au format texte suivi du numéro de version:

Code:
.tcl putlog $version
1.9.2+stdin 1090204
Pour n'utiliser que le numéro de version, une variable a été introduite: $::numversion

Code:
.tcl putlog $numversion
1090204
Comment corriger les scripts ?
Trouvez la ligne qui commence (souvent) par:

tcl
if { [regsub -all {\.} [lindex $::version 0] ""] < 1620 } {

Remplacez cette portion par (au choix):

1. l'utilisation de la bonne partie de $version

tcl
if { [regsub -all {\.} [lindex $::version 1] ""] < 1620 } {


2. la comparaison par l'utilitaire de package

tcl
if { [package vcompare [regexp -inline {^[[:digit:]\.]+} $::version] 1.6.20] == -1 } {


3. l'utilisation de $numversion

tcl
if { $::numversion < 1620 } {

zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#2
Petit retour sur le numéro de version...
Il est sous la forme MNNRRPP, avec comme éléments:
  • M : numéro de release Majeure sur 1 digit (donc 1 actuellement)
  • NN : numéro de release miNeure sur 2 digits (donc 09)
  • RR : numéro de sous-Release sur 2 digits (donc 02)
  • PP : numéro de Patch sur 2 digits (donc 04)

Un eggdrop 1.6.21-4 aurait donc le numversion 1062104, un eggdrop 1.8.3-2 serait 1080302 et la version actuelle d'eggdrop est 1090203
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#3
(18/04/2022, 17:15)CrazyCat Wrote: Un eggdrop 1.6.21-4 aurait donc le numversion 1062104

Sauf que $::numversion n'existe pas sur les versions 1.6.2x

J'ai vérifié la valeur de $::version sur un Egg 1.6.21 :
tcl
.tcl return $::version
Tcl: 1.6.21 1062100

On peut donc bien utiliser la 2ème partie pour la comparer à $::numversion sur les Eggs 1.8+ puisque le format expliqué par @CrazyCat dans le post précédent reste le même.

Rapport de ce qui a été dit sur IRC, pour le suivi :
Quote:(CrazyCat@Zeolia) if {(![info exists numversion] && [regsub -all {\.} [lindex $::version 0] ""]<1620 } { <-- ça, on est sûr que c'est au mieux un 1.6.21
(CrazyCat@Zeolia) vu que y'a pas le $numversion
(CrazyCat@Zeolia) Je vais réfléchir parce qu'en fait là je cherche juste à patcher des scripts qui ont besoin de 1.6.2x
(CrazyCat@Zeolia) C'est pas universel du coup
(CrazyCat@Zeolia) Le mieux serait de faire un scan de $version pour recréer $numversion
<MenzAgitat> CrazyCat > faudrait pouvoir checker si une variable est read-only pour éviter la confusion avec une variable globale custom du même nom sur un 1.6
<MenzAgitat> et je ne vois pas trop comment faire ça à part utiliser un catch et essayer de la modifier :s

La discussion reste donc ouverte pour résoudre ce problème qui, bien qu'improbable, peut tout à fait se produire avec un nom de variable aussi "banal".
Toute l'actualité de mes scripts ici     (dernière mise à jour le 22/04/2020)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction, de quoi l'on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.
  Reply
#4
Je résume ce que je comprend : $::numversion est trop récent pour les versions antérieur a 1.6.21
$::version a en cours de route changer de format de x.x.x a x.x.x+text (1.6.21 a 1.9.2+stdin) je parle en [lindex $::version 0]

ont chercher une méthode de vérification de version universel pour fonctionner peu importe la version et format de version

Ce thread est lié a ma réponse de hier sur ce thread . ma méthode été :

tcl
if { [package vcompare [regexp -inline {^[[:digit:]\.]+} $::version] 1.6.20] == -1 } {


Quel est le problème ? Car "x.x.x" ou "x.x.x+text "ca vérifie "x.x.x" , donc détourne le problème du "+text"
de plus "package vcompare" devrais fonctionner avec des très vieilles version de TCL, non?

je lis
Quote:Il est sous la forme MNNRRPP, avec comme éléments:
M : numéro de release Majeure sur 1 digit (donc 1 actuellement)
NN : numéro de release miNeure sur 2 digits (donc 09)
RR : numéro de sous-Release sur 2 digits (donc 02)
PP : numéro de Patch sur 2 digits (donc 04)


Il manque le PP qui est le numéro de Patch, cela relève de la git branch dev, non?

Peut-être il y a longtemps l'importance entre deux PP version été importante ? Bon ok

Pourquoi ne pas utiliser [lindex $::version 1] ?
je vois que pour la 1.6.21 il vaut 1062100 et pour la version 1.9.2+stdin il vaut 1090204
ca ressemble a numversion , ce n'ai pas numversion ?

Donc en gros il faut utiliser le format long (MNNRRPP) de version :

tcl
if { [lindex $::version 1] < 1062100 } {


Et c'est tout non?


Convertir un version/version+text ([lindex $::version 0]) en $::numversion ([lindex $::version 1]) c'est simple:


tcl
regsub -all {\.(\d+)+} [regexp -inline {^[[:digit:]\.]+} $::version] {[format "%02s" \1]} TMP_VERS; 
set ::numversion [format "%-07s" [subst $TMP_VERS]]

Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply
#5
(19/04/2022, 03:00)ZarTek Wrote: ma méthode été :

tcl
if { [package vcompare [regexp -inline {^[[:digit:]\.]+} $::version] 1.6.20] == -1 } {
Petite remarque en passant sur "ta méthode", il s'agit de mon code. C'est le correctif que je suggère pour mes scripts qui ont un problème de vérification de version.

$::version étant devenue une constante de format plus ou moins libre, le problème reste entier, on ne pas vraiment s'y fier.
Comment s'assurer que $::numversion n'est pas la variable globale d'un script n'utilisant pas de namespaces pout s'assurer qu'il s'agit d'un Egg <1.8 ?
En gros, comment différencier à coup sûr un Egg 1.6.x d'un Egg 1.8+ ?
Toute l'actualité de mes scripts ici     (dernière mise à jour le 22/04/2020)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction, de quoi l'on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.
  Reply
#6
(19/04/2022, 03:00)ZarTek Wrote: Pourquoi ne pas utiliser [lindex $::version 1] ?
je vois que pour la 1.6.21 il vaut 1062100 et pour la version 1.9.2+stdin il vaut 1090204
ca ressemble a numversion , ce n'ai pas numversion  ?
Oui, c'est exactement ma première proposition (1. l'utilisation de la bonne partie de $version) et qui semble la plus passe partout.

D'après les tests faits par @MenzAgitat, eggdrop 1.6.21 retourne bien 1.6.21 1062100

Ma première idée (donnée hier sur le tchat):

tcl
if {[info exists ::numversion] && [regsub -all {\.} [lindex $::version 1] ""]<1620} {

Ceci permet (en espérant, comme l'a précisé @MenzAgitat, qu'aucun script sur un eggdrop ancien ne crée $::numversion) de certifier qu'un eggdrop est bien inférieur à 1.6.20. Cette idée est finalement inutile, car je n'étais pas sûr de ce que renvoyait $::version.

Mais je pense que le mieux est d'utiliser proprement le N° de version contenu dans $::version:

tcl
if {[package vcompare [lindex $::version 1] 1062100]==-1} {

Ca me semble assez universel et sans trop de retravail sur les différentes variables existantes.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#7
(19/04/2022, 07:41)MenzAgitat Wrote: Petite remarque en passant sur "ta méthode", il s'agit de mon code. C'est le correctif que je suggère pour mes scripts qui ont un problème de vérification de version.
Je suis content que tu l'ai adopté et que tu le suggère en tant que correctif :P

Pour information "le système de gestion des versions d'Eggdrop" avais été revu et mis correctement en place au cours d'une mise a jour 1.8.0 (incluant le nouveau fichier header version.h) de l'eggdrop a avant ça il été hardcoded (codé en dur) dans le code et changer de manière manuel. Ce qui laisse place a des formes de versions variable.

Pour plus d'information sur la mise en place des version voir le setpatch, ainsi que le commit Update Eggdrop versioning system

Depuis, le format de $::version devrais toujours rester sous la forme de liste contenant deux élément:
* le premier la version texte (MNNRR+PATCH)
* le second la version numérique (MNNRRPP)

Avec la confirmation que le deuxième élément de $::version existe déjà sous la bonne forme en v1.6.20, l'utilisation du code suivant est la bonne et la plus pertinente a retenir:


tcl
if { [lindex $::version 1] <= 1062100 } { putlog "Version trop ancienne" }


L'utilisation de
tcl
package vcompare version1 version2

n'ai pas utile, car la version numérique ne contient aucun point. vcompare trouve sont utilité pour comparer des format telle que 1.6.20 <-> 1.9.2
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)