Подтвердить что ты не робот

Узнайте версию рабочей копии SVN (1,7 или 1,8)

Как узнать версию рабочей копии (SVN 1.7 vs. 1.8), просмотрев файлы внутри .svn без использования SVN-инструмента?

4b9b3361

Ответ 1

Мне было интересно об этом некоторое время, и я не мог найти ответ нигде, даже не глядя на базу данных SQLite. Итак, я закончил поиск исходного кода Subversion, где обнаружил, что версия действительно хранится в базе данных, я просто не искал нужного места. Здесь соответствующий фрагмент из 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));
  (...)
}

Я даже не знал о выражении PRAGMA, который, согласно документации SQLite,...

... расширение SQL, специфичное для SQLite, и используется для изменения работы библиотеки SQLite или для запроса библиотеки SQLite для внутренних (не табличных) данных.

Таким образом, предположив, что версия SQLite имеет достаточно современную версию на PATH, вы можете сделать...

sqlite3 .svn/wc.db "PRAGMA user_version"

... в корне вашей рабочей копии, которая затем будет выдаваться, например, 29 для Subversion 1.7.13 и 31 для Subversion 1.8.0. К сожалению, похоже, что нет версии, сопоставляющей user_version с версией Subversion, но если вам интересно, в чем состоят собственно изменения формата, вы можете найти их в источниках в subversion/libsvn_wc/wc-metadata.sql для формата 20 и далее.

Обновление 1: Решение вопроса о том, как получить значение user_version без исполняемого файла SQLite: вам нужно прочитать DWORD в смещении 60 в файле базы данных, так как указанном в спецификации формата файла SQLite (см. "1.2 Заголовок базы данных" ).

Обновление 2: Чтобы уточнить, как просмотреть его в средстве просмотра текстовых/двоичных файлов: поскольку текущие номера версий по-прежнему довольно низки и соответствуют одному байту (т.е. они меньше, чем 255) и a DWORD имеет длину четыре байта, на данный момент достаточно взглянуть на младший значащий байт - байтовое число 64. Ниже приведен снимок экрана о том, как он выглядит в файле базы данных SQLite рабочей копии Subversion 1.8.0, который содержит 31 для user_version - как уже упоминалось выше.

Subversion 1.8.0 SQLite database in Text viewer

Обновление 3: Я всегда искал способ сделать такие "двоичные запросы" с помощью средства командной строки, чтобы избежать бросания perl или такового в проблему. Вызывает там утилиту * nix для того, что называется od (и я даже получил ее в своей коллекции портов win32, yay!). od может получить младший значащий байт user_version следующим образом:

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

Это приведет к выводу 31 для Subversion 1.8.0 и т.д.

Ответ 2

Если существует формат .svn/format, тогда прочитайте номер в нем:

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

Если формат .svn/format не существует, номер версии находится в первой строке в .svn/entries:

Version 10 is SVN 1.6
Version 12 is SVN 1.7

Ответ 3

Невозможно найти документацию по этому поводу, однако короткий ответ - вы можете. Загляните в файл \.svn\format. Например, число 12 означает, что рабочая копия имеет формат SVN 1.8. Я предполагаю, что если это SVN 1.7, то вы увидите там 11.