jueves, 17 de mayo de 2018

ZinjaI+GIT y scripts de bash con interfaz gráfica

Iba a empezar describiendo lo maravilloso que es git, pero voy a dar eso por sentado e ir al grano: ¿cómo es que en ZinjaI no hay ninguna funcionalidad específica de integración con git? Antes de que se ilusionen, les adelanto que no, no estoy trabajando en eso. Peeeero... además de justificar mi no, en este post les cuento cómo integrar igual algunas acciones habituales.


Para empezar: ¿Por qué no? Porque es de esas cosas que para hacerlas mal, mejor no hacerlas... Es tan rico el abanico de posibilidades que abre git, y tan compleja cada una, que sería un desafío hacer una interfaz útil para acceder a todo eso. Y además no soy para nada un usuario modelo de git, sino todo lo contrario: uso un 5% de lo que ofrece (y aún así me es increíblemente útil). Entonces no tengo la mejor referencia para definir cómo debería ser la integración, y no quiero fomentar mis malas prácticas. Más aún, aunque pudiese definirla o que alguien lo hiciera por mí, la cantidad de trabajo necesario para implementarla lo haría (al menos por ahora) imposible.


Sin embargo, a mi [mala] manera, lo uso mucho, y entonces aparecen algunas operaciones recurrentes que me gustaría tener a mano en la interfaz. ¿Qué opciones tengo al respecto? Apuntando a lo que hay, siempre se pueden configurar las acciones más habituales como herramientas personalizables. Combinando esto, con bash y otras herramientas como "dialog" o "zenity", podemos hacer cosas realmente interesantes y hasta con interfaz gráfica. En lo queda del post, les comparto un ejemplo para el comando "commit" en su caso de uso más habitual (al menos para mí).

Izquierda: configuración de la herramienta personalizada en ZinjaI. Derecha: primer paso del script (en
modo gráfico, cuando el modo de salida es "Ocultas"), selección de los archivos a incluir en el commit.

Mi script hace lo siguiente:
  1. Si no encuentra ".git", sube un directorio y repite. Esto es para que se lo pueda invocar desde cualquier subdirectorio del repo.
  2. Obtiene la lista de archivos trackeados modificados, y permite al usuario elegir cuáles incluir en el commit; agregando además un último ítem que servirá para añadir nuevos archivos al repo.
  3. Si el usuario seleccionó esa última opción (o si directamente no había modificados), muestra una segunda lista con todos los archivos que git dice desconocer (que no están siendo trackeados, pero tampoco están en .gitignore).
  4. Ejecuta "git add ..." por cada archivo seleccionado, y solicita un mensaje para finalmente hacer el "git commit -m ...".

Interfaz alternativa, que se utiliza cuando en la configuración de la herramienta se selecciona el modo de salida "En terminal".

Dentro del script, hay un algoritmo principal solo se encarga armar las listas y los comandos git; pero delega todo lo referido a la interfaz a un conjunto de funciones. Al principio detecta si está o no en una terminal, y define de formas diferentes cada una de esas funciones. Si hay terminal las funciones utilizan dialog, si no utilizan zenity.


Dialog y zenity (y alternativas como whiptail y kdialog) son herramientas pensadas justamente para este tipo de cosas, y que la mayoría de las distros incluye. Permiten mostrar mensajes, pedir entradas, seleccionar directorios o archivos, mostrar listas o menúes simples, cuadros de confirmación, etc; todo desde un script y en una linea. Es súper útil saber que existen y tenerlas en cuenta.

Admito que renegué bastante con cosas como que grep no anda si no hay consola (a menos que redireccionemos su salida a algún lado como /dev/null); o que para armar correctamente una linea de comandos, cuando los argumentos pueden tener espacios, en bash hay que usar arreglos (si no tarde o temprano habrá problemas con las comillas); y "detalles" así. Pero me sirvió para aprender un poquito más de bash, y el resultado final fue interesante y útil.

En conclusión, les comparto el script para que lo prueben/usen si les puede ayudar; y mejor aún, para que les pueda servir de ejemplo/inspiración para automatizarse sus propias tareas.

No hay comentarios:

Publicar un comentario