Как я могу получить номер редакции Subversion в PHP?
Вопрос
Я хочу, чтобы мое PHP-приложение было помечено номером редакции, который оно использует, но я не хочу использовать Управление круизом или обновляйте файл и загружайте его каждый раз.Как я должен это сделать?
Решение
Ключевые слова SVN не являются хорошим решением.Как указывали другие, добавление $ Revision$ в файл влияет только конкретный файл, который может не меняться в течение длительного времени.
Помнить о необходимости "редактировать" файл (добавляя или удаляя пустую строку) перед каждой фиксацией бессмысленно.С таким же успехом вы могли бы просто ввести редакцию вручную.
Один хороший способ сделать это (о котором я знаю) - это автоматизировать процесс развертывания (что всегда хорошо) и использовать команду svnversion.Вот что я делаю:
Везде, где мне нужна доработка, я включаю: <?php include 'version.php'; ?>
.Этот файл "version.php" есть только номер версии.Более того, он не является частью репозитория (он настроен на игнорирование).Вот как я это создаю:
1) В проектах, где SVN установлен на сервере, я также использую его для развертывания.Получение последней версии на сервер У меня есть скрипт, который, помимо прочего, выполняет следующее (он запускается на сервере):
cd /var/www/project
svn update
rm version.php
svnversion > version.php
2) В проектах, где SVN не установлен, мой сценарий развертывания более сложный:он создает файл version.php локально, архивирует код, загружает и извлекает его
Другие советы
Предполагая, что ваш webroot является извлеченной копией дерева subversion, вы могли бы проанализировать файл /.svn/entries и подключить номер редакции (4-я строка здесь)...
В PHP:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
Вот как я заставил это сработать.Если ваш сервер настроен так, чтобы разрешать shell_exec И если у вас установлен SVN, просто запустите:
$revision = `svnversion`;
или
$revision = shell_exec('svnversion');
От этот ответ:
Вы можете сделать это, добавив следующее в любом месте вашего кода
$Id:$
Так, например, сделал Джефф:
<div id="svnrevision">svn revision: $Id:$</div>
и при регистрации сервер заменил $ Id:$ на текущий номер редакции.Я также нашел эта ссылка.
Существует также $Date: $, $Rev: $, $Revision:$
Немного поздновато, но используйте перехват Subversion после фиксации.В папке hooks вашего репозитория создайте сценарий оболочки, подобный этому:
#!/bin/bash
REPOS="$1"
REV="$2"
cd /web/root
rm -f /web/root/templates/base.html
/usr/bin/svn update
/bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html
В этом конкретном примере предполагается, что ваш действующий сайт находится в /web/root, а код разработки хранится в другом месте.Когда вы фиксируете изменение разработчика, скрипт удаляет предыдущий действующий шаблон (чтобы избежать сообщений о конфликте), запускает обновление и заменяет вхождения РЕВИЗИИ в шаблоне фактическим номером редакции.
Подробнее о крючках здесь
В большинстве случаев код на сервере фактически содержал бы "Экспорт" кода, а не проверку, и, следовательно, не содержал бы папок .svn.По крайней мере, именно такую установку я вижу чаще всего.Действительно ли другие загружают свой код на веб-сервер?
Вы можете сблизиться с Ключевые слова SVN.Добавьте $Revision$ туда, где вы хотите, чтобы отображалась редакция, но это покажет только последнюю редакцию, в которой был изменен конкретный файл, поэтому вам придется вносить изменения в файл каждый раз.Получение глобального номера редакции невозможно без какого-либо внешнего скрипта или перехвата после фиксации.
Вы также могли бы сделать это следующим образом:
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
Самый простой способ - использовать Subversion "Подстановка ключевых слов".Есть путеводитель здесь в книге SVN (Управление версиями с помощью Subversion).
По сути, вам просто нужно будет добавить текст $ Rev $ где-нибудь в вашем файле.Затем включите ключевое слово в вашем репозитории.При оформлении заказа SVN заменит номер редакции в файле.
Смотрите мой ответ на аналогичный вопрос "Пометить" экспорт svn ревизией.
Если вы запишете номер редакции при экспорте, вы можете использовать:
svn export /path/to/repository | grep ^Exported > revision.txt
Чтобы удалить все, кроме номера редакции, вы можете передать его с помощью этой команды sed:
svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt
$svn_rev=file_get_contents('/path.to.repository/db/current');
Другая возможность сделать это - запустить cron, который выполняет шаги, описанные в разделе "Процесс развертывания" (при условии, что это сервер * nix / FreeBSD).
Если производительность является проблемой, то вы могли бы сделать:
exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));
Это, конечно, зависит от того, выполнили ли вы проверку и от наличия команды svn.