visual tutorial tortoise pais svn

tutorial - Averigüe la versión de copia de trabajo SVN(1.7 o 1.8)



tortoise svn server (3)

¿Cómo puedo averiguar la versión de copia de trabajo (SVN 1.7 vs. 1.8) observando los archivos dentro de .svn sin usar ninguna herramienta SVN?


Me pregunté sobre esto por un tiempo y no pude encontrar una respuesta en ninguna parte, ni siquiera mirando la base de datos SQLite. Así que terminé buscando en el código fuente de Subversion, donde descubrí que la versión está almacenada en la base de datos, simplemente no estaba buscando en el lugar correcto. Aquí está el fragmento relevante de subversion/libsvn_subr/sqlite.c :

svn_error_t * svn_sqlite__read_schema_version(int *version, svn_sqlite__db_t *db, apr_pool_t *scratch_pool) { (...) SVN_ERR(prepare_statement(&stmt, db, "PRAGMA user_version;", scratch_pool)); (...) }

Ni siquiera estaba al tanto de la declaración PRAGMA , que, según la documentación de SQLite es ...

... una extensión de SQL específica para SQLite y utilizada para modificar el funcionamiento de la biblioteca de SQLite o para consultar la biblioteca de SQLite en busca de datos internos (no de tabla).

Por lo tanto, asumiendo una versión razonablemente actualizada de SQLite en el PATH puede hacer ...

sqlite3 .svn/wc.db "PRAGMA user_version"

... en la raíz de su copia de trabajo, que luego cederá, por ejemplo, 29 para Subversion 1.7.13 y 31 para Subversion 1.8.0. Desafortunadamente, parece que no hay una lista que relacione la versión de user_version con la versión de Subversion, pero si está interesado en qué consisten realmente los cambios de formato, puede encontrarlos descritos en las fuentes en subversion/libsvn_wc/wc-metadata.sql para el formato 20 adelante.

Actualización 1: abordar la cuestión de cómo recuperar el valor de user_version sin un ejecutable SQLite: debe leer un DWORD en el desplazamiento 60 en el archivo de la base de datos, como se especifica en la especificación del formato de archivo SQLite (consulte "1.2 El encabezado de la base de datos") .

Actualización 2: para aclarar aún más cómo verlo en un visor de archivos de texto / binario: dado que los números de las versiones actuales aún son bastante bajos y caben en un solo byte (es decir, son más pequeños que 255 ) y un DWORD tiene una longitud de cuatro bytes. es suficiente en este momento mirar el byte menos significativo, que es el byte número 64 . A continuación se muestra una captura de pantalla de cómo se ve en el archivo de base de datos SQLite de una copia de trabajo de Subversion 1.8.0, que user_version 31 para user_version , como ya se mencionó anteriormente.

Actualización 3: Siempre estaba buscando una manera de hacer tales "consultas binarias" con una herramienta de línea de comandos, para evitar lanzar Perl o algo similar al problema. Resulta que hay una utilidad * nix para eso llamada od (e incluso la tengo en mi colección de puertos win32, ¡yay!). od puede obtener el byte menos significativo de user_version como este:

od -An -j63 -N1 -t dC .svn/wc.db

Esto volverá a generar 31 para Subversion 1.8.0 y así sucesivamente.


No se puede encontrar documentación sobre esto hasta ahora, sin embargo, la respuesta corta es: usted puede. Eche un /.svn/format archivo de /.svn/format . Por ejemplo, el número 12 significa que la copia de trabajo está en formato SVN 1.8. Supongo que si es de SVN 1.7, entonces verás 11 allí.


Si existe .svn / format, entonces lea el número en él:

Version 7 is SVN 1.3 Version 8 is SVN 1.4 Version 9 is SVN 1.5

Si .svn / format no existe, el número de versión está en la primera línea en .svn / entries:

Version 10 is SVN 1.6 Version 12 is SVN 1.7