@ agnasg

Usar el cerebro

10-10-2017 6:27 PM

Súbitamente, sin aviso ni protesto, comencé a trabajar de nuevo en mi juego, luego de un par de meses de casi alguna actividad (porque “casi ninguna” es mucha, ¿correcto?) El punto es que recordé por qué lo había abandonado en un alarde de desidia: tiene un bug, uno de esos bugs incomprensibles que no puedes detectar con el debugger, sino que, lamentablemente, requiere que uses el cerebro (sí, eso duele, lo se). El problema es  que ni siguiera el bug se comportaba uniformemente de una versión a la otra. La 139 funcionaba, la 140 con el CSpell de la 139 también, pero las 141 con  el CSpell de la 139 no funcionaba pero los cambios de 140 -> 141 no eran (o no parecían relevantes al bug), era, en fin, una pesadilla incomprensible.

Pasé a una fase minuciosa de comparación de versiones dado que no he estado utilizando git en este proyecto. Lo usé con un roguelike hace años pero por razones que no recuerdo no lo quise usar más. Quizás para hacerme la vida más difícil (¿por qué hacer las cosas fáciles?). Comencé a buscar como comparar directorios porque es algo que no hacía desde hace tiempo. Probé con


find /dir1/ -type f -exec md5sum {} \; > dir1.txt
find /dir2/ -type f -exec md5sum {} \; > dir2.txt

diff dir1.txt dir2.txt

que simplemente indica de una forma poco amigable cuáles archivos son diferentes en los directorios “dir1” y “dir2”.

Luego encontré que con git también se puede hacer sin necesidad de un repositorio:

git diff --no-index dir1/ dir2/

Pero esto tampoco ayudó mucho. Así que esta era una excelente oportunidad para reinventar la rueda, y surgió en pocos minutos un script bash que compara dos directorios:


#!/bin/bash
# Bourne shell script
# compare two folders
# select files
if [ $# -ne 2 ]; then
echo "USAGE: compare folder1 folder2"
exit
fi
p1=$1
p2=$2
files1=( `ls $p1` )
files2=( `ls $p2` )
# n=${afiles[*]} is not available everywhere...
# or maybe yes
## how many are
n=${#files1[*]}
idx=0
while [ $idx -lt $n ]
do
diff -q "$p1/${files1[idx]}" "$p2/${files2[idx]}"
let "idx = idx + 1"
done

Con ayuda de este script logré encontrar el bug, finalmente. Resulta que “virtual bool OnEvent(const SEvent &event) en class MyEventReceivervirtual bool OnEvent(const SEvent &event) en class MyEventReceiver llama a CSpell::GetClass(), y esto accede a varias funcionalidades del motor gráfico ANTES de que el motor esté arriba. ”

El éxito merecía un descanso y seguí viendo en Netflix “Orange is the new black” que trata sobre unas delincuentes en una cárcel, que ciertamente suena deprimente, pero en realidad es la serie más graciosa que he visto en mucho tiempo (desde Californication, creo). El punto es que mi cerebro comenzó a relajarse, y relajarse, y relajarse y entonces “¿Yo no tenía una herramienta para comparar directorios, con ventanas, full funcionalidad, etc?”. No me acordaba del nombre pero sí del ícono. Lo busqué en el escritorio, en el menú, y finalmente en programas y características en el panel de control. WinMerge. Perfecto para comparar directorios, fácilmente, relajado. Lo anoté en mi chuletario, en la bitácora, etc. para que no se me vuelva a olvidar. Porque parece que tenía años que no se me presentaba un bug de este estilo y que requiere cirugía de respaldos. Y usar el cerebro. ¡Ouch!