Подготовка ртутного сервера - PullRequest
1 голос
/ 05 октября 2009

Мне нужно программное обеспечение (не служба), которое имеет веб-API для создания и взаимодействия с ртутными репозиториями. Я думаю, что API может выглядеть следующим образом:

 POST /repos
 name=foo

Создает хранилище на /repos/foo, которое затем работает согласно hgwebdir.cgi.

Существует ли такое программное обеспечение? Если нет, то любые рекомендации о том, как его реализовать (я в порядке с синтаксисом Python, но относительно не знаю, как лучше создать такие приложения)

Ответы [ 5 ]

3 голосов
/ 05 октября 2009

Мне не известно о таком программном обеспечении, но было бы довольно тривиально создать его самостоятельно, если вы знакомы с веб-приложениями и python.

import os
from mercurial import commands,ui
os.mkdir("/repos/foo")
commands.init(ui.ui(),"/repos/foo")

должен сделать свое дело. Конечно, вам нужно обернуть его в хороший скрипт WSGI, чтобы иметь веб-интерфейс / API

Для получения дополнительной информации обратитесь к документации Mercurial API

2 голосов
/ 27 января 2011

посмотрите на https://bitbucket.org/sdorra/scm-manager

1 голос
/ 06 октября 2009

Для тех, кто заинтересован в этом, я реализовал сценарий Python CGI, чтобы сделать что-то подобное, избежав некоторых проблем с безопасностью, передав наименование репо в основном в руки сервера. Код в https://bitbucket.org/jimdowning/lf-hg-server/. Основной create.py скрипт выглядит так: -

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

import cgi
import ConfigParser
from mercurial import commands, ui
import os
import uuid

import cgitb
cgitb.enable()

def bad_request(reason): 
    print "Content-type: text/html"
    print "Status: 400 ", reason
    print 
    print "<html><body><h1>Bad request</h1><p>", reason, "</p></body></html>"

def abs_url(rel, env): 
    protocol = env["SERVER_PROTOCOL"].partition("/")[0].lower()
    host = env["HTTP_HOST"]
    return "%s://%s/%s" % (protocol, host, rel)

if not os.environ["REQUEST_METHOD"] == "POST":
    bad_request("Method was not POST")
elif not (form.has_key("user")) :
    bad_request("Missing parameter - requires 'user' param")
else :
    form = cgi.FieldStorage()
    user = form["user"].value
    lfDir = os.path.dirname( os.environ["SCRIPT_FILENAME"])
    id = str(uuid.uuid1())
    userDir = os.path.join(lfDir, "repos", user)
    rDir = os.path.join(userDir, id)
    relPath = "lf/"+ rDir[len(lfDir)+1:]
    os.makedirs(rDir)
    commands.init(ui.ui(), rDir)
    repoUrl = abs_url(relPath, os.environ)
    config = ConfigParser.ConfigParser()
    config.add_section("web")
    config.set("web", "allow_push", "*")
    config.set("web", "push_ssl", "false")
    with open(os.path.join(rDir, ".hg", "hgrc"), "w+") as f:
        config.write(f)
    print "Content-Type: text/html\n"
    print "Status: 201\nLocation:"
    print
    print "<html><body><h1>Repository Created</h1>"
    print "<p>Created a repo at <a href=\""+ repoUrl + "\">"
    print repoUrl+ "</a></p>"
    print "</body></html>"

Я вставляю этот скрипт в тот же каталог, что и hgwebdir.cgi. Общее функционирование этого было сделано намного проще с некоторыми хитростями в hgweb.config: -

[collections]
repos/ = repos/

[web]
style = gitweb
1 голос
/ 06 октября 2009

Я написал чёртовую CGI-оболочку, чтобы сделать именно это некоторое время назад. Пожалуйста, ознакомьтесь с предупреждениями безопасности:

#!/bin/sh

echo -n -e "Content-Type: text/plain\n\n"

mkdir -p /my/repos/$PATH_INFO
cd /my/repos/$PATH_INFO
hg init

Пожалуйста, обратите внимание на предупреждения безопасности, найденные с полными инструкциями .

0 голосов
/ 05 октября 2009

hgwebdir.cgi может получить вас на полпути, если они уже созданы, это один из способов их размещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...