Volvemos a ser noticia

12:28 0 Comments

15:37 0 Comments
Esta es la historia real de una ruptura: un responsable de gestión de la configuración nos cuenta el motivo por el que finalmente terminó con su querido sistema: Clearcase.Probablemente suene chistoso, pero por favor sigan leyendo detenidamente y encontrarán los hechos detrás de esta decepción...Esto es lo ocurrido según nuestro cliente:
Se configura una vista y se puede empezar a trabajar con cualquier herramienta, las fuentes estaban ahí cuando se necesitaban. Era un entorno rápido y avanzado. Con versionado de directorios, así que se podía cambiar la estructura del código sin problema. Ofrecía un avanzado sistema de ramas y de integraciones, con seguimiento de las integraciones, y la estrategía de ramificación que utilizábamos en ese momento era la de rama por tarea. Era posible hacer esto de manera eficiente con clearcase ya que era realmente bueno en manejo de ramas e integraciones.
¡Y tenía todo esto hace 12 años!
Y el hecho asombroso es que mientras que el resto del mundo ha ido evolucionando clearcase ha escogido la dirección errónea.
Hizo un intento con la implementación más fea jamás concevida para un entorno de gestión de la configuración, UCM (Gestión del Cambio Unificado), intentando imponer un proceso que aumentaba la carga de trabajo de manera absurda encima de la base anterior. Se olvidó completamente de su antiguo amor, el desarrollador, intentando impresionar a aquellos que odiaban el desarrollo. Rompió con la idea de "rama por tarea".
Dejo de tener una interfaz de usuario consistente en todas las plataformas que soporta, utilizando clearcase de diferente manera para UNIX, Microsoft windows o Linux, lo cual cambia bastante. La interfaz gráfica de clearcase para UNIX y Linux es realmente mala. ¿Y por qué tiene la línea de comandos tantas características en comparación con el cliente gráfico? ¿Y por qué se ignora a Apple?
El hecho de que no haya una manera estándar de hacer una protección o desprotección recursiva, los mensajes de error que parecen no tener nada que ver con el error real, el hecho de que si se cambian los finales de línea en los ficheros de texto de un entorno multiplataforma y las herramientas de integración y comparación que dan errores, el hecho de que un número de caracteres en una línea, por ejemplo, en un fichero XML, está limitado y hace que la integración falle...estas son las cosas que podía aguantar.
Pero el verdadero obstáculo viene con las integraciones con otras herramientas como eclipse, WSAD, Visual studio, etc... , estas integraciones son de hecho tan sólo integraciones que permiten hacer protecciones y desprotecciones, cualquier otra operación de clearcase es complicadísima en estos entornos. Simplemente el cambiar de vistas en un entorno de desarrollo a una vista en otra rama en el mismo proyecto es casi imposible, haciendo que la potencia de la estructura de ramas sea inútil.
Mientras que en los viejos tiempos clearcase era invisible para el desarrollador, un compañero silencioso y servicial, ahora hace que el trabajo del desarrollador sea dificil, lento y engorroso. Algunos incluso dicen que volver a la edad de piedra de las prácticas de gestión de la configuración utilizando herramientas como CVS o Subversion, es mejor que utilizar clearcase.
Y justo en el momento en el que necesitaba sentirme joven de nuevo, y encantado con el desarrollo de software, un producto bonito, jóven y libre apareció en escena, creado por desarrolladores para desarrolladores, se centra de nuevo en cómo se puede hacer el desarrollo y las integraciones de manera eficiente, rápida y potente. Con una apariencia consistente en todas las plataformas que soporta. (incluso funciona en Apple, a quien ClearCase siempre ignoró), con un entorno de creación de ramas y de integración, con buenas integraciones con entornos de desarrollo, por lo que el cambiar los espacios de trabajo a otra rama es una tarea muy rápida y fácil, con seguimiento de integraciones y un correcto versionado de directorios.
De hecho, con todo lo bueno de clearcase y una solución para la mayor parte de los problemas que tiene.
Por favor, echen un vistazo a Plastic SCM 2.0 lo antes posible, ¡no os defraudará!
12:36 0 Comments
He customizado la vista de changesets para que muestre revisiones. Y estoy utilizando el sistema de consultas para obtener las revisiones que he creado desde el día 1 de Abril en nuestro repositorio principal.
Entonces utilizo el filtro para centrarme en las revisiones del directorio 01nerva
Esta consulta es muy sencilla:
find revisions where date >= '4/1/2008' and owner = 'pablo' on repository 'codice'
Claro que podría ir incluso más allá e intentar centrarme en las revisiones creadas en una rama en concreto, o más que las de un changeset concreto, etc...
La siguiente consulta localizará las revisiones creadas en dos repositorios después de una fecha dada en una rama diferente de la rama principal o main.
find revisions where date >= '4/1/2008' and owner = 'pablo' and branch != '/main' on repositories 'codice','pnunit'
Como se puede ver, el sistema de consultas es muy útil para crear informes de actividad, localizar determinados cambios, inspeccionar modificaciones, etc.
¡Espero que os ayude!
10:03 0 Comments


rep "default"
path "/"
label "BL001"
Le estamos diciendo a plastic:
descarga todo lo que esté marcado con BL001. Así que, ¿qué es lo que esperamos que se descargue?
¡Nada!
Obtendremos un error que dirá que no se puede cargar el ítem raíz.
¿Por qué? Bueno, recordemos cómo Plastic resuelve los selectores: primero coge el ítem raíz y busca una revisión utilizando las reglas de los selectores. Así que intentará encontrar una revisión para el ítem raíz etiquetada con BL001 y... si, no puede... se terminó.
Así que, o se etiqueta el ítem raíz también, o se proporciona una regla que cargue la raíz.
rep "default"
path "/"
label "BL001"
path "/"
branch "/main"
Este selector resuelve el problema.Irá a la segunda regla para encontrar la revisión del ítem raíz, con lo que el problema está resuelto.
Ahora entenderéis por qué es tan peligroso el etiquetar revisiones separadas en vez de todo el espacio de trabajo, a no ser que se sepa muy bien lo que se está haciendo.
Las etiquetas son muy útiles ya que proporcionan una gran flexibilidad. En el siguiente ejemplo si se especifica un selector como el anterior se cargará el árbol del espacio de trabajo como el de la parte inferior de la figura.

$ cm mkbr br:/task001
rep "default"
path "/"
branch "/task001"
co "/task001"
rep "default"
path "/"
branch "/task001"
path "/"
branch "/main"
rep "default"
path "/"
branch "/task001"
co "/task001"
path "/"
branch "/main"
co "/task001"
rep "default"
path "/"
branch "/task001"
co "/task001"
path "/"
label "BL059"
co "/task001"
rep "default"
path "/"
branch "/task001"
co "/task001"
path "/"
branch "/main"
co "/task001"
$ cm mkbr br:/main/task001
rep "default"
path "/"
br "/main/task001"
co "/main/task001"
rep "default"
path "/"
br "/main/task001" label "BL051;LAST"
co "/main/task001"
rep "default"
path "/"
br "/main/task001" label "BL051"
co "/main/task001"
rep "default"
path "/"
br "/main/release50/bug-fix490" label "stable040;BL050;LAST"
co "/main/release50/bug-fix490"
rep "default"
path "/"
branchpertask "/main/task001" baseline "BL009"
rep "default"
path "/"
branch "/main/task001" label "BL009"
checkout "/main/task001"
10:50 0 Comments
repository "default"
path "/"
branch "/main"
checkout "/main"

Un ítem representa un fichero o un directorio, pero es muy importante tener en cuenta que realmente no se parece a un elemento real en un sistema de ficheros. Es un poco difícil de entender al principio. Un ítem le dice a Plastic que "algo" existe, pero no da más información a Plastic.
La información real asociada a un item va dentro de las revisiones. Cada item tiene una o más revisiones y las revisiones, como ya sabréis, están dentro de las ramas.
Como programadores podemos pensar en los ítems como "clases" y "revisiones" como sus casos. ¿Está más claro ahora?
Y podéis pensar: vale, y los ítems almacenan los nombres de los ficheros y de los directorios...¡incorrecto! Es un poco más complicado que eso y da mucha más flexibilidad.
Los nombres de los ficheros y de los directorios están almacenados como datos en las revisiones de los directorios. Quiero decir, ¿cuáles son los datos de un fichero en concreto? Bien, esto está claro, le contenido del fichero, ¿verdad? Entonces, ¿cuáles son los datos de un directorio? ¿Los ficheros y directorios que contiene? Así que cuando se crea un ítem, su nombre no esta asociado al propio ítem, sino que se incluye como información dentro del directorio que contiene el fichero o el directorio. Esto es exactamente por lo que hay que desproteger el directorio padre para añadir un fichero o un directorio, como os habréis dado cuenta al utilizar Plastic.
Hay algo muy importante aquí, que es crítico a la hora de hablar de los selectores: la información del directorio contiene los nombres de los ítems que contiene ese directorio, no los nombres de las revisiones. Por lo que un directorio sabe qué ítems contiene, pero no las revisiones exactas, que se decidirán en cada momento según las reglas de un selector concreto.
Veamos un ejemplo sencillo. Al crear un nuevo repositorio en Plastic se crearán los siguientes objetos por defecto: un ítem raíz (ítem especial que es la raíz del directorio del nuevo repositorio, por lo que se le pueden añadir contenidos), una rama principal (la rama "/main", con la que posiblemente estaréis familiarizados) y una revisión del ítem raíz dentro de la rama principal. Esta revisión es la que permite comenzar a trabajar con el repositorio recién creado.
Si configuráis un selector como el que se describe arriba y se actualiza, se descargará el contenido del nuevo repositorio.
Para la resolución del selector Plastic siempre intentará encontrar el ítem raíz de cada repositorio. Todos los repositorios tienen un ítem raíz, si no es así es que ha habido algún problema con el repositorio y el sistema abortará la operación. En el selector anterior el repositorio es "default".
Una vez que el ítem raíz esta localizado intentará localizar una regla que lleve a la ruta actual. La ruta actual es "/" por lo que se puede utilizar la primera regla.
Intentar configurar el siguiente selector para trabajar con el nuevo repositorio y veamos lo que ocurre:
repository "default"
path "/dumb"
branch "/main"
checkout "/main"
Entonces Plastic dará el siguiente mensaje:
No se puede cargar el ítem raís. El selector del espacio de trabajo posiblemente contenga errores
¿Por qué?, Está intentando cargar una revisión del ítem raíz y encuentra que ninguna de las reglas cumple la ruta "/" ya que necesitan que la ruta sea, al menos "/dumb", y no se puede cargar el directorio raíz.
Si utilizamos el selector apropiado (con una regla de ruta "/") plastic será capaz de localizar la regla que le está diciendo: "carga la última revisión en la rama main". Hay tan sólo una revisión en la rama main en este momento, que es la revisión raíz (la primea, la última y la única que existe por el momento para el ítem), así que se cargará.
Entonces Plastic obtendrá los datos de la revisión raíz. Está vacía por lo que el selector está solucionado.
¿Qué ocurre si ahora añadimos un nuevo fichero dentro del espacio de trabajo?. Para hacer esto (la interfaz gráfica lo gestiona automáticamente, pero desde la línea de comandos habría que desproteger manualmente el directorio raíz) el directorio raíz se desprotegerá, se creará una nueva revisión en estado de desprotección y después se creará un nuevo ítem para el nuevo fichero (por ejemplo file01.txt). Se creará una entrada para file01.txt en la revisión desprotegida del directorio raíz apuntando al ítem nuevo. Después se creará una revisión (en estado de desprotección) para file01.txt. Si ahora se protegen tanto el directorio como el fichero, se obtendrá algo como en la siguiente figura.

Hay dos conclusiones interesantes que hay que entender después de haber llegado a este punto: primero. cómo se almacena la información en las revisiones de los directorios, y segundo: cómo un directorio apunta a su contenido por ítem y no por revisión.
Juguemos un poco con Plastic, y creemos un par de revisiones nuevas del fichero file01.txt. Lo hacemos desprotegiendo el fichero, añadiendo más contenido, protegiéndolo, desprotegiéndolo de nuevo y protegiéndolo otra vez.
Tenemos algo como la siguiente figura.
Ahora juguemos un poco con el selector.
Vamos a configurar el siguiente selector a ver qué pasa:
repository "default"
path "/"
branch "/main" revno "0"
checkout "/main"
repository "default"
path "/file01.txt"
br "/main" revno "0"
path "/"
branch "/main"
Exploremos una segunda (y algo más compleja) posibilidad:
repository "default"
path "/?"
br "/main" revno "0"
path "/" norecursive
branch "/main"
Estudiamos el selector detalladamente.
Las reglas de ruta entienden ahora dos caracteres diferentes: * y ?. * que quiere decir 0 o más y ? para 1 o más. Así que estamos diciendo a Plastic que para cada ruta que comience con / y contenga al menos un caracter, ir a la primera regla y si no ir a la segunda.
La segunda regla, que es la que carga ahora el ítem raíz, utiliza una nueva palabra: norecursive que significa: utilizar esta regla sólo para rutas que sean exactas a la regla, no para ficheros o directorior "dentro" de la ruta en la regla.
¿Estáis familiarizados con los changesets? Un changeset se parece a un commit atómico y se crea cada vez que se protege uno o varios ficheros o directorios a la vez. Se genera un número de identificación que se asigna a la revisión que se ha protegido a la vez. Este número es el changeset.
Las reglas del selector también se pueden utilizar para trabajar con changesets. Supongamos que queremos cargar las revisiones del changeset "0" que es el creado por defecto con la revisión inicial del directorio raíz, se configuraría un selector como el siguiente:
repository "default"
path "/"
branch "/main" changeset "0"
0 comentarios:
Publicar un comentario