Хостинг Mercurial с IIS 6

Я пытаюсь настроить репозитории Mercurial, которые будут размещены IIS под Windows Server 2003. После этого сообщения я установил Python 2.5.4.4 и Mercurial 1.3, установил виртуальный каталог, извлеченный library.zip и созданный hgwebdir.config.

Однако, когда я пытаюсь открыть http://hostname/hg/hgwebdir.cgi, я получил сообщение об ошибке "Указанное приложение CGI плохо себя ведет, не возвращая полный набор заголовков HTTP." Я сделал все:

  • Проверено сопоставление IIS для обоих .py и .cgi-расширений. Я даже пытался использовать FastCGI без успеха.
  • Создал "Hello World" в том же каталоге и проверил, что он отлично работает.
  • Проверено разрешение на чтение/выполнение в каталогах Python, IIS и repos для IUSR, IWAM и NETWORK SERVICE.
  • Попробовал применить два разных патча от Mercurial listing list. Поскольку они оба старые, я не добился успеха.
  • Инсталлировать обработчик Sysinternals и проверить ошибки файловой системы во время запроса. Я ничего не нашел, кроме большого количества переполнений буфера в процессе Python, когда он загружает библиотеки.
  • Попробовал добавить 'Content-type: text/html' в script.

Еще одна вещь, когда я запрашиваю файл inexistent script (например,/hg/inexist.cgi), у меня такая же ошибка. Ничего не помогло!

Ответы

Ответ 1

Наконец, я получил ошибку "no headers", возвращаемую при любой ошибке python script, поэтому я проверил script с помощью консольного интерпретатора и исправил ошибки в моем файле конфигурации. И, конечно, я должен задать этот вопрос в ServerFault вместо StackOverflow - недостаток сна сделал задание:)

Ответ 2

Еще кое-что, что мне нужно было исправить:

  • В тех случаях, когда различные HOWTO говорят использовать c:\whatever\Python26\python.exe -u "%s" "%s" вместо использования c:\whatever\Python26\python.exe -u -O -B "%s" "%s" -O, он также ищет файлы .pyo(а не только .py или .pyc, которые по крайней мере в моей версии не присутствовали). -B заставляет его не пытаться скомпилировать файлы .pyo, которые он находит в .pyo файлах (которые не работают из-за отсутствия разрешений на запись)
  • Я установил Python 2.7. Файлы Mercurial 1.6.2.pyo были скомпилированы с помощью Python 2.6. Это привело к ошибке магического числа. Удаление 2.7 и установка 2.6.5 исправили это. (Если вы читаете это в какой-то момент в будущем, эта точка больше не может быть релевантной - проверьте имя DLL в каталоге Mercurial или каталог TortoiseHg, в зависимости от того, откуда вы взяли файл library.zip)
  • hgwebdir.cgi теперь только hgweb.cgi - webdir был интегрирован в него

Ответ 3

Там довольно хороший пост в http://vampirebasic.blogspot.com/2009/06/running-mercurial-on-windows.html, который поможет вам начать, но если вам нужно больше деталей или идти дальше, чем писатель сделал, у меня есть 4-страничное сообщение в блоге, которое охватывает все, что вам нужно знать о том, как вставать и работать в IIS, включая интеграцию с Active Directory, привилегии pull/push, настройку пользовательского интерфейса:

http://www.endswithsaurus.com/2010/05/setting-up-and-configuring-mercurial-in.html

Стоит прочитать...

Ответ 4

В моей ситуации эта ошибка, вызванная линией application = hgwebdir('c:\somewhere\hgweb.config') в hgweb.cgi, должна быть application = hgweb('c:\somewhere\hgweb.config').

Кроме того, строка uncomment import cgitb; cgitb.enable() в hgweb.cgi даст вам больше информации об ошибке (и других ошибках).

P.S. Я использую Python 2.6.6 и Mercurial 1.7.3 на Windows Server 2003 с IIS 6.0.

Ответ 5

В моем случае критический шаг, который исправил его, заключался в использовании: c:\whatever\Python26\python.exe -u -O -B "% s" "% s

До этого он не работал с ошибкой:

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.

 c:\hg\hgweb.cgi in ()
   13 import cgitb; cgitb.enable()
   14 
   15 from mercurial import demandimport; demandimport.enable()
   16 from mercurial.hgweb import hgweb, wsgicgi
   17 application = hgweb(config)
mercurial undefined, demandimport undefined
<type 'exceptions.ImportError'>: No module named mercurial 
      args = ('No module named mercurial',)