Узнать версию рабочей копии SVN (1.7 или 1.8)

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

3 ответа

Решение

Я сам некоторое время размышлял об этом и нигде не мог найти ответ, даже глядя на базу данных 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) и DWORD длиной четыре байта, на данный момент достаточно взглянуть на младший байт - номер байта 64, Ниже приведен скриншот того, как это выглядит в файле базы данных SQLite рабочей копии Subversion 1.8.0, который содержит 31 за user_version - как уже упоминалось выше.

Subversion 1.8.0 база данных SQLite в средстве просмотра текста

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

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

Это будет снова выводить 31 для Subversion 1.8.0 и так далее.

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

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

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

Version 10 is SVN 1.6
Version 12 is SVN 1.7

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

Другие вопросы по тегам