Data Version Manager

25 Jul 2018 - Evaristo

dvm es una aplicación que emula control de versiones para archivos binarios de datos. Este post presenta una historia de usuario de dvm.

Crear repo dvm y agregar archivos

Primero inicializamos un repo dvm en la carpeta datos.

> cd datos
> dvm init

Vemos el estado del repo:

> dvm status
    ?   foo.bin
    ?   bar.bin

Agregamos los archivos de datos binarios al repo dvm:

> dvm add

Nuevamente vemos el estado del repo:

> dvm status
    A   foo.bin
    A   bar.bin

Consignamos y subimos los datos:

> dvm commit
> dvm push
    pushing...
    done

Consignar y subir cambios

El analista modificó foo.bin:

> dvm status
    M   foo.bin

Consignamos los cambios y subimos la versión actual:

> dvm commit
> dvm push
    pushing...
    done

Eliminar archivos y subir cambios

El analista borró bar.bin:

> dvm status
    !   bar.bin

Eliminamos del repo dvm los datos borrados:

> dvm remove

Nuevamente vemos el estado del repo:

> dvm status
    R   bar.bin

Consignamos y subimos los datos:

> dvm commit
> dvm push
    pushing...
    done

Descargar cambios

Para descargar actualizaciones en los archivos de datos

> dvm pull
    pulling...
    done

La instrucción anterior descarga la versión más nueva sin modificar tu copia local. Para actualizar tus archivos de datos:

> dvm update

Actualiza sólo un archivo

Los comandos pull y update aceptan la opcion --filename para indicar el nombre del archivo que se desea altualizar

> dvm pull --filename foo.bin
    pulling...
    done
> dvm update --filename foo.bin

También aceptan el checksum de la versión deseada de un archivo:

> dvm pull --checksum 4d186321c1a7f0f354b297e8914ab240
    pulling...
    done
> dvm update --checksum 4d186321c1a7f0f354b297e8914ab240

¿Cómo funciona?

Crear repo dvm y agregar archivos

El comando init crea un archivo dvm.json y una carpeta .dvm.

Ejemplo de dvm.json:

{
    "resources": null
}

El directorio contiene dos achivos: foo.bin y bar.bin. El comando status busca en dvm.json el nombre de los archivos que encuentra en el directorio (y que no se encuentran en .dvmignore). Dado que dvm.json está vació, status despliega:

> dvm status
    ?   foo.bin
    ?   bar.bin

El comando add agrega a dvm.json el nombre y checksum de los archivos marcados con ?.

{
    "resources":
        [
            {
                "filename": "foo.bin",
                "checksum": "4D186321C1A7F0F354B297E8914AB240",
                "hash": "md5"
            },
            {
                "filename": "bar.bin",
                "checksum": "DD485E41F1758DEF296E1BC7377F8EA7",
                "hash": "md5"
            }
        ]
}

Debes consignar en tu sistema de control de versiones (hg o git) los cambios en dvm.json cada vez que uses el comando dvm add.

Además, add copia los archivos foo.bin y bar.bin a la carpeta .dvm/ renombrándolos con el checksum:

> ls .dvm/
    md5_4D186321C1A7F0F354B297E8914AB240.dvm
    md5_DD485E41F1758DEF296E1BC7377F8EA7.dvm

Ignora en tu sistema de control de versiones (hg o git) la carpeta .dvm.

El comando push sube los archivos md5_*.dvm a un servidor FTP.

Consignar y subir cambios

Cuando se modifica foo.bar, el comando status encuentra que el checksum actual de foo.bar no coincide con el checksum guardado en el archivo dvm.json y despliega:

> dvm status
    M   foo.bin

El comando commit actualiza dvm.json con el nuevo checksum:

{
    "resources":
        [
            {
                "filename": "foo.bin",
                "checksum": "0AD066A5D29F3F2A2A1C7C17DD082A79",
                "hash": "md5"
            },
            {
                "filename": "bar.bin",
                "checksum": "DD485E41F1758DEF296E1BC7377F8EA7",
                "hash": "md5"
            }
        ]
}

Debes consignar en tu sistema de control de versiones (hg o git) los cambios en dvm.json cada vez que uses el comando dvm commit.

y hace una copia de foo.bin a la carpeta .dvm/ renombrándola con el nuevo checksum:

> ls .dvm/
    md5_4D186321C1A7F0F354B297E8914AB240.dvm
    md5_DD485E41F1758DEF296E1BC7377F8EA7.dvm
    md5_0AD066A5D29F3F2A2A1C7C17DD082A79.dvm

Vemos que en la carpeta .dvm/ hay tres archivos: dos versiones de foo.bin y una versión de bar.bin. El nuevo archivo md5_0AD066A5D29F3F2A2A1C7C17DD082A79.dvm todavía no se ha subido al servidor. Para subir la nueva versión de foo.bar usamos nuevamente el comando push.

Eliminar archivos y subir cambios

El comando remove elimina de dvm.json el nombre y checksum del archivo marcados con !.

{
    "resources":
        [
            {
                "filename": "foo.bin",
                "checksum": "4D186321C1A7F0F354B297E8914AB240",
                "hash": "md5"
            }
        ]
}

Debes consignar en tu sistema de control de versiones (hg o git) los cambios en dvm.json cada vez que uses el comando dvm remove.

Descargar cambios

El comando pull obtiene una lista de los checksum guardados en dvm.json, construye una lista de nombres de archivo con el formato .dvm/md5_{checksum}.dvm, y descarga del servidor FTP los archivos que no se encuentren en la carpeta .dvm/.

El comando update sobreescribe tus archivos de datos binarios con los archivos .dvm/md5_{checksum}.dvm usando la relación filename- checksum descrita por dvm.json.

Actualiza sólo un archivo Las opciones --filename y --checksum de los comandos add, commit, pull y update usan los campos correspondientes en dvm.json para realizar la operación sobre sólo un archivo.