close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#1376 closed doubt (fixed)

doubt on Set TolPackage::Client::GetDeepDependencies.all( [[ "MMS.0.6044" ]] );

Reported by: Jorge Owned by: Víctor de Buen Remiro
Priority: high Milestone: TOL Packages
Component: Kernel Version: head
Severity: major Keywords:
Cc:

Description

When executing GetDeepDependencies.all for MMS.0.6044

Set TolPackage::Client::GetDeepDependencies.all( [[ "MMS.0.6044" ]] );

we get different versions for the same package, for instance:

"ExtLib.1.2"
"ExtLib.1.6"
"ExtLib.1.7"

is that correct?

Change History (3)

comment:1 Changed 13 years ago by Víctor de Buen Remiro

Lo que hace esa función es recorrer recursivamente los paquetes que requiere y los que requieren éstos y así sucesivamente.

Los requerimientos en un paquete, salvo excepciones muy raras no deberían contener una versión exacta sino el nombre genérico del paquete. La versión concreta que se requiere de un paquete no es algo determinado, en principio existirá un rango de versiones válidas que tampoco es trivial determinar. Cuando se crea un paquete se toma la versión de los paquetes requeridos que en ese momento son las más modernas en la máquina local donde se está creando el paquete.

Esta información puede ser interesante precisamente para comprobar posibles estados de incongruencia por lo que la función no debería cambiar su comportamiento. A efectos reales del usuario, lo que de verdad le importa es qué versiones van a ser cargadas en realidad para cada paquete, que serán las más modernas disponibles. Si el usuario tiene los repositorios actualizados serán las versiones más modernas de cada uno las que se carguen.

Por ejemplo, pongamos que nuestro paquete P requiere de los paquetes A y B, y ambos a su vez requieren de C. Cuando se creó A la versión de C era la 1.1 pero cuando se creó B era la 1.2; por lo que ambos son devueltos por GetDeepDependencies.all como es su deber. En condiciones normales será C.1.2 la versión que se cargue con nuestro P, pero, si mientras tanto ha surgido una versión C.1.3 esta será la versión cargada. Pero si por algún tipo de manipulación la más moderna es la C.1.1 pues se cargará sin más.

A efectos de información al usuario, para no crearle más confusión que otra cosa, lo más sensato sería quedarse con la versión más moderna de las que nos devuelva GetDeepDependencies.all, pues en principio debería suplir a las anteriores con alguna ventaja añadida. Para mayor comodidad, podría hacerse una función GetDeepDependencies.all.unique que lo hiciera.

Para evitar que ocurran estas cosas muy a menudo, se deberían crear parches de los paquetes sin cambio de versión, al menos cada vez que se genera una nueva versión de alguno de los paquetes de los que depende. De esa manera se pisaría la versión actual con una idéntica en funcionalidad pero con las dependencias actualizadas. Cuando el desarrollador es el mismo no es demasiado complicado porque más o menos tiene el árbol en la cabeza, pero cuando hay paquetes de diferentes autores la cosa se complica bastante.

Como en los paquetes figuran las direcciones de e-mail de los autores, podría pensarse en un sistema de e-mail automático que les enviara una notificación para recordarles que deben parchear tal o cual paquete.

comment:2 Changed 13 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: newclosed

(In [3963]) Fixes #1376

comment:3 Changed 13 years ago by Víctor de Buen Remiro

Esta es la nueva función para evitar el problema:

//Gets the list of deep depencies of a list of last versions of required packages.
Set TolPackage::Client::GetDeepDependencies.all.last(Set package.version.list)

En lugar de sufijo unique le he puesto last que es más claro

Note: See TracTickets for help on using tickets.