Как я могу получить номер редакции Subversion в PHP?

StackOverflow https://stackoverflow.com/questions/111436

  •  02-07-2019
  •  | 
  •  

Вопрос

Я хочу, чтобы мое 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top