После того, как Бенджамин указал на HTTP-сценарии, обслуживающие CGI, я решил их опробовать и смог получить репозиторий, размещенный по HTTP. Красная книга , на которую ссылался Бенджамин, очень помогла, как и две статьи в Mercurial wiki. Один из них описывает Mercurial Publishing в целом, а другой содержит пошаговые инструкции по настройке сценария HgWebDir CGI.
Эти инструкции не были полностью надежными, поэтому мне пришлось немного покопаться. Скорее всего, так как я использую 64-битную Vista. Инструкции ниже документируют то, что я сделал. Теперь, когда я сделал это однажды, я бы, вероятно, сделал все в другом порядке, поэтому не рассматривайте эти пошаговые инструкции.
Mercurial
Сначала я приобрел бинарный файл Mercurial у http://mercurial.berkwood.com/, который был установлен в d:\dev\Mercurial
. Я создал хранилище для тестирования в d:\dev\testRepo
хранилище, используя hg init
. d:\dev\Mercurial\library.zip
содержит файлы библиотеки Mercurial, необходимые для сценария CGI, поэтому они были извлечены в d:\dev\Mercurial\library
. Сначала меня смутило то, что, открыв zip-файл, я получил сообщение об ошибке и не увидел содержимого. Просто распаковка файла в каталог сработала.
Для веб-скрипта я скачал Mercurial source , который содержал hgwebdir.cgi, который был перемещен и переименован в d:\dev\Mercurial\webroot\hgwebdir.py
. Пошаговая статья содержит хорошие инструкции по изменению скрипта hgwebdir для Windows. Они также содержат инструкции для hgweb.config, который в моем случае выглядел так:
[paths]
/hg/hgwebdir.py/test = D:\dev\Mercurial\testRepo
Кроме того, хранилище требовалось следующее конфигурирование, чтобы я мог использовать его без SSL. Примечание. В настоящее время я использую обычную аутентификацию для аутентификации пользователей. Мне пришлось создать конфиг в D:\dev\Mercurial\testRepo\.hg\hgrc
и добавить в него следующие строки:
[web]
allow_push = *
push_ssl = false
Python
CGI-скрипт - это Python-скрипт, поэтому он требует Python. Кажется довольно требовательным, какая версия Python выполняет его. В одной из статей упоминалось, что для его запуска требуется та же версия, которая использовалась для сборки Mercurial. В конце концов я начал работать над Python 2.5 x86 после того, как попробовал Python 2.6 x64, Python 2.4, Python 2.5 x64.
IIS
Две вещи, которые я пропустил и должен был установить, - это поддержка CGI и базовая аутентификация. Оба из них были установлены через Панель управления, Программы и Функции. Закончив установку, я создал виртуальный каталог (который я позже изменил на приложение) в IIS, указывая на D:\dev\Mercurial\webroot
. Виртуальному каталогу необходим обработчик CGI для файлов * .py, который можно добавить из сопоставлений обработчиков. Исполняемый файл был D:\dev\SDKs\Python25_x86\Python.exe %s
. Когда у IIS были права доступа к каталогу webroot, я мог перейти к http://localhost/hg/hgwebdir.py/test и просмотреть репозиторий.
Так что теперь доступ для чтения работал. Когда я попытался отправить в хранилище, я получил странные сообщения об ошибках, в которых говорилось, что это не настоящее хранилище.
После часа отладки я закончил копированием всего дерева D:\dev\Mercurial\library\mercurial
под webroot, чтобы Python мог найти D:\dev\Mercurial\webroot\mercurial\hgweb\hgwebdir_mod.pyc
. После этого Wireshark сообщал об ошибках Access Denied в трассировке стека. Понятия не было, что на самом деле было причиной, но заменив виртуальный каталог на Приложение в IIS и переместив его поверх пула приложений, который запускался с использованием учетной записи Local System, ошибки отказа в доступе исчезли.
Также в какой-то момент я дал HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters
ключу реестра больше разрешений, чтобы IIS мог получить к нему доступ. Сомневаюсь, что это требуется после использования учетной записи локальной системы.
Как только это было сделано, загрузка материала в хранилище с помощью hg push http://localhost/hg/hgwebdir.cgi/test
работала!
Проблемы и решения
- Где найти файлы библиотеки.
- Они были в библиотеке .dll в папке установки Mercurial. Мне просто нужно было извлечь их, даже если моя программа распаковки отказалась просматривать мне ее содержимое.
- Как запустить скрипт Python
- Загрузите правильную версию Python для архитектуры x86, так как скрипт использует некоторые библиотеки x86. Правильная версия Python зависит от версии Mercurial. Для 1.2.1 это был Python 2.5 x86.
- В качестве альтернативы вы можете попробовать собрать Mercurial из исходников с любой версией Python, но в моем случае это не удалось при создании расширений.
- Как настроить CGI в IIS
- Сначала убедитесь, что CGI установлен в IIS. Предполагалось, что это не так в инструкциях IIS, опубликованных Бенджамином.
- Создайте новое сопоставление модулей для * .py в сопоставлениях обработчиков IIS. Правильный модуль -
CgiModule
, а исполняемый файл - ваш исполняемый файл Python +% s
- Как разрешить сценарию CGI записывать в хранилище
- Убедитесь, что в скрипте есть все, что требуется. Мне пришлось переместить
library\mercurial\hgweb\hgwebdir_mod.pyc
в другое место.
- Убедитесь, что у скрипта есть разрешения везде, где он хочет. Я решил эту проблему, создав новый пул приложений для сценария CGI, использующего учетную запись локальной системы, преобразовав виртуальный каталог в приложение в IIS и выбрав новый пул приложений.