De momento un archivo de commit tiene como parte de su contenido su propio SHA1:
http://www.safa-dcs.org/safa_object_model.html
Content: It's pwn SHA-1...
SHA-1
6ff87c4664981e4397625791c8ea3bbb5f2279a3
Fijense que esto es bastante jodido de lograr y poco practico.
El nombre del archivo esta definido como el SHA-1 del tree patch al que apunta.
Que les parece si definimos el nombre del archivo como su SHA-1 y
eliminamos el campo, su propio SHA-1?
Saludos,
NIco
Hola Nico,
Fijate que en el hilo de asunto "[safa] - Web" mencione esto mismo,
hay que cambiarlo en el modelo porque este campo no iría. No es porque
es jodido de lograr, es porque es estadísticamente imposible, que es
peor.
El problema de definir el nombre del commit como su propio SHA-1 es
que nos guiaría a un diseño inflexible como el de Git. Ya no podrías
cambiar el commit porque eso guiaría a cambiar su SHA-1, y eso guiaría
a cambiar todas las referencias al commit, porque se llama como su
SHA-1, y es un ciclo de nunca acabar que te lleva a hacer lo que hizo
Linus: Excusar pobremente un mal diseño.
No parece grave a simple vista, pero la edición de commits es
precisamente el factor de diseño que permite que agreguemos los
commits abstractos, cambiemos el tamaño del repositorio, hagamos
detach de partes del historial para archivarlas o borrarlas, mandemos
historiales de un rango de tiempo determinado y no historiales
completos, etc, etc...
La consistencia criptográfica la fijaremos luego con los trackers, que
son un mecanismo paralelo a futuro, para no quedar pagando con las
huellas de los commits.
Bajate el ultimo tarball y fijate que hice un safa-commit (esta en
Perl). Ese tiene el modelo del objeto commit. Podes ponerlo en marcha
a priori haciendo esto en una carpeta vacía cualquiera con safa
instalado o alterando la variable PATH para agregar la de los fuentes
de SAFA (no lo probe porq estoy en el laburo, pero debería funcionar):
$ safa-initrepo
$ echo foobar > README
$ echo README > .safa/addindex # aca creas el index a mano porque
depende del que estas haciendo
$ safa-commit -m "ningunAsunto"
Eso te debería crear un objeto en .safa/commits que contiene el SHA-1
del tree en .safa/trees, y el TREE solamente contiene a README.
Ese sería el modelo de commit, hace un 'cat .safa/commits/*' y estamos
Como verás, ya estamos casi funcionando en esto =)
Saludos
Igual si podes, mandame el odt así lo agregamos a los fuentes, fijate
que en el tarball 'safa-a14a5ba54e.tar.gz' [el ultimo], está doc/es.
Deberíamos agregar doc/en ahi también, y dejar esos documentos en la
web solamente como una referencia online (ej, algunos pecadores no
tendrán LibreOffice instalado).
Saludos
PATCH sha-1_patch
Asumo que el sha-1_patch es el nombre de un delta tree que que esta en
.safa/trees verdad?
2011/12/12 Dario Rodriguez <soft....@gmail.com>:
Un PATCH es un tipo de objeto que aún no manejamos, que apunta a uno o
más archivos diff. El objetivo de un PATCH es ahorrar espacio, ya que
al cambiar una línea de un archivo que puede tener 1000, el diff
ocupará solo unas pocas líneas, mientras que almacenar el nuevo BLOB
completo ocupará otras 1000.
Un DELTA TREE es un subtipo de TREE, y transparente para todas las
operaciones de lectura a través de safa-cat-tree. Los únicos comandos
que ven la diferencia entre un TREE y un DELTA TREE son los que
escriben árboles, y solo a través de un proceso que aún no tenemos,
que es el deltificador.
Si el commit apuntara a un DELTA TREE, el mismo estaría en el campo
TREE de los COMMITS.
** Como tu pregunta es sobre el safa-check-from-commit:
Por ahora, este procedimiento debería leer el TREE asociado a un
COMMIT, y eso se hace tomando el SHA-1 del campo TREE, y llamando a
safa-cat-tree para que interprete.
Cuando comencemos a trabajar con PATCHes, este será uno de los
comandos modificados, ya que deberá verificar si el COMMIT es un
parche, para llamar a otro(s) comando(s). Aún no tengo resuelto ese
flujo.
Saludos
--
Dario
2011/12/15 Dario Rodriguez <soft....@gmail.com>:
~/safa/hola $ safa-check-from-commit
6ff6fc1bbe9a105379712eb3f0c60280058d3bf4 readme
[error] tree does not exist: 'TREE:6ff6fc1bbe9a105379712eb3f0c60280058d3bf4'
~/safa/hola $ find .safa/trees/
.safa/trees/
.safa/trees/6ff6fc1bbe9a105379712eb3f0c60280058d3bf4
No entiendo porque pasa, despues lo veo
Saludos
--
Dario
con respecto al problema es que en el commit que fabrique estaba
usando como separador de campos el tab y vos tenes TREE.
Fijate que reproduje el error en el repo de test borrando el tree, y
el error es [error] tree does not exist: y nombre de archivo y a vos
te tiro: [error] tree does not exist: TREE:nombre de archivo
Es cuestion de ponernos de acuerdo en el formato. Si safa-commit
genera archivos con TREE: lo uso como separador de campo para esto.
Saludos,
Nico
[error] tree does not exist: '93fedb04aed243712556aa686c3ba66960d88d1d'
2011/12/16 Dario Rodriguez <soft....@gmail.com>:
Lo de la ejecución condicional no me gusta mucho con corchetes, porque
algunos shells me han fallado. Sin embargo, creo que algo como:
test -z "$name" && {
echo -e "Vacia"
} || {
echo -e "No vacia"
}
Me gusta más. Igual la idea de esto es tener borradores para la API
que será en C.
Te adjunto el código. Sobre los backtricks no se si sería buena idea.
Son una horrible sintáxis cuando anidamos, y a decir verdad no hay que
tener un bash muy nuevo para usar $(). Yo lo uso en AIX 5 2, e incluso
KSH lo acepta.
Saludos
--
Dario
Ese era el cambio de safa-check-from-commit, te podes bajar todo el
fuente (excluyendo ese cambio que todavia no puse) desde:
Saludos
--
Dario
Ahora me interesa terminar con el safa-add así puedo versionar safa
con safa, y ya nos queda hacer un checkout y un script para bajar las
cosas de la web, y monto un repo HTTP.
Me parece una idea copada porque a pesar de ser todavía lineal,
permite trabajar fácil con las descargas, y no es complejo agregar las
ramas, solamente falta un safa-resolve-ref, que lea las referencias
como HEAD y las branches.
Saludos
--
Dario
2011/12/17 Dario Rodriguez <soft....@gmail.com>:
Salute,
Nico
2011/12/18 Nicolas Palumbo <napa...@gmail.com>:
[debug] DIE (File not in tree)
FILE_LINE=$(safa-cat-tree "$TREE_NAME" | grep "$FILE_NAME")
DEBUG_print "FILE_LINE: '$FILE_LINE'"
if test -z "$FILE_LINE"
then
check_from_commit_DIE "File not in tree"
fi
si les parece cambio el codigo de esta manera:
if test -z "$FILE_LINE"
then
test $BE_QUIET -eq 0 && DIE File did not exist in $COMMIT_NAME
exit 2
fi
2011/12/19 Dario Rodriguez <soft....@gmail.com>:
La funcion DIE:
DIE() {
DEBUG_print "DIE ($*)"
ERROR_print $*
exit 1
}
Devolvería 1. Me parece mejor usar check_from_commit_PRINT, que
verifica BE_QUIET por su cuenta. Entonces saldrá siempre por el mismo
lugar, siempre con 2.
Fijate con el parche adjunto, supongo que sería algo así
Saludos
--
Dario
Gracias Nico por el parche!
Fijense que funcionalmente, este patchset sería algo como:
"teach check-from-commit operation about new files"
Si trabajaramos con ramas, este trabajo estaría muy diferenciado en
cuanto a funcionalidad. Nico hubiera tenido otra rama para probar esto
tranquilo, hacer varios commits de prueba y finalmente ver cuál es la
opción que queda. Una vez validada la opción correcta, se trata de
ponerlo ordenadamente en el repositorio, así que se buscará uno o más
commits según sea conveniente, se intentará hacer que no haya cambios
innecesarios que dificultan el parcheo en caso de merges de 3 caminos
(como poner un salto de línea extra en la linea 2 cuando todas las
modificaciónes estaban entre la 40 y la 45, por ejemplo), etc...
Les digo esto porque empezaríamos a ver el tema de las branches, y
quiero que cada uno tenga un concepto claro acerca de ¿porqué usar
branches?, así podrán opinar sobre lo que realmente creen y no sobre
algo de teoría que leyeron por ahi...
Cuando tenga un rato actualizo el sitio, se los prometo,
Saludos
Dario