1. django_hg sait cloner

    J’ai profité du pont pour travailler sur l’un des points qui me semblait le plus critique dans django_hg, la gestion par django des requêtes HTTP utilisées pour cloner (et pour puller.)

    Je dois dire que cela s’est très bien passé, bien plus que je ne l’aurai pensé, grâce notamment à l’aide de la mailing-list (et en particulier de Dirkjan Ochtman [en] et Benoît Boussicot [en].) En fait, ce qui m’a le plus retenu, c’est que je m’attendais tellement à galérer que j’ai fait des erreurs bêtes et tout développeur sait bien que ce sont les erreurs les plus évidentes qui sont les plus difficiles à corriger !

    Faire traiter par django les requêtes d’un clone est donc très simple:

    # views.py
    def commands(request, name): 
        """ handles the commands sended by an hg client (clone, pull, push) 
        ``name`` 
            the name of the repository 
        """
        from mercurial import hg, ui 
        from mercurial.hgweb.request import wsgirequest 
        from mercurial.hgweb import protocol 
    
        cmds = ['between', 'branches', 'capabilities', 'changegroupsubset', 'heads'] 
        r = hg.repository(ui.ui(), name) 
        req = wsgirequest(request.META, None) 
    
        if request.GET.get('cmd') in cmds: 
            resp = protocol.__getattribute__(request.GET.get('cmd'))(r, req) 
    
        return HttpResponse(resp, protocol.HGTYPE)
    

    Les imports correspondent aux différents objets de Mercurial. On note en particulier que les requêtes sont des objets wsgirequest. Cela tombe bien, django aussi, à ceci prêt que la request django engloble les données nécessaires à la création d’une requête wsgi dans le dictionnaire request.META.)

    La liste des commandes disponibles est décrite dans cmds. Il suffit de créer en plus un objet repository r et après avoir vérifié que la commande est bien une des commandes attendues par l’objet protocol qui gère toutes les étapes [en] d’un clone, on obtient un flux qu’il suffit de retourner à Mercurial avec le bon type MIME, avec l’objet HttpResponse de django, dont l’inclusion se fait au niveau du module.

    Simplissime, non ? Vous pouvez voir le code en situation sur bitbucket [en].

    Ce code ne gère pas l’authentification. Je compte me pencher sur la question cette semaine, même si auparavant, je voudrais me pencher un peu sur ce blog qui est un peu en vrac depuis que Free, sur lequel j’héberge encore les images, est en carafe…

    Text
    6 months ago