Если Ваш вариант использования - то, что у Вас есть форма (например, форма входа в систему), и Ваш сценарий серверной стороны должен знать, включили ли пользователю JavaScript, можно сделать что-то вроде этого:
<form onsubmit="this.js_enabled.value=1;return true;">
<input type="hidden" name="js_enabled" value="0">
<input type="submit" value="go">
</form>
Это изменит значение js_enabled к 1 прежде, чем отправить форму. Если Ваш сценарий серверной стороны получает 0, никакой JS. Если это получает 1, JS!
Я бы выполнил проверку svn, и уже несколько лет успешно это делал на работающем сайте. Однако вам следует добавить правила mod_rewrite
к 404 каталогам (и файлам) .svn.
Возможно, это не совсем тот ответ, который вы ищете, но, если у вас есть SSH-доступ к вашему веб-серверу (это зависит от вашего хостинга; некоторые «низкие цены» не дают такого доступа), вы можно использовать rsync для «синхронизации» удаленного сайта с тем, что есть на вашем диске.
Раньше я использовал что-то вроде идеи, которую вы описываете (получение журнала svn между последними нажатыми ревизиями в продакшн и HEAD, анализируя каждую строчку, и в конце рассчитывая, что отправить на сервер); но это был не лучший процесс; Теперь я использую rsync, и мне он нравится больше.
(Здесь вам также придется исключить каталоги .svn, кстати)
Это то, что я делаю на своем хосте:
Для каждого проекта у меня есть структура, которая выглядит более менее такой:
~/projects/myproj
~/public_html/myproj
Первый каталог - это извлечение из SVN, а второй - это просто экспорт svn.
У меня есть небольшой сценарий bash
#!/bin/bash
SOURCE="$HOME/projects/"
TARGET="$HOME/public_html/"
for x in `ls $SOURCE`
do
if [ -d $SOURCE$x ]; then
svn update $SOURCE$x
svn export --force $SOURCE$x $TARGET$x
fi
done
Экспорт выполняется из рабочей копии, так что это очень быстро.
Вы можете просто согласиться с наличием каталогов .svn на своем веб-сайте (как правило, это не проблема, особенно если вы настроили его так, чтобы не разрешать доступ к ним) - это простой вариант. В качестве альтернативы сделайте то, что делает RaYell, и разместите две копии вашего веб-сайта на веб-сервере. Одна обычная проверка вне веб-каталога и одна в вашем веб-каталоге. При обновлении просто экспортируйте svn (просто копию с удаленными каталогами .svn) в веб-каталог (и вы должны сначала удалить старые файлы, если хотите, чтобы файлы, которые были удалены из SVN, не оставались на вашем веб-сайте.
Я делаю что-то подобное, используя robocopy, настроенный для зеркалирования svn checkout, исключая каталоги .svn, и получаю как экспорт, так и удаление старых файлов за один шаг, тем самым минимизируя время простоя, если копирование занимает много времени. Я' Я уверен, что это легко сделать и с unix, если это ваша среда хостинга. Например, вы можете использовать локальный rsync: http://blog.gilluminate.com/2006/12/12/yes-you-can-rsync-between-two-local-directories/