check-from-commit

5 views
Skip to first unread message

Nicolas Palumbo

unread,
Dec 12, 2011, 12:48:03 PM12/12/11
to safa...@googlegroups.com
Hola, estaba revisando el formato de un commit para escribir check-from-commit.

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

Dario Rodriguez

unread,
Dec 12, 2011, 1:11:22 PM12/12/11
to safa...@googlegroups.com
2011/12/12 Nicolas Palumbo <napa...@gmail.com>:
> --
> --------------------
> Recibes esto porque estas suscrito a "safa-dcs" en GoogleGroups.
> Puedes enviar correo a: safa...@googlegroups.com
> Para desuscribirte, envia un correo a: safa-dcs+u...@googlegroups.com
> Mas info: http://groups.google.com/group/safa-dcs
> S.A.F.A. - More than just version controlling

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

Alfredo Gore

unread,
Dec 12, 2011, 1:19:05 PM12/12/11
to safa...@googlegroups.com
Aprovecho para acotar... en la pagina Model hay un feo error mio de tipeo, "pwn" en lugar de "own"

Saludos,

Dario Rodriguez

unread,
Dec 12, 2011, 1:25:39 PM12/12/11
to safa...@googlegroups.com
2011/12/12 Alfredo Gore <alfred...@gmail.com>:

> Aprovecho para acotar... en la pagina Model hay un feo error mio de tipeo,
> "pwn" en lugar de "own"
>
> 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

Nicolas Palumbo

unread,
Dec 15, 2011, 1:56:10 PM12/15/11
to safa-de...@googlegroups.com
En el caso de que el commit haya sido sobre un patch.

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>:

Dario Rodriguez

unread,
Dec 15, 2011, 2:17:52 PM12/15/11
to safa-de...@googlegroups.com
2011/12/15 Nicolas Palumbo <napa...@gmail.com>:

> En el caso de que el commit haya sido sobre un patch.
>
> PATCH       sha-1_patch
>
> Asumo que el sha-1_patch es el nombre de un delta tree que que esta en
> .safa/trees verdad?
>

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

Nicolas Palumbo

unread,
Dec 16, 2011, 4:39:54 PM12/16/11
to safa-de...@googlegroups.com
Subi al trello la primera version del script.
Fijense si se puede incorporar a la base de codigo

2011/12/15 Dario Rodriguez <soft....@gmail.com>:

Dario Rodriguez

unread,
Dec 16, 2011, 4:45:43 PM12/16/11
to Nicolas Palumbo, safa-developers, Leonardo Gutiérrez Ramírez
Hola Nico,

Gracias. Solo unas cosas de mi parte, igual ahora no lo puedo probar, igual lo adjunto así lo ven los demás y vamos poniendo en práctica auditar el código aportado SIEMPRE, para tener la mejor calidad y coherencia posibles:

1- Donde dice:

#COMMIT MUST HAVE A TREE
TREE_NAME=$(cat ".safa/commits/$COMMIT_NAME" | grep "TREE" | cut -f 2 -d " ")
DEBUG_print "TREE_NAME: '$TREE_NAME'"


Creo que es más seguro hacerlo como:

#COMMIT MUST HAVE A TREE
TREE_NAME=$(cat ".safa/commits/$COMMIT_NAME" | grep "^TREE" | cut -f 2 -d " ")
DEBUG_print "TREE_NAME: '$TREE_NAME'"


Porque puede ser que algún archivo a versionar se llame literalmente "TREE", y eso sería molesto. Haciendolo con la expresión regular te ahorrás cualquier otra especulación, porque las líneas que contienen nombres de fichero empiezan todas con un cero, por los permisos.


2- Estos condicionales:

if [ "$TREE_NAME" = ""  ]; then

Habría que cambiarlos. Ese en particular debería explotar en gran parte de los shells, porque es igual que poner "[ $TREE_NAME =]", pero en general, prefiero que los condicionales se evalúen siempre con test. De esta forma no solo evitamos conflictos con los shell, también seguimos una línea de coherencia en cuanto a la forma de escribir el código.

if test -z $TREE_NAME; then
...
fi

o bien

if test "x$TREE_NAME" = "x"; then
...
fi


3- Ultima, acá usas grep con el FILE_NAME. Si el nombre del archivo coincide con cualquiera de las líneas de la cabecera del árbol sería feo. Otra vez, podés hacer uso de otra expresión:

FILE_IN_TREE=$(safa-cat-tree "$TREE_NAME" | grep "$FILE_NAME" | cut -f 2 -d "    " )

Cambiarlo por:

FILE_IN_TREE=$(safa-cat-tree "$TREE_NAME" | grep "^0" | grep "$FILE_NAME" | cut -f 2 -d "    " )

De paso, pongo en copia directa a Leo que es uno de los referentes de shellscripting de la comunidad elhacker.net (bienvenido al proyecto).

Saludos
--
Dario

Dario Rodriguez

unread,
Dec 16, 2011, 6:18:51 PM12/16/11
to Nicolas Palumbo, safa-developers, Leonardo Gutiérrez Ramírez
No me fije bien qué es porque ya me tengo que ir, pero tengo un
problema acá, fijate:

~/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

Nicolas Palumbo

unread,
Dec 17, 2011, 12:20:09 PM12/17/11
to Dario Rodriguez, safa-developers, Leonardo Gutiérrez Ramírez
Subi una version nueva al trello con los cambios mencionados.

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>:

Dario Rodriguez

unread,
Dec 17, 2011, 12:42:56 PM12/17/11
to Nicolas Palumbo, safa-developers, Leonardo Gutiérrez Ramírez
El separador de campos debería ser el ':' que es el que safa-commit crea actualmente. Solamente usamos TAB en las listas de archivos de los TREE.

Este es el modelo del repositorio que estaba probando:

~/safa/hola $ find .safa/
.safa/
.safa/blobs
.safa/diffpatches
.safa/commits
.safa/commits/6ff6fc1bbe9a105379712eb3f0c60280058d3bf4
.safa/HEAD
.safa/addindex
.safa/config
.safa/trees
.safa/trees/6ff6fc1bbe9a105379712eb3f0c60280058d3bf4
~/safa/hola $ cat .safa/commits/6ff6fc1bbe9a105379712eb3f0c60280058d3bf4
PARENT:null
PATCH:null
TREE:6ff6fc1bbe9a105379712eb3f0c60280058d3bf4
AUTHOR:Dario A Rodriguez    16/Dec/2011 20:11:22 -0300
ABSTRACTION:null
CURRLEVEL:0
TITLE:commit inicial

empty message, above blank line is needed

~/safa/hola $

Dario Rodriguez

unread,
Dec 17, 2011, 2:37:21 PM12/17/11
to safa-developers
Me olvide de poner a la lista, esto de dormir tan poco no es saludable =P

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

archivos_check-from-commit(1).tar.gz

Dario Rodriguez

unread,
Dec 17, 2011, 3:17:38 PM12/17/11
to Leonardo Gutiérrez Ramírez, safa-developers
Tuve el mismo problema en AIX con el resto del programa.

Ese era el cambio de safa-check-from-commit, te podes bajar todo el
fuente (excluyendo ese cambio que todavia no puse) desde:

www.safa-dcs.org

Saludos
--
Dario

Dario Rodriguez

unread,
Dec 17, 2011, 3:32:58 PM12/17/11
to Leonardo Gutiérrez Ramírez, safa-developers
Por cierto, en el proximo release que suba uso el shabang como
"#!/usr/bin/env bash", que es el que estaba usando para Perl y Python.

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

Nicolas Palumbo

unread,
Dec 18, 2011, 12:04:51 AM12/18/11
to safa-de...@googlegroups.com, Leonardo Gutiérrez Ramírez
Subo la version sin backticks. Pense que los habia sacado todos, pero
evidentemente siempre queda uno.
No era mi idea usar backticks en ningun lugar, pero para probar los
use, y se ve que ademas introduje otro cambio que hizo que me funcione
el test de turno y como funciono lo deje y dps el copy y paste lo
traslado. Los reemplace, y los test siguen pasando. Los otros temas
los seguimos en otros threads

2011/12/17 Dario Rodriguez <soft....@gmail.com>:

archivos_check-from-commit.tar.gz

Nicolas Palumbo

unread,
Dec 18, 2011, 12:20:06 AM12/18/11
to safa-de...@googlegroups.com, Leonardo Gutiérrez Ramírez
Tnego que dormir yo tb.
Me olvide lo del separador de campos. Lo acabo de incorporar,
modifique el repo tb para ser consistente.

Salute,
Nico

2011/12/18 Nicolas Palumbo <napa...@gmail.com>:

archivos_check-from-commit.tar.gz

Dario Rodriguez

unread,
Dec 18, 2011, 11:01:07 PM12/18/11
to safa-de...@googlegroups.com, Leonardo Gutiérrez Ramírez
Agregue todo a la web en safa-0bf7982431.tar.gz

Pero tengo una sorpresa:

* RUNNING TEST-SUIT...
* ----------------------------
* TESTSET-BEGIN: t0001-cat-tree.sh
* test-title: NORMAL TREE
* test-description: A normal TREE object without deltas
* test-title: DELTA TREE
* test-description: One delta level
* TESTSET-END: t0001-cat-tree.sh
* TESTSET-WAS: OK
* ----------------------------
* TESTSET-BEGIN: t0002-tree-from-index.sh
* test-title: BUILD TREE AND MATCH SHA-1
* test-description: TREE BUILT FROM 3 FILES IN addindex
fea37dccce42b3ccfd39ac44c18fe45d5b193af6
* test-error-description: Expected Tree name: 2f492b9d75f787d9758d7315d8d9697d8a725e20
* test-error-description: TREE_NAME was:      fea37dccce42b3ccfd39ac44c18fe45d5b193af6
* test-error-description: Used repo:      repo0002
* TESTSET-END: t0002-tree-from-index.sh
* TESTSET-WAS: FAIL
* ----------------------------
* TESTSET-BEGIN: t0003-check-from-commit.sh
* test-title: CHECK DIE WHEN EXTRA ARGUMENT
* test-description: An extra argument is passed. Testing the command fails as expected
* test-title: CHECK DIE MISSING ARGUMENTS
* test-description: The command dies when less than 2 arguments are passed
* test-title: CHECK DIE MISSING COMMIT
* test-description: The command dies if commit file does not exists
* test-title: CHECK DIE MISSING FILE
* test-description: The command dies if file does not exists
* test-title: CHECK DIE NO TREE LINE
* test-description: The command dies if there is no TREE in commit
* test-title: CHECK DIE MISSING TREE
* test-description: The command dies if the tree found in commit file does not exist
* test-title: CHECK DIE FILE NOT IN TREE
* test-description: The command dies if file passed by argument is not found in tree obtained from commit
* test-title: CHECK DIFFERENT FILE HASH
* test-description: Check file hash is different on a simple commit without parent. Using tree
* test-title: CHECK FILE HASH OK
* test-description: Check file hash OK on a simple commit without parent. Using tree
* test-title: CHECK DIFFERENT HASH OR PERM
* test-description: Check file hash on a simple commit without parent. Using tree
* test-title: CHECK FILE HASH AND PERM OK
* test-description: Check file hash on a simple commit without parent. Using tree
* TESTSET-END: t0003-check-from-commit.sh
* TESTSET-WAS: OK
* ============================
* OK: 2
* FAILED: 1


Yo creo que hay que hacer un chmod siempre para que el umask del sistema no nos cambie el SHA-1.

Eso cambiaría todos los tests de ahora, bajen de: www.safa-dcs.org/downloads.html

Saludos
--
Dario

Dario Rodriguez

unread,
Dec 19, 2011, 8:26:56 AM12/19/11
to safa-de...@googlegroups.com, Leonardo Gutiérrez Ramírez
Acabo de ver esto, habría que cambiarlo tambien:

if test -z $COMMIT_NAME
then
safa_check_from_commit_SHOW_USAGE
check_from_commit_DIE "missing argument: tree"
fi


Ya que no es el TREE sino el COMMIT lo que le falta.

Saludos
--
Dario

Dario Rodriguez

unread,
Dec 19, 2011, 9:08:50 AM12/19/11
to safa-de...@googlegroups.com, Leonardo Gutiérrez Ramírez
2011/12/19 Dario Rodriguez <soft....@gmail.com>
Me acabo de dar cuenta de algo más:

FILE_IN_TREE puede ser vacío. En el caso que agreguemos un archivo nuevo, el mismo no existirá en el commit anterior. En ese caso, simplemente se debería devolver 2. Si --quiet no vino entre los parámetros, se muestra el informe "El archivo no existía en <nombre_commit>".

Saludos
--
Dario

Nicolas Palumbo

unread,
Dec 23, 2011, 10:08:15 AM12/23/11
to safa-de...@googlegroups.com, Leonardo Gutiérrez Ramírez
De momento esto estaba devolviendo


[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>:

Dario Rodriguez

unread,
Dec 23, 2011, 10:25:58 AM12/23/11
to safa-de...@googlegroups.com, Nicolas Palumbo
2011/12/23 Nicolas Palumbo <napa...@gmail.com>:

> 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
>

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

safa-check-from-commit.patch

Dario Rodriguez

unread,
Dec 26, 2011, 10:37:56 PM12/26/11
to safa-developers, Nicolas Palumbo
Y no lo había mandado a la lista... soy de los buenos

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

Reply all
Reply to author
Forward
0 new messages