[safa] Modelo de objetos - ODT

1 view
Skip to first unread message

Dario Rodriguez

unread,
Dec 1, 2011, 1:36:15 PM12/1/11
to safa...@googlegroups.com

Gente, aca les copio y adjunto el fuente con esto agregado, se trata de un documento ODT con la descripcion funcional de cada tipo de objeto. Decidi sacar los objetos PATCH para enriquecer los objetos COMMIT. Según mi forma de verlo, esto nos permitirá un manejo mucho mejor, agregando luego trackers firmados mediante DSA-ElGamal.

No me gusta enviar mensajes con formato porque se hacen difíciles de ver en algunos clientes de correo, prefiero el texto plano, pero quería copiar el documento tal cual para que quede en la lista también.


PD: Si hay algo que ven mal, corrijanme

Saludos,

--

Dario



---------------------

Objetos de S.A.F.A.

---------------------



A diferencia de GIT, los objetos de SAFA no guardan el tipo y tamaño al inicio ¿Porque? Porque podemos distinguir el tipo: Si es un TREE, estara en .safa/trees; si es un BLOB, en .safa/blobs; si es un COMMIT, en .safa/commits; y si es un subtipo, estará tipado.


Estos son ejemplos de objeto. Los datos no son reales y no funcionaran en un repositorio real, pero así es como luce. Los SHA-1 fueron abreviados.


OBJETO TREE

Nombre del archivo: Su propio SHA1

Directorio: .safa/trees

Contenido: Subtipo TREE, Directorios, Archivos con su SHA-1



TYPE

TREE

0777

directorio1

0755

directorio1/subdir1

0755

directorio1/subdir2

linea en blanco

0755

directorio1/subdir1/archivo

fb3a8bdd0ceddd019615af4d57a53...




OBJETO DELTA-TREE

Nombre del archivo: Su propio SHA1

Directorio: .safa/trees

Contenido: Subtipo DELTA-TREE, TREE BASE sobre el que se aplica el parche, modificaciones a la lista de directorios, modificaciones a la lista de archivos con su SHA-1



TYPE

DELTA-TREE

BASE


-

0777

directorio1/subdir2

linea en blanco

+

0755

directorio1/subdir1/otro

257a84d9d02e90447b149af58b271...



El resultado de esto es que se puede tomar el TREE de base, la lista de cambios del TREE tipo DELTA, y aplicarlos.


La utilidad de abstracción de subtipo de TREE es safa-cat-tree, que permite leer TREEs y DELTA-TREEs de forma indistinta.


OBJETO BLOB

Nombre del archivo: Su propio SHA1 más una posible extensión indicando compresión.

Directorio: .safa/blobs

Contenido: Es exactamente un archivo tomado tal cual de la estructura de directorios (como si se hubiera hecho un 'cp'). Es un archivo, no un Inodo, por eso los permisos se guardan en el TREE que lo referencia, contando que un cambio de permisos se puede versionar, y el archivo quedará intacto (hablamos del mismo BLOB). Si lleva extensión '.gz' se debe descomprimir.



OBJETO COMMIT

Nombre del archivo: El SHA1 del TREE o PATCH al que apunta

Directorio: .safa/commits

Contenido: Su propio SHA1, SHA1 de un TREE (si aplica), SHA1 de un PATCH (si aplica), SHA1 del camino con un nivel más de abstracción, nombre del COMMIT anterior al mismo (PARENT, es NIL si es el primero), ID del Autor, Fecha y hora de la autoría, Abstracción y camino más abstracto (si aplican), Titulo, Mensaje.



SHA-1

6ff87c4664981e4397625791c8ea3bbb5f2279a3

PARENT

257a84d9d02e90447b149af58b271c19405edb6a

PATCH

(solo si aplica)

TREE

(solo si aplica)

AUTHOR

da...@safa-dev.org
02-APR-2012 23:34:22 -0300

ABSTRACTION

(si aplica, el sha1 del camino 1 nivel más abstracto)

CURRLEVEL

(si aplica, el nivel de abstracción actual)

TITLE

Aqui va el titulo del Commit

linea en blanco

Aqui va el mensaje del Commit, esta parte es la que describe lo que se hizo en el Commit, en los commits abstractos hablamos de descripciónes más funcionales como 'Correccion de formato de mensajes', cuando en realidad pueden haber cientos de commits que creaban funciones y las implementaban, hacian correcciones y demás. No perdemos esos commits, solo los salteamos en el log.




safa.tar.gz

Nicolas Palumbo

unread,
Dec 2, 2011, 6:10:31 PM12/2/11
to safa...@googlegroups.com
no llego a entender el campo abstracto del objeto commit.
No es suficiente con el parent para indicar el camino?

2011/12/1 Dario Rodriguez <soft....@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

Dario Rodriguez

unread,
Dec 2, 2011, 9:53:18 PM12/2/11
to safa...@googlegroups.com
2011/12/2 Nicolas Palumbo <napa...@gmail.com>

 no llego a entender el campo abstracto del objeto commit.
 No es suficiente con el parent para indicar el camino?


Si, y no. Los campos de abstracción son capas del log. Por ejemplo, supongamos que tenemos una linea de 30 COMMITS que cambian "printf" por una funcion propia de logging llamada "yo_log" en todos lados. Entonces tenes:

 ...
(COMMIT) [5/30] implementacion de yo_log en tal_archivo.c
(COMMIT) [4/30] implementacion de yo_log en mas_archivos.c
(COMMIT) [3/30] implementacion de yo_log en otro_archivo.c
(COMMIT) [2/30] implementacion de yo_log en safa.c
(COMMIT) [1/30] implementacion de yo_log en mensajes.c

Y así podes tener los 30. Esto se ve mucho en la lista de correo de GIT donde se mandan "Serial Patches". Esta bueno separar un gran cambio en pequeños cambios atómicos porque eso permite buscar commits que introducen fallas, permite que los diff sean más cortos y eso evita grandes y horribles merges, etc...

Pero seamos francos, es una patada a la vista. Imaginate una interfaz de linea de comandos ocupando como mínimo 30 líneas para esto, y eso si no pedimos algún detalle sobre el commit.

El camino que recién expuse sería totalmente lineal:

  ...
  * (5/30)
  |
  * (4/30)
  |
  * (3/30)
  |
  * (2/30)
  |
  * (1/30)

La relación que propone PARENT es la de (5/30) diciendo que su anterior es (4/30), por ejemplo... y (4/30) diciendo que (3/30) es su anterior.

Hacer eso se llamaría REV-LOG (reverse log). Empezas por HEAD y vas hacia atrás, guiandote por PARENT. Cuando te guias por PARENT, esta operación cuesta la lectura de 30 archivos, cuesta 30 lineas de consola... es fea

Ahora, esta es una solución que pensé al principio y me parece que hace la diferencia con los otros versionadores... lo hace un poco mas humano. La abstracción te permite dar una vuelta más de rosca, y:

  * (30/30)
  |\
  | ` ---------+---> Abstraction 1: "Implementación de yo_log"
  |            |
  * (29/30)    |
  ...          |
  ...          |
  * (2/30)     |
  |            |  End
  * (1/30) ----'

¿Se ve? El camino al grado de abstracción 1 te permite saltear esos 30 commits e ir por un camino corto. Ahora el log mostraría solamente esa línea, algo como:

(A:1) Implementacion de yo_log

Y eso resume los 30 COMMITS en uno que es abstracto. Mi idea es que alguien pueda decir:

$ safa log --abstraction=1 --oneline

...y pase siempre por el grado de abstracción 1, evitando ver tooooda la serie, solamente un resumen.

Puede haber más grados de abstracción. Eso permite que se pueda analizar a nivel funcional el log, conservando la ventaja técnica de tener cualquier cantidad de COMMITS.



Bueno eso fue mortal kombat 8 'safa log --abstraction' y espero que les haya gustado

Saludos
--
Dario

Osvaldo Falabella

unread,
Dec 3, 2011, 11:55:47 AM12/3/11
to safa...@googlegroups.com
muy buena explicacion!


Reply all
Reply to author
Forward
0 new messages