Análisis de repositorios de Software Libre. Primeros pasos con CVSAnalY.

Alguna vez nos hemos interesado por un programa de Software Libre para usarlo en un proyecto pero no sabemos como respira su comunidad, es decir, si disfruta de una salud de hierro o está herida de muerte. Esto es importante porque si implantamos un proyecto con dicho software y desaparece su comunidad nos encontraremos con muchos problemas: de seguridad, de mantenimiento, de soporte, de nuevas funcionalidades, …

En este post os presento CVSAnalY, un paquete que nos permite analizar un repositorio de software y almacenar la información obtenida de él en una base de datos. Entre dicha información podremos encontrar autores/committers, número de commits, número de ficheros, … y, por supuesto, todas las relaciones entre ellos. Por ejemplo, una cosa que me pareció muy interesante para saber como respira un proyecto es saber como va su comunidad y para ello un aspecto llamativo es la territorialidad (también conocida como, knowledge concentration), es decir, cuántos ficheros de un proyecto son tocados única y exclusivamente por un solo desarrollador, esto es importante ya que si ese desarrollador desaparece, el proyecto podría quedar “cojo”. Bueno, no me lío más y como ejemplo final os pondré las consultas para obtener la territorialidad de un proyecto.

CVSAnalY, historia e información básica.

CVSAnalY, como no podría ser de otra forma,es Software Libre y nació , en su nueva versión, en julio de 2006 de la mano de Libresoft y entre sus desarrolladores están: Carlos García Campos, Gregorio Robles, Alvaro Navarro, Jesús M. González-Barahona, Israel Herráiz, Juan José Amor, Martin Michlmayr, Álvaro del Castillo, Santiago Dueñas y Daniel Izquierdo (ya que son pocos, espero no olvidarme a ninguno) con la función de analizar repositorios de código. Esta desarrollado en Python, tiene licencia GPLv2.0 o posterior y su última versión estable es la 2.1.0 de finales de octrubre de 2011.

Requerimientos de CVSAnalY.

Para funcionar, CVSAnalY, tiene las siguientes dependencias:

  • RepositoryHandler ** git clone git://github.com/MetricsGrimoire/RepositoryHandler.git
  • cvs (optional, for CVS support)
  • subversion (optional, for SVN support)
  • git (optional, for Git support)
  • Python MySQLDB (optional but recommended)
  • Python SQLite (optional)

Insatalación de CVSAnalY.

Antes de instalar CVSAnalY debemos tener instalado MySQL. Después crearemos un directorio donde instalarlo, realizaremos una clonación desde su repositorio y, para finalizar, ejecutaremos la instalación:

$ mkdir CVSAnalY
$ cd CVSAnalY/
$ git clone https://github.com/MetricsGrimoire/CVSAnalY.git
Cloning into CVSAnalY...
remote: Counting objects: 2802, done.
remote: Compressing objects: 100% (782/782), done.
remote: Total 2802 (delta 2000), reused 2795 (delta 1993)
Receiving objects: 100% (2802/2802), 1.48 MiB | 117 KiB/s, done.
Resolving deltas: 100% (2000/2000), done.

$ git clone https://github.com/MetricsGrimoire/RepositoryHandler.git
Cloning into RepositoryHandler...
remote: Counting objects: 584, done.
remote: Compressing objects: 100% (160/160), done.
remote: Total 584 (delta 421), reused 565 (delta 414)
Receiving objects: 100% (584/584), 115.33 KiB | 73 KiB/s, done.
Resolving deltas: 100% (421/421), done.

$ cd RepositoryHandler
$ sudo python setup.p install
$ cd CVSAnalY
$ sudo python setup.p install

Para comprobar si funciona ejecutar desde dentro del directorio CVSAnalY lo siguiente:

$ ./cvsanaly2 --help

NOTA: Si no está instalado el conector de Python con MySQL instalarlo con:

$ sudo apt-get install python-mysqldb

Teóricamente ya lo tenemos perfectamente instalado. El siguiente paso es descargarnos un repositorio y analizarlo.

Analizando GIT con CVSAnalY.

Primero nos descargaremos el repositorio de GIT, después crearemos una instancia de base de datos vacía en MySQL y para finalizar ejecutaremos CVSAnalY para extraer los datos del repositorio.

$ mkdir analisis

$ cd analisis

$ git clone https://github.com/git/git.git
Cloning into git...
remote: Counting objects: 146525, done.
remote: Compressing objects: 100% (48847/48847), done.
remote: Total 146525 (delta 107068), reused 133313 (delta 95748)
Receiving objects: 100% (146525/146525), 33.65 MiB | 67 KiB/s, done.
Resolving deltas: 100% (107068/107068), done.

Ahora creo la instancia de base de datos

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 114
Server version: 5.1.61-0ubuntu0.11.04.1 (Ubuntu)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights 

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input 

mysql> create database master_log_git_2013;
Query OK, 1 row affected (0.04 sec)

mysql> exit;
Bye

Y, para finalizar lanzo el análisis. Ojo, tenemos que saber el usuario administrador de la base de datos, su contraseña y el nombre de la instancia que le dimos anteriormente.

cd git

/analisis/git$ 

$ /home/suso/CVSAnalY/CVSAnalY/cvsanaly2 --db-user=root \
--db-password=XXXX --db-database=master_log_git_2013

Parsing log for /home/suso/analisis/git (git)
Warning: Detected empty branch 'master', it'll be ignored
Warning: Detected empty branch 'maint', it'll be ignored
Database looks empty, removing cache file /home/suso/.cvsanaly2/...
Executing extensions

Y, ahora, ¡A jugarrrrrrr!

Primero accedo a la base de datos, selecciono la instancia creada y después, por ejemplo, consulto el número de commits.

suso@capta-ud32:~/analisis/git$ mysql -uroot -p
Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 122
Server version: 5.1.61-0ubuntu0.11.04.1 (Ubuntu)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights 

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input 

mysql> show databases;

+--------------------------------+
| Database                       |
+--------------------------------+
| information_schema             |
| db_prueba                      |
| fm3_audacity_cvsanaly2_cvs_scm |
| fm3_brasero_cvsanaly2_svn_scm  |
| fm3_evince_cvsanaly2_svn_scm   |
| master_log_git                 |
| master_log_git_2012            |
| master_log_git_2013            |
| master_log_hg                  |
| master_log_svn                 |
| mysql                          |
| testing_project                |
+--------------------------------+
12 rows in set (0.05 sec)

mysql> use master_log_git_2013;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select count(*) from scmlog;
+----------+
| count(*) |
+----------+
|    32866 |
+----------+
1 row in set (0.00 sec)

mysql>

NOTA: la documentación la podemos encontrar en el directorio: CVSAnalY/help/doc

 

Lo prometido es deuda.

Al principio os prometí que os indicaría como obtener la territorialidad de un proyecto, en este caso para GIT y sólo para el año 2012, ¡pues vamos a ello!

La territorialidad se podría definir como:

Territorialidad = (Ficheros_tocados_único_desarrollador/Ficheros_totales) * 100

Lo primero es saber cuántos ficheros han sido modificados por un solo desarrollador, eso se puede hacer con la siguiente query:

mysql> select a.file_id,count(distinct(s.author_id))
    -> from actions a, scmlog s
    -> where a.commit_id=s.id and year(s.date)=2012
    -> group by a.file_id
    -> having count(distinct(s.author_id))=1;

|    3340 |                            1 |
|    3352 |                            1 |
|    3353 |                            1 |
|    3354 |                            1 |
|    3356 |                            1 |
+---------+------------------------------+
534 rows in set (2.24 sec)

mysql>

Ahora obtenemos el número total de ficheros modificados:

mysql> select count(distinct(a.file_id)) from actions a, scmlog s
    -> where a.commit_id=s.id and year(s.date)=2012;
+----------------------------+
| count(distinct(a.file_id)) |
+----------------------------+
|                       1046 |
+----------------------------+
1 row in set (1.16 sec)

mysql>

Entonces la territorialidad quedaría como:

Territorialidad = (534/1046) * 100 = 51%

Esto significa que más de la mitad de los ficheros han sido tocados por un único desarrollador. Según lo que nos han indicado en clase un valor por debajo del 80% es aceptable, con lo que GIT, en lo relativo a la territorialidad está bien.

Conclusión final.

Esta es mi primera incursión en el análisis de repositorios y me parece muy interesante. El principal problema que me encuentro es saber construir la consulta (query) de forma correcta para obtener lo que quiero, no sé si existe, pero creo que sería una buena idea crear algún interfaz con las consultas más típicas para extraer dicha información de la base de datos de CVSAnalY, bueno, aunque no soy programador a lo mejor me animo.

Espero que os haya resultado interesante, hasta otra …

 

Enlaces de interés:

 

Esta entrada fue publicada en Casos de estudio I, Evaluación de proyectos, Gestión de proyectos y etiquetada , , , , , , . Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>