Почему мой hgweb сервер является настолько медленным?

Я подаю доступ ко многим подвижным репозиториям с помощью hgweb, если их как набор:

[collections]
/home/me = /home/me/projects

Это подает их в localhost/projects

У меня есть приблизительно 30 репозиториев в том местоположении, в исходном дереве с достаточным количеством другого, non-mercurial-managed проекты.

hgweb действительно не спешит отвечать; требуется приблизительно 30 секунд для обеспечения списка по http://localhost/, и приблизительно 30 секунд для открытия проекта, делая это болезненным для использования этого для совместного использования целей.

Как я могу настроить это для создания его быстрее?

Я работаю на OSX, если это имеет значение.

6
задан Chris R 10 August 2010 в 23:04
поделиться

4 ответа

AFAIK, hgweb будет сканировать все подкаталоги записи [collections] в своем конфигурационном файле. Поскольку у вас там много немеркурианских каталогов, ему придется просканировать каждый подкаталог каждого из них. Напротив, он может прекратить сканирование на верхнем уровне дерева каталогов, содержащего репозиторий Mercurial, поскольку увидит там каталог .hg.

Если вы используете более новую версию Mercurial (похоже, после 1.1), попробуйте изменить hgweb.config, чтобы вместо него использовать раздел [paths], и обеспечить явные записи для каждого из репозиториев Mercurial.

5
ответ дан 8 December 2019 в 17:17
поделиться

В продолжение очень полезного ответа Niall, приведенного выше, я понял, что мне нужен инструмент для поддержания этого раздела [paths]. В итоге я остановился на этом (который использует configobj от M. Foord.

#!/usr/bin/env python
from __future__ import print_function

import os

from configobj import ConfigObj

hgweb_path = os.path.join(os.path.expanduser("~"), "Library", "Preferences", "hgweb.config")
projects = os.path.join(os.path.expanduser("~"), "projects")

config = ConfigObj(hgweb_path)

paths = []

def add_mercurial(arg, dirname, names):
  if '.hg' in names:
    paths.append(dirname[len(projects) + 1:])

os.path.walk(projects, add_mercurial, None)

config['paths'] = {}

for path in paths:
  config['paths']["projects/" + path] = os.path.join(projects, path)

config.write()

Этот скрипт запускается эквивалентом cron в OS X каждые 15 минут и гарантирует, что мой hgweb никогда не устареет.

1
ответ дан 8 December 2019 в 17:17
поделиться
​​

В качестве альтернативы с открытым исходным кодом вы можете использовать RhodeCode http://rhodecode.com , это замена hgweb, полностью написанная на Python.

  • имеет собственное промежуточное ПО для обработки запросов ртутного протокола, каждый запрос может быть зарегистрирован и аутентифицирован + поточная производительность маловероятна для hgweb
  • полные права доступа для каждого проекта на чтение / запись / доступ администратора даже по ртутному запросу
  • шаблоны mako позволяют настраивать внешний вид приложения.
  • различает аннотации и исходный код, окрашенные пигментами.
  • График ветвления Mercurial и графы с питанием от yui-flot
  • Интерфейс администратора для выполнения управления пользователями / разрешениями, а также управления репозиториями.
  • Дополнительные настройки для Mercurial Web (хуки, редактируемые из панели администратора!) Также управляют путями, архивом, удаленными сообщениями
  • сценарии резервного копирования могут делать резервную копию всего приложения и отправлять его по scp в желаемое место
  • описание проекта установки и информация внутри встроенной базы данных для простых операций без файловой системы
  • Полный текст для поиска по кодам репозитория
  • добавлен кеш с аннулированием при управлении push / репо для высокой производительности и всегда актуальных данных.
  • RSS / атомы, поддержка gravatar
  • на основе pylons 1.0 / sqlalchemy
7
ответ дан 8 December 2019 в 17:17
поделиться

Проблема, вероятно, в том, что сервер рекурсивно ищет репозитории при каждом запросе. Похоже, что у вас довольно большой каталог, так что это имеет смысл.

Эта нотация будет работать с предпочтительным атрибутом [paths], но я не уверен, поможет ли она атрибуту [collections]. Попробуйте изменить на

[collections]
/home/me = /home/me/projects/*

чтобы поиск осуществлялся только на один уровень вниз.

Подробнее о проблеме читайте здесь: https://www.mercurial-scm.org/wiki/HgWebDirStepByStep

Если это не сработает, то точно поможет, если вы измените [paths] и будете использовать обозначение *.

1
ответ дан 8 December 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: