bos@559: bos@559: bos@559: bos@572: youshe@1009: Collaborer avec d'autres personnes youshe@1009: youshe@1009: Comme tout outil complètement décentralisé, Mercurial youshe@1009: n'impose pas de politique sur la façon dont les personnes devraient youshe@1009: travailler ensemble. Cependant, si vous êtes nouveau dans les systèmes de youshe@1009: gestion de révisions distribués, cela aide d'avoir des outils et exemples youshe@1009: en tête lorsque vous réfléchissez à de possibles modèles de youshe@1009: workflow. youshe@1009: bos@559: bos@559: youshe@1009: Interface web de Mercurial youshe@1009: youshe@1009: Mercurial possède une interface web puissante qui andre@1019: propose plusieurs fonctions utiles. youshe@1009: youshe@1009: Pour une utilisation intensive, l'interface web vous youshe@1009: permet de naviguer dans un ou une collection de dépôt. Vous pouvez voir youshe@1009: l'historique d'un dépôt, examiner chaque modification (commentaires et youshe@1009: "diffs"), et voir le contenu de chaque répertoire et fichier. Vous youshe@1009: pouvez même accéder à une vue de l'historique qui vous donne une vue youshe@1009: graphique de la relation entre les modifications individuelles et les youshe@1009: fusions (merge). youshe@1009: andre@1019: De plus, pour l'utilisation humaine, l'interface web youshe@1009: fournit des flux Atom et RSS des changements dans un dépôt. Ceci vous youshe@1009: permet de souscrire à un dépôt en utilisant votre youshe@1009: lecteur de flux favori, et être automatiquement avertis de l'activité youshe@1009: dans ce dépôt aussi tôt qu'elle change. Je trouve cette fonctionnalité youshe@1009: bien plus commode que le modèle qui consiste à souscrire à une mailing youshe@1009: list à laquelle les avertissements sont envoyés, puisque cela demande youshe@1009: aucune configuration supplémentaire de la part de la personne qui youshe@1009: publie un dépôt. youshe@1009: youshe@1009: L'interface web permet aussi aux utilisateurs distants youshe@1009: de cloner un dépôt, récupérer (pull) les changement à partir de celui youshe@1009: ci, et (lorsque le serveur est configuré pour l'autoriser) lui envoyer youshe@1009: (push) des changements. Le protocole de tunnel HTTP de Mercurial youshe@1009: compresse agressivement les données, ainsi, il fonctionne efficacement, andre@1019: même au-dessus des réseaux avec une faible bande passante. youshe@1009: youshe@1009: La plus simple façon de démarrer avec l'interface youshe@1009: utilisateur est d'utiliser votre navigateur web pour visiter un dépôt youshe@1009: existant, tel que le dépôt principal de Mercurial à l'adresse http://www.selenic.com/repo/hg. youshe@1009: youshe@1009: Si vous êtes intéressés pour proposer une interface web youshe@1009: de vos propres dépôts, il y a plusieurs façons de le faire. youshe@1009: youshe@1009: La façon la plus simple et la plus rapide pour commencer youshe@1009: dans un environnement informel est d'utiliser la commande hg serve qui est la plus adaptée à un service andre@1019: à court terme et léger. Référez-vous à plus bas pour les détails d'utilisation youshe@1009: de cette commande. youshe@1009: youshe@1009: Pour des dépôts dont la durée de vie est plus longue, où youshe@1009: vous voudriez un service accessible en permanence, il existe plusieurs youshe@1009: services publics d'hébergement qui sont accessibles. Certains sont youshe@1009: libres et gratuits pour les projets Open Source, alors que d'autres andre@1019: offrent un hébergement commercial et payant. Une liste à jour est youshe@1009: disponible à l'adresse : http://www.selenic.com/mercurial/wiki/index.cgi/MercurialHosting. youshe@1009: youshe@1009: Si vous préférez héberger vos propres dépôts, Mercurial andre@1019: possède un support intégré pour plusieurs technologies populaires youshe@1009: d'hébergement, plus particulièrement CGI (Common Gateway Interface) et andre@1019: WSGI (Web Services Gateway Interface). Référez-vous à pour des détails sur la configuration CGI youshe@1009: et WSGI. bos@559: bos@675: bos@559: youshe@1009: Modèles de collaboration youshe@1009: andre@1019: Avec un outil convenablement flexible, prendre des andre@1019: décisions sur les workflows est plus un problème d'ingénierie sociale andre@1019: qu'un problème technique. Mercurial impose peu de limitations sur youshe@1009: la façon dont vous pouvez structurer le flux de travail dans un projet, youshe@1009: donc, c'est à vous et votre groupe de fixer et vivre avec un modèle qui youshe@1009: convient à vos besoins particuliers. youshe@1009: youshe@1009: youshe@1009: Facteurs à garder en tête youshe@1009: youshe@1009: L'aspect le plus important de tout modèle que vous youshe@1009: devez garder en tête est la façon dont il subvient aux besoins et youshe@1009: capacités des personnes qui l'utiliseront. Ceci pourrait sembler youshe@1009: évident en soi ; pourtant, vous ne pouvez pas vous permettre de youshe@1009: l'oublier à un seul moment. youshe@1009: youshe@1009: Une fois, j'ai mis en place un modèle de workflow qui youshe@1009: m'apparaissait comme parfait, mais il a causé la consternation et des youshe@1009: conflits au sein de mon équipe de développement. En dépit de mes youshe@1009: tentatives pour expliquer pourquoi nous avions besoin d'un ensemble youshe@1009: complexe de branches, et comment les changements devaient couler youshe@1009: entre eux, certains membres de l'équipe se révoltèrent. Alors qu'ils youshe@1009: étaient pourtant des personnes sympathiques, ils ne voulaient pas youshe@1009: prêter attention aux contraintes sur lesquelles nous étions en train youshe@1009: d'opérer, ou, face aux conséquences de ces contraintes dans les youshe@1009: détails du modèle que je préconisais. youshe@1009: youshe@1009: Ne balayez pas les problèmes sociaux ou techniques de andre@1019: la main. Quelque soit le schéma que vous établirez, vous devriez andre@1019: planifier un protocole pour prévenir, ou rapidement vous relever de youshe@1009: troubles que vous pouvez anticiper. Par exemple, si vous vous andre@1019: attendez à avoir une branche pour les changements pas-pour-release, andre@1019: vous devriez penser très tôt à la possibilité qu'une personne youshe@1009: fusionne (merge) accidentellement ces changements avec une branche de youshe@1009: release. Vous pouvez empécher ce problème particulier en écrivant un youshe@1009: hook qui prévient les changements d'être fusionnés à partir d'une andre@1019: branche inopportune. youshe@1009: youshe@1009: youshe@1009: youshe@1009: Anarchie informelle youshe@1009: youshe@1009: Je ne voudrais pas suggérer qu'une approche youshe@1009: tout peut arriver comme quelque chose de durable, mais youshe@1009: il s'agit d'un modèle qui est simple à saisir et qui fonctionne youshe@1009: parfaitement dans quelques situations inhabituelles. youshe@1009: youshe@1009: Par exemple, beaucoup de projets ont un groupe distant youshe@1009: de collaborateurs qui ne se rencontre physiquement que très rarement. youshe@1009: Certains groupes aiment vaincre l'isolation du travail à distance en youshe@1009: organisant occasionnellement des sprints. Dans un andre@1019: sprint, des personnes viennent ensemble dans un même andre@1019: endroit (la salle de conférence d'une société, la salle de réunion andre@1019: d'un hôtel, ce genre d'endroit) et y passent plusieurs jours, plus ou youshe@1009: moins enfermés, et hackant intensément sur une poignée de youshe@1009: projets. youshe@1009: youshe@1009: Un "sprint" ou une session de "hacking" dans un café youshe@1009: sont les endroits parfaits pour utiliser la commande hg serve puisque hg youshe@1009: serve n'a pas besoin d'une infrastructure extraordinaire youshe@1009: de serveurs. Vous pouvez commencer avec la commande hg serve en quelques instants, en lisant plus bas Ensuite, dites simplement à andre@1019: la personne à côté de vous que vous exécutez un serveur, envoyez-lui youshe@1009: l'URL par un message instantané, et vous avez immédiatement un moyen youshe@1009: simple et rapide de travailler ensemble. Ils peuvent taper votre URL andre@1019: dans leur navigateur web et rapidement revoir vos youshe@1009: changements ; ou ils peuvent récupérer chez vous un bugfix et le youshe@1009: vérifier ; ou ils peuvent cloner une branche contenant une nouvelle youshe@1009: fonctionnalité et la tester. youshe@1009: youshe@1009: Le charme et le problème en faisant les choses ainsi, andre@1019: dans un mode ad-hoc est que seules les personnes qui sont au courant youshe@1009: de vos changements, et de leur emplacement, peuvent les voir. Une youshe@1009: telle approche informelle ne passe simplement pas à l'échelle au delà youshe@1009: d'une poignée de personnes, puisque chacun a besoin de connaître youshe@1009: n différents dépôts à partir des quels récupérer youshe@1009: les changements (pull). youshe@1009: youshe@1009: youshe@1009: youshe@1009: Un simple dépôt central youshe@1009: youshe@1009: Pour de plus petits projets qui migrent depuis un youshe@1009: outil de gestion de révision centralisé, la façon la youshe@1009: plus simple de commencer est certainement d'avoir un flux de youshe@1009: changement à partir d'un unique dépôt central. Il s'agit aussi du andre@1019: composant pour des schémas de workflow plus youshe@1009: ambitieux. youshe@1009: youshe@1009: Les contributeurs commencent par cloner une copie de youshe@1009: ce dépôt. Ils peuvent récupérer les changements à n'importe quel youshe@1009: moment où ils en ressentent le besoin, et certains (sûrement tous) youshe@1009: développeurs ont les persmissions qui leur permettent d'envoyer leurs youshe@1009: modifications (push) en retour lorsqu'elles sont prêtes pour que les youshe@1009: autres personnes puissent les voir. youshe@1009: youshe@1009: Dans ce modèle, il peut encore être sensé pour les youshe@1009: gens de récupérer les changements directement entre eux, sans passer andre@1019: par le dépôt central. Considérez le cas où j'ai un bug andre@1019: fix provisoire, mais je m'inquiète de savoir si, dans le cas où je le publiais, youshe@1009: cela ne casserait pas l'arbre des autres contributeurs s'ils la andre@1019: récupèreraient. Pour réduire les dommages potentiels, je peux vous youshe@1009: demander de cloner mon dépôt dans un dépôt temporaire qui vous youshe@1009: appartient et de le tester. Ceci nous permet de ne pas publier les youshe@1009: modification potentiellement dangereuses tant qu'elles n'ont pas youshe@1009: encore été un peu testées. youshe@1009: youshe@1009: Si une équipe héberge son propre dépôt dans ce type de youshe@1009: scénario, les personnes qui utilisent habituellement le protocole youshe@1009: ssh pour envoyer (push) en toute sécurité leurs youshe@1009: changements au dépôt central, comme docummenté dans . Il est aussi usuel de publier une copie youshe@1009: en lecture seule du dépôt sur HTTP comme dans . Publier sur HTTP satisfait le besoin youshe@1009: des personnes qui n'ont pas d'accès en écriture, et ceux qui veulent youshe@1009: utiliser leur navigateur web pour explorer l'historique du youshe@1009: dépôt. youshe@1009: youshe@1009: youshe@1009: youshe@1009: Un dépôt central hébergé youshe@1009: youshe@1009: Une chose magnifique au sujet des services youshe@1009: d'hébergement comme Bitbucket est qu'ils ne gèrent andre@1019: pas uniquement les détails minutieux de la configuration du andre@1019: serveur, tels que les comptes utilisateurs, l'authentification, les youshe@1009: protocoles sécurisés, ils fournissent aussi une infrastructure andre@1019: additionnelle pour que ce modèle fonctionne youshe@1009: bien. youshe@1009: youshe@1009: Par exemple, un service d'hébergement bien conçu youshe@1009: laissera les personnes cloner leurs copies d'un dépôt à l'aide d'un andre@1019: simple clic. Ceci laisse les personnes travailler dans des espaces youshe@1009: séparés et partager leurs changements lorsqu'ils sont prêts. youshe@1009: youshe@1009: De plus, un bon service d'hébergement laissera les youshe@1009: personnes communiquer ensemble, par exemple pour dire Il y a youshe@1009: des changements prêts pour toi pour relecture dans cet youshe@1009: arbre. youshe@1009: youshe@1009: youshe@1009: youshe@1009: youshe@1009: Travailler avec plusieurs branches youshe@1009: youshe@1009: Les projets d'une taille significative ont tendance à youshe@1009: avancer sur plusieurs fronts en même temps. Dans le cas de logiciel, youshe@1009: il est commun qu'un projet sorte périodiquement des releases youshe@1009: officielles. Une release devrait ensuite aller dans le mode de youshe@1009: maintenance pour un moment après sa première publication ; youshe@1009: les releases de maintenance tendent à contenir seulement des youshe@1009: corrections de bugs, et non de nouvelles fonctionnalités. En youshe@1009: parallèle de ces releases de maintenance, une ou plusieurs futures youshe@1009: releases doivent être en cours de développement. Les gens utilisent youshe@1009: en général le mot branche pour référer à l'une de ces youshe@1009: nombreuses directions légèrement différentes dans lesquelles le youshe@1009: développement évolue. youshe@1009: youshe@1009: Mercurial est particulièrement bien adapté pour gérer youshe@1009: plusieurs branches simultanées mais non identiques. Chaque youshe@1009: direction de développement peut vivre dans son propre youshe@1009: dépôt central, et vous pouvez récupérez les changements de l'un ou youshe@1009: l'autre lorsque le besoin s'en fait sentir. Parce que les dépôts sont andre@1019: indépendant les uns des autres, les modifications instables dans une youshe@1009: branche de développement n'affecteront jamais une branche stable, youshe@1009: sauf si quelqu'un fusionne (merge) explicitement ces changements dans youshe@1009: la branche stable. youshe@1009: youshe@1009: Voici un exemple sur comment cela peut se passer en youshe@1009: pratique. Disons que vous avez une branche principale youshe@1009: sur un serveur central. bos@567: bos@567: &interaction.branching.init; bos@567: youshe@1009: Les contributeurs le clonent, y apportent localement youshe@1009: des modifications, les testent et envoient (push) en retour leurs youshe@1009: changements. youshe@1009: youshe@1009: Une fois que la branche principale atteint une étape youshe@1009: assez importante pour une release, vous pouvez utiliser la commande youshe@1009: hg tag pour donner un nom permanent youshe@1009: à cette étape de révision. youshe@1009: youshe@1009: &interaction.branching.tag; youshe@1009: andre@1019: Disons que du developpement continue sur la youshe@1009: branche principale. bos@567: bos@567: &interaction.branching.main; bos@567: andre@1019: En utilisant le tag enregistré à l'étape importante, andre@1019: les gens qui clonent ce dépôt peuvent à tout moment dans le futur youshe@1009: utiliser la commande hg update pour youshe@1009: avoir une copie du répertoire de travail exactement comme il était youshe@1009: lorsque cette révision "tag" a été committée. bos@567: bos@567: &interaction.branching.update; bos@559: youshe@1009: De plus, immédiatement après que la branche principale youshe@1009: soit taggée, nous pouvons maintenant cloner la branche principale sur youshe@1009: le serveur vers une nouvelle branche stable sur le andre@1020: même serveur. bos@567: bos@567: &interaction.branching.clone; bos@559: youshe@1009: Si nous avons besoin d'effectuer des modifications à youshe@1009: la branche stable, nous pouvons alors cloner ce youshe@1009: dépôt, effectuer nos modifications, committer, et envoyer nos youshe@1009: changements en retour là bas. bos@567: bos@567: &interaction.branching.stable; bos@567: youshe@1009: Puisque les dépôts Mercurial sont indépendants, et que youshe@1009: Mercurial ne déplace pas les changements automatiquement, les youshe@1009: branches stable et principale sont isolées l'une youshe@1009: de l'autre. Les changements qui sont faits à la branche principale ne youshe@1009: fuient pas vers la branche stable, et vice youshe@1009: versa. youshe@1009: youshe@1009: Nous allons souvent avoir envie que toutes nos youshe@1009: correction de bugs sur la branche stable soient reportées sur la youshe@1009: branche principale. Plutôt que de réécrire une correction de bug pour youshe@1009: la branche principale, nous pouvons simplement récupérer (pull) et youshe@1009: fusionner (merge) les changements de la branche stable vers la youshe@1009: branche principal, et Mercurial se débrouillera pour rapporter ces youshe@1009: corrections de bugs pour nous. bos@675: bos@675: &interaction.branching.merge; bos@675: youshe@1009: La branche principale contiendra toujours des youshe@1009: changements qui ne sont pas dans la branche stable, mais elle youshe@1009: contiendra aussi les corrections de bugs de la branche stable. La youshe@1009: branche stable restera non affectée par ces changements, tant qu'ils youshe@1009: coulent de la branche stable vers la branche principale, et non dans youshe@1009: l'autre sens. bos@675: bos@675: bos@559: bos@559: Feature branches andre@1019: youshe@1009: Pour de plus gros projets, une façon efficace de gérer andre@1019: les changements est de diviser l'équipe en plus petits groupes. Chaque youshe@1009: groupe a une branche partagée qui lui est attitrée, clonée à partir youshe@1009: d'une unique branche principale utilisée pour le youshe@1009: projet entier. Les personnes travaillant sur une branche individuelle youshe@1009: sont typiquement isolées des développements sur les autres youshe@1009: branches. bos@559: bos@591:
youshe@1009: Feature branches youshe@1009: youshe@1009: youshe@1009: XXX add text youshe@1009: bos@591:
bos@559: youshe@1009: Lorsqu'une fonctionnalité particulière est réputée andre@1019: pour être dans une forme adaptée, quelqu'un de l'équipe qui s'en occupe andre@1019: récupère les changements (pull) à partir de youshe@1009: la branche principale vers la branche de cette fonctionnalité, youshe@1009: fusionne (merge) et renvoie (push) le tout vers la branche youshe@1009: principale. youshe@1009:
youshe@1009: youshe@1009: youshe@1009: Le train des releases youshe@1009: andre@1019: youshe@1009: youshe@1009: Certains projets sont organisés comme un andre@1019: train élémentaire : une release est planifiée tous les youshe@1009: quelques mois, et, toutes les fonctionnalités disponibles lorsque le andre@1020: train est prêt à s'arrêter sont autorisées ici. youshe@1009: youshe@1009: Ce modèle ressemble à travailler avec des branches de youshe@1009: fonctionnalités. La différence est que lorsqu'une branche de youshe@1009: fonctionnalité rate le train, quelqu'un de l'équipe qui travaille sur youshe@1009: cette fonctionnalité récupère (pull) et fusionne (merge) ce qui a été youshe@1009: ajouté à la release du train dans la branche de la fonctionnalité, andre@1019: puis, l'équipe continue son travail au-dessus de cette release afin youshe@1009: que leur fonctionnalité puisse être ajoutée à la prochaine youshe@1009: release. youshe@1009: youshe@1009: youshe@1009: andre@1019: Le modèle du noyau Linux youshe@1009: youshe@1009: Le développement du noyau Linux est doté d'une youshe@1009: structure hiérarchique superficielle, entourée par un nuage de chaos youshe@1009: apparent. Parce que la plupart des développeurs Linux utilisent youshe@1009: git, un outil distribué de gestion de révisions youshe@1009: avec des capacités similaires à celles de Mercurial, il est utile de youshe@1009: décrire comment le travail se déroule dans cet environnement ; si youshe@1009: vous aimez ces idées, l'approche se traduit correctement à travers youshe@1009: les outils. youshe@1009: andre@1019: Au centre de la communauté siège Linus Torvalds, le andre@1019: créateur de Linux. Il publie un dépôt unique de sources qui est andre@1019: considéré comme faisant autorité sur l'arborescence youshe@1009: par la communauté entière de développeurs. Tout le monde peut cloner andre@1019: l'arbre de Linus, mais il ne récupère (pull) pas les changements de n'importe quelle arborescence. andre@1019: andre@1019: Linus a plusieurs lieutenants de youshe@1009: confiance. Comme règle générale, il récupère (pull) tous youshe@1009: les changements qu'ils publient, dans la plupart des cas sans même youshe@1009: relire ces modifications. Certains de ces lieutenants sont youshe@1009: généralement autorisés à être mainteneurs, andre@1019: responsables pour un sous-système spécifique du noyau. Si un andre@1019: hacker du noyau veut apporter des modification au sous-système andre@1019: qu'il veut voir intégré à l'arbre de Linus, il doit trouver youshe@1009: le mainteneur du sous-système, et lui demander de récupérer ses youshe@1009: changements. Si le mainteneur relit ses changements et les accepte, youshe@1009: ils seront transmis à Linus le moment venu. youshe@1009: youshe@1009: Les lieutenants individuels ont leur propre approche youshe@1009: pour relire, accepter et publier les changements ; et pour décider youshe@1009: quand les apporter à Linus. De plus, il y a plusieurs branches youshe@1009: connues que les personnes utilisent pour différentes choses. youshe@1009: Par exemple, quelques personnes maintiennent des dépôts youshe@1009: stables de leurs versions du noyau, pour lesquels ils youshe@1009: apportent des corrections critiques lorsque nécessaire. Certains youshe@1009: mainteneurs publient plusieurs arbres : l'un pour les changements youshe@1009: expérimentaux, l'un pour les changements qu'ils vont faire remonter, youshe@1009: etc. D'autres ne publient qu'un unique arbre. youshe@1009: youshe@1009: Ce modèle a deux caractéristiques remarquables. La youshe@1009: première est qu'il s'agit de pull seulement. Vous andre@1019: devez demander, convaincre, ou mendier auprès d'un autre développeur andre@1019: pour prendre vos modifications, puisqu'il n'y a vraisemblablement pas andre@1019: d'arbre où plus d'une personne peut envoyer des changements (push), et youshe@1009: qu'il n'y a pas de possibilité d'envoyer des changements (push) vers youshe@1009: un arbre que quelqu'un d'autre contrôle. youshe@1009: youshe@1009: La seconde est que c'est basé sur la réputation et youshe@1009: l'acclamation. Si vous êtes un inconnu, Linus va probablement ignorer andre@1019: vos changements sans même répondre. Cependant, un mainteneur de youshe@1009: sous-système les relira probablement, et les acceptera sûrement s'ils andre@1019: passent ses critères d'acceptation. Plus vous enverrez du andre@1019: bon code à un mainteneur, et plus celui-ci aura andre@1019: confiance en votre jugement et acceptera vos changements. Si vous youshe@1009: êtes bien connu et maintenez une branche ancienne pour quelque chose youshe@1009: que Linus n'a pas encore accepté, les gens avec un intérêt similaire youshe@1009: devraient récupérer vos changements régulièrement pour rester à jour andre@1019: vis-à-vis de votre travail. youshe@1009: youshe@1009: La réputation et l'acclamation ne nécessite pas de andre@1019: système croisé ou de limites entre les gens. Si vous youshe@1009: êtes respectés mais que vous êtes un hacker spécialisé dans la youshe@1009: sauvegarde, et que vous tentez de corriger un bug réseau, ce andre@1019: changement recevra un examen approfondi de la part du mainteneur youshe@1009: responsable du réseau comparable à celui d'un total étranger. youshe@1009: youshe@1009: Pour les personnes qui viennent d'un projet dont andre@1019: le milieu est plus ordonné, le processus chaotique de andre@1019: développement du noyau Linux en comparaison apparaît souvent totalement andre@1019: dément. C'est sujet aux caprices d'individus ; andre@1019: des personnes font des changements considérables quand ils les andre@1019: jugent appropriés ; et l'allure du développement est andre@1019: ahurissante. Et pourtant, Linux est un bout de logiciel d'une grande youshe@1009: réussite et bien considéré. youshe@1009: youshe@1010: youshe@1009: youshe@1009: Collaboration pull seulement versus pull partagé bos@559: andre@1019: Une source perpétuelle de heurts dans la communauté andre@1019: opensource est de savoir si un modèle de développement où les andre@1019: personnes ne peuvent que récupérer (pull) les changements d'autres est andre@1019: meilleur que celui dans lequel de multiples personnes peuvent youshe@1010: envoyer (push) leurs changements vers un dépôt partagé. youshe@1010: andre@1019: Typiquement, les partisans du modèle push youshe@1010: partagé utilisent des outils qui renforcent activement cette youshe@1010: approche. Si vous utilisez un outil centralisé de gestion de révision youshe@1010: comme Subversion, il n'y a pas la possibilité de choisir quel modèle youshe@1010: utiliser : l'outil vous fournit un push partagé, et si vous voulez youshe@1010: faire quelque chose d'autre, vous avez à changer votre propre youshe@1010: approche à la base (comme appliquer les patchs manuellement). youshe@1010: youshe@1010: Un bon outil de gestion distribuée de révisions doit youshe@1010: supporter les deux modèles. Vous et vos collaborateurs pouvez ensuite youshe@1010: structurer la façon dont vous travaillez ensemble en vous basant sur andre@1019: vos besoins et vos préférences, et non sur les contorsions que vos youshe@1010: outils vous forcent à effectuer. youshe@1010: youshe@1010: youshe@1010: Lorsque la collaboration rencontre la gestion de branches youshe@1010: youshe@1010: Lorsque vous et votre équipe configurez des dépôts youshe@1010: partagés et commencez à propager vos changement dans tous les sens youshe@1010: entre les dépôts locaux et partagés, vous commencez à être face à un andre@1019: défi connexe, mais un peu différent : celui de gérer les youshe@1010: multiples directions vers lesquelles votre équipe pourrait aller au youshe@1010: même moment. Même si ce sujet est intimement lié à la façon dont andre@1019: votre équipe collabore, il est suffisement dense pour mériter un youshe@1010: traitement à part dans . bos@559: bos@559:
bos@675: bos@559: andre@1019: Le côté technique du partage andre@1019: andre@1019: Le reste de ce chapitre est consacré à la question du youshe@1010: partage des changements avec vos collaborateurs. bos@559: bos@675: bos@559: youshe@1010: Partage informel avec <command role="hg-cmd">hg youshe@1010: serve</command> youshe@1010: youshe@1010: La commande hg serve de youshe@1010: Mercurial est magnifiquement conçue pour un environnement de petit youshe@1010: groupe, soudé et rapide. Elle fournit aussi un très bon moyen d'avoir youshe@1010: un sentiment de l'utilisation des commandes Meruciral sur un youshe@1010: réseau. youshe@1010: youshe@1010: Exécutez hg serve à andre@1019: l'intérieur d'un dépôt et en moins d'une seconde, cela mettra en place youshe@1010: un serveur HTTP spécialisé ; qui va accepter les connexions de tout andre@1019: client, et servir les données pour ce dépôt jusqu'à ce que vous andre@1019: l'arrêtiez. Toute personne qui connaît l'URL du serveur que vous venez youshe@1010: de démarrer, peut ensuite utiliser un navigateur web ou Mercurial pour youshe@1010: lire les données de ce dépôt. Une URL pour une instance exécutée de youshe@1010: hg serve sur un ordinateur portable andre@1019: ressemblera vraisemblablement à bos@559: http://my-laptop.local:8000/. bos@559: youshe@1010: La commande hg serve youshe@1010: n'est pas un serveur web youshe@1010: générique. Il ne peut faire que deux choses : bos@559: youshe@1010: Autoriser les personnes à explorer youshe@1010: l'historique du dépôt qu'il rend accessible, à partir d'un youshe@1010: navigateur web normal. bos@559: youshe@1010: Discuter à travers le protocole de youshe@1010: communication de Mercurial, ainsi, les personnes peuvent exécuter hg clone ou hg youshe@1010: pull sur les changements de ce dépôt. bos@559: youshe@1010: En particulier, hg serve youshe@1010: ne permettra pas aux utilisateurs distants de youshe@1010: modifier votre dépôt. C'est destiné à une youshe@1010: utilisation en lecture seule. youshe@1010: youshe@1010: Si vous commencez avec Mercurial, il n'y a rien qui vous andre@1019: empêche d'utiliser hg serve pour youshe@1010: publier un dépôt sur votre ordinateur, utilisez ensuite des commandes youshe@1010: telles que hg clone, hg incoming, et ainsi de suite pour parler à youshe@1010: ce serveur comme si ce dépôt était hébergé à distance. Ceci peut vous youshe@1010: aider à rapidement familiarisé avec les commandes sur les dépôts youshe@1010: hébergés sur un réseau. youshe@1010: youshe@1010: youshe@1010: Quelques choses à garder à l'esprit youshe@1010: andre@1019: Puisque il fournit un accès en lecture sans youshe@1010: authentification à tous les clients, vous devriez utiliser la youshe@1010: commande hg serve dans un andre@1019: environnement où vous ne vous inquiétez pas ou vous avez youshe@1010: tout contrôle sur qui peut avoir accès au réseau et récupérer les youshe@1010: données de votre dépôt. youshe@1010: youshe@1010: La commande hg serve andre@1019: ne sait rien sur un quelconque firewall que vous auriez youshe@1010: installé sur votre système ou réseau. Elle ne peut pas détecter ou youshe@1010: contrôler votre logiciel de pare-feu. Si d'autre personnes ont la youshe@1010: possibilité de dialoguer avec une instance de hg serve la seconde chose que vous devriez youshe@1010: faire (après être sûr qu'ils utilisent l'URL youshe@1010: correcte) est de vérifier la configuration de votre firewall. youshe@1010: youshe@1010: Par défaut, hg serve youshe@1010: écoute pour les connexions entrantes sur le port 8000. Si un autre youshe@1010: processus est déjà en train d'écouter sur le port que vous voulez youshe@1010: écouter, vous pouvez spécifier un port différent sur lequel écouter à youshe@1010: l'aide de l'option . youshe@1010: youshe@1010: Normalement, lorsque hg youshe@1010: serve se lance, il n'affiche aucune sortie, ce qui peut youshe@1010: être un peu énervant. Si vous voulez une confirmation que tout s'est youshe@1010: déroulé correctement, et connaître l'URL que vous devriez fournir à youshe@1010: vos collaborateurs, démarrez avec l'option . bos@559: bos@559: bos@675: bos@559: youshe@1010: Utiliser le protocole Secure Shell (ssh) youshe@1010: youshe@1010: Vous pouvez récupérer (pull) ou envoyer (push) des andre@1019: changements de façon sécurisé au dessus d'une connexion utilisant le youshe@1010: protocole Secure Shell (ssh). Pour l'utiliser avec andre@1019: succès, vous pourriez avoir à faire un peu de configuration du côté youshe@1010: client ou serveur. youshe@1010: youshe@1010: Si vous n'êtes pas familiers avec ssh, c'est le nom de youshe@1010: la commande et d'un protocole réseau qui vous permet d'établir une youshe@1010: communication sécurisée avec un autre ordinateur. Pour l'utiliser avec andre@1019: Mercurial, vous allez configurer un ou plusieurs comptes utilisateurs andre@1019: sur un serveur, comme ça, les utilisateurs distants peuvent se connecter et youshe@1010: exécuter les commandes. youshe@1010: youshe@1010: (Si vous êtes familiers avec ssh, andre@1019: vous allez probablement trouver quelques-unes des informations qui youshe@1010: suivent élémentaires par nature.) youshe@1010: youshe@1010: youshe@1010: Comment lire et écrire des URLs ssh youshe@1010: andre@1019: Une URL ssh a tendance à ressembler à ceci : bos@559: ssh://bos@hg.serpentine.com:22/hg/hgbook bos@559: youshe@1010: Le préfixe youshe@1010: ssh:// dit à Mercurial youshe@1010: d'utiliser le protocole ssh. youshe@1010: youshe@1010: Le composant youshe@1010: bos@ indique que le nom andre@1019: d'utilisateur à connecter sur le serveur. Vous pouvez le laisser youshe@1010: vide si le nom d'utilisateur sur le serveur distant est le même youshe@1010: que localement. youshe@1010: youshe@1010: La partie youshe@1010: hg.serpentine.com donne le nom andre@1019: d'hôte du serveur sur lequel se connecter. youshe@1010: youshe@1010: Le :22 identifie le numéro youshe@1010: de port où se connecter au serveur. Le port par défaut est 22, andre@1019: donc vous avez besoin de spécifier ceci que si vous youshe@1010: n'utilisez pas le port youshe@1010: 22. youshe@1010: youshe@1010: Le reste de l'URL est le chemin local du youshe@1010: dépôt sur le serveur. youshe@1010: andre@1019: Il y a beaucoup de risque de confusion sur le youshe@1010: chemin du composant d'une URL ssh puisqu'il n'y a pas de façon andre@1019: standard pour les outils de l'interpréter. Certains programmes se andre@1019: comportent différemment des autres lorsqu'ils traitent ces chemins. Il youshe@1010: ne s'agit pas d'une situation idéale, mais ce n'est pas prêt de andre@1019: changer. Lisez les prochains paragraphes avec attention. youshe@1010: youshe@1010: Mercurial traite le chemin vers un dépôt sur le youshe@1010: serveur comme relatif au répertoire personnel de l'utilisateur sur le youshe@1010: serveur distant. Par exemple, si un utilisateur youshe@1010: foo sur le serveur a un répertoire personnel youshe@1010: /home/foo, alors l'URL ssh qui andre@1019: contient un composant chemin de bar réfère en youshe@1010: réalité au répertoire /home/foo/bar. youshe@1010: andre@1019: Si vous voulez spécifier un chemin relatif au youshe@1010: répertoire personnel d'un autre utilisateur, vous pouvez préciser un andre@1019: chemin qui commence à l'aide du caractère tilde suivi du nom de youshe@1010: l'utilisateur (appelons le otheruser), youshe@1010: ainsi. bos@559: ssh://server/~otheruser/hg/repo bos@559: youshe@1010: Et si vous voulez vraiment spécifier un chemin andre@1019: absolu sur le serveur, débutez le composant youshe@1010: chemin par deux slashs comme dans cet exemple. bos@559: ssh://server//absolute/path bos@675: bos@675: bos@559: youshe@1010: Trouver un client ssh pour votre système youshe@1010: youshe@1010: La plupart des systèmes du type Unix arrivent avec youshe@1010: OpenSSH préinstallé. Si vous utilisez un tel système, utilisez youshe@1010: which ssh pour trouver où la commande youshe@1010: ssh est installée (il s'agit généralement de youshe@1010: /usr/bin). Dans le cas peu andre@1019: probable où il ne serait pas présent, regarder la documentation de youshe@1010: votre système pour voir comment l'installer. youshe@1010: andre@1019: Sous Windows, le paquet TortoiseHg est livré avec youshe@1010: une version de l'excellente commande plink de andre@1019: Simon Tatham, et ne devrait pas avoir besoin de plus de youshe@1010: configuration. youshe@1010: youshe@1010: youshe@1010: andre@1019: Créer une paire de clef youshe@1010: youshe@1010: Pour éviter d'avoir à chaque fois taper un mot de andre@1019: passe lorsque vous utilisez votre client ssh, je recommande andre@1019: de créer une paire de clefs. bos@675: bos@675: youshe@1010: Les paires de clefs ne sont pas obligatoires youshe@1010: youshe@1010: Mercurial ne sait rien du tout de l'authentification youshe@1010: de ssh ou de la paire de clefs. Vous pouvez, si vous le désirez, andre@1019: ignorer sans risque cette section et la suivante jusqu'à ce que andre@1019: vous soyez fatigué de constamment retaper des mots de passe youshe@1010: ssh. bos@675: bos@675: bos@559: youshe@1010: Sur un système de type Unix, la commande youshe@1010: ssh-keygen fera l'affaire. youshe@1010: Sous Windows, si vous utilisez andre@1019: TortoiseHg, vous devriez avoir besoin de télécharger la commande youshe@1010: nommée puttygen à partir du site andre@1019: web de PuTTY pour créer une paire de clefs. Référez-vous andre@1019: à la youshe@1010: documentation puttygen pour les youshe@1010: détails sur l'utilisation de cette commande. bos@675: bos@559: andre@1019: Lorsque vous créez une paire de clefs, il est andre@1019: habituellement hautement recommandé de la youshe@1010: protéger avec un mot de passe. (Le seul moment où vous pourriez ne youshe@1010: pas devoir le faire est lorsque vous utilisez le protocole ssh pour youshe@1010: des tâches automatisées sur un réseau sécurisé.) youshe@1010: andre@1019: Le simple fait de créer une paire de clefs n'est andre@1019: cependant pas suffisant. Vous aurez besoin d'ajouter la clef publique andre@1019: à l'ensemble des clefs autorisées pour tout utilisateur que vous youshe@1010: utilisez pour vous connecter à distance. Pour les serveurs utilisant youshe@1010: OpenSSh (la grande majorité), ceci voudra dire d'ajouter la clef youshe@1010: publique à la liste dans un fichier appelé authorized_keys dans leur répertoire youshe@1010: .ssh. youshe@1010: youshe@1010: Sur un système de type Unix, votre clef publique aura youshe@1010: l'extension .pub. Si vous utilisez la commande youshe@1010: puttygen sous Windows, vous pouvez sauvegarder la youshe@1010: clef publique dans un fichier que vous choisissez ou la copier à youshe@1010: partir de la fenêtre qui apparait directement dans le fichier youshe@1010: authorized_keys. youshe@1010: youshe@1010: youshe@1010: Utiliser un agent d'authentification youshe@1010: youshe@1010: Un agent d'authentification est un démon qui youshe@1010: enregistre les mots de passe en mémoire (il oublira ainsi les mots de andre@1019: passe si vous vous déconnectez et reconnectez). Un client ssh sera averti youshe@1010: si un tel agent est en fonctionnement, et lui demandera un mot de youshe@1010: passe. S'il n'y a pas d'agent en fonctionnement, ou si l'agent ne youshe@1010: connaît pas le mot de passe nécessaire, vous aurez à taper votre mot youshe@1010: de passe chaque fois que Mercurial tente de communiquer avec un andre@1019: serveur en votre nom (ex. lorsque vous faite un pull ou un push andre@1019: de changements). andre@1019: andre@1019: L'inconvénient de sauvegarder les mots de passes dans youshe@1010: un agent est qu'il est possible pour un attaquant bien préparé de youshe@1010: retrouver le mot de passe clair, dans certains cas, même si votre youshe@1010: système a été redémarré. Vous devriez vous faire votre propre youshe@1010: jugement pour savoir si ce risque est acceptable. Ceci vous exempte youshe@1010: certainement d'un tas de répétitions. bos@559: bos@675: youshe@1010: Sur les systèmes de type Unix, l'agent youshe@1010: est appelé ssh-agent, et est souvent lancé andre@1019: automatiquement pour vous lorsque vous vous connectez. Vous aurez youshe@1010: besoin d'utiliser la commande ssh-add pour youshe@1010: ajouter des mots de passe à l'entrepôt de l'agent. youshe@1010: youshe@1010: andre@1019: Sous Windows, si vous utilisez TortoiseHg, la youshe@1010: commande pageant agit comme un agent. Comme youshe@1010: avec puttygen, vous aurez besoin de télécharger youshe@1010: pageant à partir du site web de youshe@1010: PuTTY et lire sa youshe@1010: documentation. La commande pageant andre@1019: ajoute une icône à votre zone de notification (à droite de la barre andre@1019: de tâches) qui vous permettra de youshe@1010: gérer les mots de passe stockés. youshe@1010: andre@1019: bos@675: bos@675: youshe@1010: bos@559: bos@559: Configuring the server side properly bos@559: bos@584: Because ssh can be fiddly to set up if you're new to it, bos@675: a variety of things can go wrong. Add Mercurial bos@559: on top, and there's plenty more scope for head-scratching. bos@559: Most of these potential problems occur on the server side, not bos@559: the client side. The good news is that once you've gotten a bos@559: configuration working, it will usually continue to work bos@559: indefinitely. bos@559: bos@584: Before you try using Mercurial to talk to an ssh server, bos@559: it's best to make sure that you can use the normal bos@559: ssh or putty command to bos@559: talk to the server first. If you run into problems with using bos@559: these commands directly, Mercurial surely won't work. Worse, bos@559: it will obscure the underlying problem. Any time you want to bos@559: debug ssh-related Mercurial problems, you should drop back to bos@559: making sure that plain ssh client commands work first, bos@559: before you worry about whether there's a bos@559: problem with Mercurial. bos@559: bos@584: The first thing to be sure of on the server side is that bos@559: you can actually log in from another machine at all. If you bos@559: can't use ssh or putty bos@559: to log in, the error message you get may give you a few hints bos@559: as to what's wrong. The most common problems are as bos@559: follows. bos@559: bos@584: If you get a connection refused bos@559: error, either there isn't an SSH daemon running on the bos@559: server at all, or it's inaccessible due to firewall bos@559: configuration. bos@559: bos@584: If you get a no route to host bos@559: error, you either have an incorrect address for the server bos@559: or a seriously locked down firewall that won't admit its bos@559: existence at all. bos@559: bos@584: If you get a permission denied bos@559: error, you may have mistyped the username on the server, bos@559: or you could have mistyped your key's passphrase or the bos@559: remote user's password. bos@559: bos@584: In summary, if you're having trouble talking to the bos@559: server's ssh daemon, first make sure that one is running at bos@559: all. On many systems it will be installed, but disabled, by bos@559: default. Once you're done with this step, you should then bos@559: check that the server's firewall is configured to allow bos@559: incoming connections on the port the ssh daemon is listening bos@559: on (usually 22). Don't worry about more exotic possibilities bos@559: for misconfiguration until you've checked these two bos@559: first. bos@584: If you're using an authentication agent on the client side bos@559: to store passphrases for your keys, you ought to be able to bos@559: log into the server without being prompted for a passphrase or bos@559: a password. If you're prompted for a passphrase, there are a bos@559: few possible culprits. bos@559: bos@584: You might have forgotten to use bos@559: ssh-add or pageant bos@559: to store the passphrase. bos@559: bos@584: You might have stored the passphrase for the bos@559: wrong key. bos@559: bos@584: If you're being prompted for the remote user's password, bos@559: there are another few possible problems to check. bos@559: bos@584: Either the user's home directory or their bos@559: .ssh bos@559: directory might have excessively liberal permissions. As bos@559: a result, the ssh daemon will not trust or read their bos@559: authorized_keys file. bos@559: For example, a group-writable home or .ssh bos@559: directory will often cause this symptom. bos@559: bos@584: The user's authorized_keys file may have bos@559: a problem. If anyone other than the user owns or can write bos@559: to that file, the ssh daemon will not trust or read bos@559: it. bos@559: bos@559: bos@584: In the ideal world, you should be able to run the bos@559: following command successfully, and it should print exactly bos@559: one line of output, the current date and time. bos@559: ssh myserver date bos@559: bos@584: If, on your server, you have login scripts that print bos@559: banners or other junk even when running non-interactive bos@559: commands like this, you should fix them before you continue, bos@559: so that they only print output if they're run interactively. bos@559: Otherwise these banners will at least clutter up Mercurial's bos@559: output. Worse, they could potentially cause problems with bos@701: running Mercurial commands remotely. Mercurial tries to bos@559: detect and ignore banners in non-interactive bos@559: ssh sessions, but it is not foolproof. (If bos@559: you're editing your login scripts on your server, the usual bos@559: way to see if a login script is running in an interactive bos@559: shell is to check the return code from the command bos@559: tty -s.) bos@559: bos@584: Once you've verified that plain old ssh is working with bos@559: your server, the next step is to ensure that Mercurial runs on bos@559: the server. The following command should run bos@559: successfully: bos@580: bos@559: ssh myserver hg version bos@580: bos@584: If you see an error message instead of normal hg version output, this is usually bos@559: because you haven't installed Mercurial to /usr/bin. Don't worry if this bos@559: is the case; you don't need to do that. But you should check bos@559: for a few possible problems. bos@559: bos@584: Is Mercurial really installed on the server at bos@559: all? I know this sounds trivial, but it's worth bos@559: checking! bos@559: bos@584: Maybe your shell's search path (usually set bos@559: via the PATH environment variable) is bos@559: simply misconfigured. bos@559: bos@584: Perhaps your PATH environment bos@559: variable is only being set to point to the location of the bos@559: hg executable if the login session is bos@559: interactive. This can happen if you're setting the path bos@559: in the wrong shell login script. See your shell's bos@559: documentation for details. bos@559: bos@584: The PYTHONPATH environment bos@559: variable may need to contain the path to the Mercurial bos@559: Python modules. It might not be set at all; it could be bos@559: incorrect; or it may be set only if the login is bos@559: interactive. bos@559: bos@559: bos@584: If you can run hg version bos@559: over an ssh connection, well done! You've got the server and bos@559: client sorted out. You should now be able to use Mercurial to bos@559: access repositories hosted by that username on that server. bos@559: If you run into problems with Mercurial and ssh at this point, bos@559: try using the bos@559: option to get a clearer picture of what's going on. bos@559: bos@559: bos@559: Using compression with ssh bos@559: bos@584: Mercurial does not compress data when it uses the ssh bos@559: protocol, because the ssh protocol can transparently compress bos@672: data. However, the default behavior of ssh clients is bos@559: not to request compression. bos@559: bos@584: Over any network other than a fast LAN (even a wireless bos@559: network), using compression is likely to significantly speed bos@559: up Mercurial's network operations. For example, over a WAN, bos@559: someone measured compression as reducing the amount of time bos@559: required to clone a particularly large repository from 51 bos@559: minutes to 17 minutes. bos@559: bos@584: Both ssh and plink bos@559: accept a option which bos@559: turns on compression. You can easily edit your ~/.hgrc to enable compression for bos@675: all of Mercurial's uses of the ssh protocol. Here is how to bos@675: do so for regular ssh on Unix-like systems, bos@675: for example. bos@579: [ui] bos@579: ssh = ssh -C bos@559: bos@675: If you use ssh on a bos@675: Unix-like system, you can configure it to always use bos@675: compression when talking to your server. To do this, edit bos@675: your .ssh/config file bos@675: (which may not yet exist), as follows. bos@675: bos@579: Host hg bos@579: Compression yes bos@579: HostName hg.example.com bos@675: bos@675: This defines a hostname alias, bos@675: hg. When you use that hostname on the bos@675: ssh command line or in a Mercurial bos@675: ssh-protocol URL, it will cause bos@559: ssh to connect to bos@559: hg.example.com and use compression. This bos@559: gives you both a shorter name to type and compression, each of bos@559: which is a good thing in its own right. bos@559: bos@559: bos@675: bos@559: bos@559: Serving over HTTP using CGI bos@559: bos@676: The simplest way to host one or more repositories in a bos@675: permanent way is to use a web server and Mercurial's CGI bos@675: support. bos@675: bos@584: Depending on how ambitious you are, configuring Mercurial's bos@559: CGI interface can take anything from a few moments to several bos@559: hours. bos@559: bos@584: We'll begin with the simplest of examples, and work our way bos@559: towards a more complex configuration. Even for the most basic bos@559: case, you're almost certainly going to need to read and modify bos@559: your web server's configuration. bos@559: bos@559: bos@675: High pain tolerance required bos@675: bos@675: Configuring a web server is a complex, fiddly, bos@675: and highly system-dependent activity. I can't possibly give bos@675: you instructions that will cover anything like all of the bos@675: cases you will encounter. Please use your discretion and bos@675: judgment in following the sections below. Be prepared to make bos@675: plenty of mistakes, and to spend a lot of time reading your bos@675: server's error logs. bos@675: bos@676: If you don't have a strong stomach for tweaking bos@675: configurations over and over, or a compelling need to host bos@675: your own services, you might want to try one of the public bos@675: hosting services that I mentioned earlier. bos@559: bos@559: bos@559: bos@559: Web server configuration checklist bos@559: bos@584: Before you continue, do take a few moments to check a few bos@559: aspects of your system's setup. bos@559: bos@559: bos@675: Do you have a web server installed bos@675: at all? Mac OS X and some Linux distributions ship with bos@675: Apache, but many other systems may not have a web server bos@675: installed. bos@559: bos@584: If you have a web server installed, is it bos@559: actually running? On most systems, even if one is bos@559: present, it will be disabled by default. bos@559: bos@584: Is your server configured to allow you to run bos@559: CGI programs in the directory where you plan to do so? bos@559: Most servers default to explicitly disabling the ability bos@559: to run CGI programs. bos@559: bos@559: bos@584: If you don't have a web server installed, and don't have bos@559: substantial experience configuring Apache, you should consider bos@559: using the lighttpd web server instead of bos@559: Apache. Apache has a well-deserved reputation for baroque and bos@559: confusing configuration. While lighttpd is bos@559: less capable in some ways than Apache, most of these bos@559: capabilities are not relevant to serving Mercurial bos@559: repositories. And lighttpd is undeniably bos@559: much easier to get started with than bos@559: Apache. bos@675: bos@675: bos@559: bos@559: Basic CGI configuration bos@559: bos@584: On Unix-like systems, it's common for users to have a bos@559: subdirectory named something like public_html in their home bos@559: directory, from which they can serve up web pages. A file bos@559: named foo in this directory will be bos@559: accessible at a URL of the form bos@580: http://www.example.com/username/foo. bos@559: bos@584: To get started, find the hgweb.cgi script that should be bos@559: present in your Mercurial installation. If you can't quickly bos@559: find a local copy on your system, simply download one from the bos@559: master Mercurial repository at http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi. bos@559: bos@584: You'll need to copy this script into your public_html directory, and bos@559: ensure that it's executable. bos@579: cp .../hgweb.cgi ~/public_html bos@579: chmod 755 ~/public_html/hgweb.cgi bos@584: The 755 argument to bos@559: chmod is a little more general than just bos@559: making the script executable: it ensures that the script is bos@559: executable by anyone, and that group and bos@559: other write permissions are bos@559: not set. If you were to leave those bos@559: write permissions enabled, Apache's suexec bos@559: subsystem would likely refuse to execute the script. In fact, bos@559: suexec also insists that the bos@559: directory in which the script resides bos@559: must not be writable by others. bos@559: chmod 755 ~/public_html bos@559: bos@559: bos@559: What could <emphasis>possibly</emphasis> go bos@559: wrong? bos@559: hg@677: Once you've copied the CGI script into place, bos@679: go into a web browser, and try to open the URL bos@679: http://myhostname/~myuser/hgweb.cgi, bos@679: but brace yourself for instant failure. bos@679: There's a high probability that trying to visit this URL bos@679: will fail, and there are many possible reasons for this. In bos@679: fact, you're likely to stumble over almost every one of the bos@679: possible errors below, so please read carefully. The bos@679: following are all of the problems I ran into on a system bos@679: running Fedora 7, with a fresh installation of Apache, and a bos@679: user account that I created specially to perform this bos@679: exercise. bos@559: bos@584: Your web server may have per-user directories disabled. bos@559: If you're using Apache, search your config file for a bos@559: UserDir directive. If there's none bos@559: present, per-user directories will be disabled. If one bos@559: exists, but its value is disabled, then bos@559: per-user directories will be disabled. Otherwise, the bos@559: string after UserDir gives the name of bos@559: the subdirectory that Apache will look in under your home bos@559: directory, for example public_html. bos@559: bos@584: Your file access permissions may be too restrictive. bos@559: The web server must be able to traverse your home directory bos@559: and directories under your public_html directory, and bos@559: read files under the latter too. Here's a quick recipe to bos@559: help you to make your permissions more appropriate. bos@579: chmod 755 ~ bos@579: find ~/public_html -type d -print0 | xargs -0r chmod 755 bos@579: find ~/public_html -type f -print0 | xargs -0r chmod 644 bos@559: bos@584: The other possibility with permissions is that you might bos@559: get a completely empty window when you try to load the bos@559: script. In this case, it's likely that your access ori@561: permissions are too permissive. Apache's bos@559: suexec subsystem won't execute a script bos@559: that's group- or world-writable, for example. bos@559: bos@584: Your web server may be configured to disallow execution bos@559: of CGI programs in your per-user web directory. Here's bos@559: Apache's default per-user configuration from my Fedora bos@559: system. bos@579: bos@579: &ch06-apache-config.lst; bos@579: bos@584: If you find a similar-looking bos@559: Directory group in your Apache bos@559: configuration, the directive to look at inside it is bos@559: Options. Add ExecCGI bos@559: to the end of this list if it's missing, and restart the web bos@559: server. bos@559: bos@584: If you find that Apache serves you the text of the CGI bos@559: script instead of executing it, you may need to either bos@559: uncomment (if already present) or add a directive like bos@559: this. bos@559: AddHandler cgi-script .cgi bos@559: bos@584: The next possibility is that you might be served with a bos@559: colourful Python backtrace claiming that it can't import a bos@559: mercurial-related module. This is bos@559: actually progress! The server is now capable of executing bos@559: your CGI script. This error is only likely to occur if bos@559: you're running a private installation of Mercurial, instead bos@559: of a system-wide version. Remember that the web server runs bos@559: the CGI program without any of the environment variables bos@559: that you take for granted in an interactive session. If bos@559: this error happens to you, edit your copy of hgweb.cgi and follow the bos@559: directions inside it to correctly set your bos@559: PYTHONPATH environment variable. bos@559: bos@701: Finally, you are certain to be bos@559: served with another colourful Python backtrace: this one bos@559: will complain that it can't find /path/to/repository. Edit bos@559: your hgweb.cgi script bos@559: and replace the /path/to/repository string bos@559: with the complete path to the repository you want to serve bos@559: up. bos@559: bos@584: At this point, when you try to reload the page, you bos@559: should be presented with a nice HTML view of your bos@559: repository's history. Whew! bos@559: bos@675: bos@559: bos@559: Configuring lighttpd bos@559: bos@584: To be exhaustive in my experiments, I tried configuring bos@559: the increasingly popular lighttpd web bos@559: server to serve the same repository as I described with bos@559: Apache above. I had already overcome all of the problems I bos@559: outlined with Apache, many of which are not server-specific. bos@559: As a result, I was fairly sure that my file and directory bos@559: permissions were good, and that my hgweb.cgi script was properly bos@559: edited. bos@559: bos@584: Once I had Apache running, getting bos@559: lighttpd to serve the repository was a bos@559: snap (in other words, even if you're trying to use bos@559: lighttpd, you should read the Apache bos@559: section). I first had to edit the bos@559: mod_access section of its config file to bos@559: enable mod_cgi and bos@559: mod_userdir, both of which were disabled bos@559: by default on my system. I then added a few lines to the bos@559: end of the config file, to configure these modules. bos@580: userdir.path = "public_html" bos@580: cgi.assign = (".cgi" => "" ) bos@584: With this done, lighttpd ran bos@559: immediately for me. If I had configured bos@559: lighttpd before Apache, I'd almost bos@559: certainly have run into many of the same system-level bos@559: configuration problems as I did with Apache. However, I bos@559: found lighttpd to be noticeably easier to bos@559: configure than Apache, even though I've used Apache for over bos@559: a decade, and this was my first exposure to bos@559: lighttpd. bos@559: bos@559: youshe@1009: bos@559: bos@559: Sharing multiple repositories with one CGI script bos@559: bos@584: The hgweb.cgi script bos@559: only lets you publish a single repository, which is an bos@559: annoying restriction. If you want to publish more than one bos@559: without wracking yourself with multiple copies of the same bos@559: script, each with different names, a better choice is to use bos@559: the hgwebdir.cgi bos@559: script. bos@559: bos@584: The procedure to configure hgwebdir.cgi is only a little more bos@559: involved than for hgweb.cgi. First, you must obtain bos@559: a copy of the script. If you don't have one handy, you can bos@559: download a copy from the master Mercurial repository at http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi. bos@559: bos@584: You'll need to copy this script into your public_html directory, and bos@559: ensure that it's executable. bos@592: bos@580: cp .../hgwebdir.cgi ~/public_html bos@580: chmod 755 ~/public_html ~/public_html/hgwebdir.cgi bos@592: bos@592: With basic configuration out of the way, try to bos@679: visit http://myhostname/~myuser/hgwebdir.cgi hg@677: in your browser. It should bos@559: display an empty list of repositories. If you get a blank bos@559: window or error message, try walking through the list of bos@592: potential problems in . bos@559: bos@584: The hgwebdir.cgi bos@559: script relies on an external configuration file. By default, bos@559: it searches for a file named hgweb.config in the same directory bos@559: as itself. You'll need to create this file, and make it bos@559: world-readable. The format of the file is similar to a bos@559: Windows ini file, as understood by Python's bos@559: ConfigParser bos@559: web:configparser module. bos@559: bos@584: The easiest way to configure hgwebdir.cgi is with a section bos@559: named collections. This will automatically bos@559: publish every repository under the bos@559: directories you name. The section should look like bos@559: this: bos@580: [collections] bos@580: /my/root = /my/root bos@584: Mercurial interprets this by looking at the directory name bos@559: on the right hand side of the bos@559: = sign; finding repositories bos@559: in that directory hierarchy; and using the text on the bos@559: left to strip off matching text from the bos@559: names it will actually list in the web interface. The bos@559: remaining component of a path after this stripping has bos@559: occurred is called a virtual path. bos@559: bos@679: Given the example above, if we have a bos@679: repository whose local path is /my/root/this/repo, the CGI bos@559: script will strip the leading /my/root from the name, and bos@559: publish the repository with a virtual path of this/repo. If the base URL for bos@679: our CGI script is bos@679: http://myhostname/~myuser/hgwebdir.cgi, the bos@679: complete URL for that repository will be bos@679: http://myhostname/~myuser/hgwebdir.cgi/this/repo. bos@559: bos@584: If we replace /my/root on the left hand side bos@559: of this example with /my, then hgwebdir.cgi will only strip off bos@559: /my from the repository bos@559: name, and will give us a virtual path of root/this/repo instead of bos@559: this/repo. bos@559: bos@584: The hgwebdir.cgi bos@559: script will recursively search each directory listed in the bos@559: collections section of its configuration bos@559: file, but it will not recurse into the bos@559: repositories it finds. bos@559: bos@584: The collections mechanism makes it easy bos@559: to publish many repositories in a fire and bos@559: forget manner. You only need to set up the CGI bos@559: script and configuration file one time. Afterwards, you can bos@559: publish or unpublish a repository at any time by simply moving bos@559: it into, or out of, the directory hierarchy in which you've bos@559: configured hgwebdir.cgi to bos@559: look. bos@559: bos@559: bos@559: Explicitly specifying which repositories to bos@559: publish bos@559: bos@584: In addition to the collections bos@559: mechanism, the hgwebdir.cgi script allows you bos@559: to publish a specific list of repositories. To do so, bos@559: create a paths section, with contents of bos@559: the following form. bos@580: [paths] bos@580: repo1 = /my/path/to/some/repo bos@580: repo2 = /some/path/to/another bos@584: In this case, the virtual path (the component that will bos@559: appear in a URL) is on the left hand side of each bos@559: definition, while the path to the repository is on the bos@559: right. Notice that there does not need to be any bos@559: relationship between the virtual path you choose and the bos@559: location of a repository in your filesystem. bos@559: bos@584: If you wish, you can use both the bos@559: collections and paths bos@559: mechanisms simultaneously in a single configuration bos@559: file. bos@559: bos@559: bos@675: Beware duplicate virtual paths bos@675: bos@675: If several repositories have the same bos@675: virtual path, hgwebdir.cgi will not report bos@675: an error. Instead, it will behave unpredictably. bos@559: bos@559: bos@559: bos@675: bos@559: bos@559: Downloading source archives bos@559: bos@584: Mercurial's web interface lets users download an archive bos@559: of any revision. This archive will contain a snapshot of the bos@559: working directory as of that revision, but it will not contain bos@559: a copy of the repository data. bos@559: bos@584: By default, this feature is not enabled. To enable it, bos@559: you'll need to add an allow_archive item to the bos@559: web section of your ~/.hgrc; see below for details. bos@559: bos@559: bos@559: Web configuration options bos@559: bos@584: Mercurial's web interfaces (the hg bos@559: serve command, and the hgweb.cgi and hgwebdir.cgi scripts) have a bos@559: number of configuration options that you can set. These bos@559: belong in a section named web. bos@559: bos@584: allow_archive: Determines bos@559: which (if any) archive download mechanisms Mercurial bos@559: supports. If you enable this feature, users of the web bos@559: interface will be able to download an archive of whatever bos@559: revision of a repository they are viewing. To enable the bos@559: archive feature, this item must take the form of a bos@559: sequence of words drawn from the list below. bos@559: bos@584: bz2: A bos@559: tar archive, compressed using bos@559: bzip2 compression. This has the bos@559: best compression ratio, but uses the most CPU time on bos@559: the server. bos@559: bos@584: gz: A bos@559: tar archive, compressed using bos@559: gzip compression. bos@559: bos@584: zip: A bos@559: zip archive, compressed using LZW bos@559: compression. This format has the worst compression bos@559: ratio, but is widely used in the Windows world. bos@559: bos@559: bos@584: If you provide an empty list, or don't have an bos@559: allow_archive entry at bos@559: all, this feature will be disabled. Here is an example of bos@559: how to enable all three supported formats. bos@580: [web] bos@580: allow_archive = bz2 gz zip bos@559: bos@584: allowpull: bos@559: Boolean. Determines whether the web interface allows bos@559: remote users to hg pull bos@559: and hg clone this bos@559: repository over HTTP. If set to no or bos@559: false, only the bos@559: human-oriented portion of the web interface bos@559: is available. bos@559: bos@584: contact: bos@559: String. A free-form (but preferably brief) string bos@559: identifying the person or group in charge of the bos@559: repository. This often contains the name and email bos@559: address of a person or mailing list. It often makes sense bos@559: to place this entry in a repository's own .hg/hgrc file, but it can make bos@580: sense to use in a global ~/.hgrc if every repository bos@580: has a single maintainer. bos@559: bos@584: maxchanges: bos@559: Integer. The default maximum number of changesets to bos@559: display in a single page of output. bos@559: bos@584: maxfiles: bos@559: Integer. The default maximum number of modified files to bos@559: display in a single page of output. bos@559: bos@584: stripes: bos@559: Integer. If the web interface displays alternating bos@559: stripes to make it easier to visually align bos@559: rows when you are looking at a table, this number controls bos@559: the number of rows in each stripe. bos@559: bos@592: style: Controls the template bos@592: Mercurial uses to display the web interface. Mercurial bos@675: ships with several web templates. bos@675: bos@675: bos@676: coal is monochromatic. bos@675: bos@675: bos@676: gitweb emulates the visual bos@675: style of git's web interface. bos@675: bos@675: bos@676: monoblue uses solid blues and bos@675: greys. bos@675: bos@675: bos@676: paper is the default. bos@675: bos@675: bos@676: spartan was the default for a bos@675: long time. bos@675: bos@675: bos@676: You can bos@592: also specify a custom template of your own; see bos@592: for details. Here, you can bos@592: see how to enable the gitweb bos@592: style. bos@580: [web] bos@580: style = gitweb bos@559: bos@584: templates: bos@559: Path. The directory in which to search for template bos@559: files. By default, Mercurial searches in the directory in bos@559: which it was installed. bos@559: bos@584: If you are using hgwebdir.cgi, you can place a few bos@559: configuration items in a web bos@559: section of the hgweb.config file instead of a bos@580: ~/.hgrc file, for bos@559: convenience. These items are motd and style. bos@559: bos@559: bos@559: Options specific to an individual repository bos@559: bos@584: A few web configuration bos@559: items ought to be placed in a repository's local .hg/hgrc, rather than a user's bos@580: or global ~/.hgrc. bos@559: bos@584: description: String. A bos@559: free-form (but preferably brief) string that describes bos@559: the contents or purpose of the repository. bos@559: bos@584: name: bos@559: String. The name to use for the repository in the web bos@559: interface. This overrides the default name, which is bos@559: the last component of the repository's path. bos@559: bos@559: bos@675: bos@559: bos@559: Options specific to the <command role="hg-cmd">hg bos@559: serve</command> command bos@559: bos@584: Some of the items in the web section of a ~/.hgrc file are only for use bos@559: with the hg serve bos@559: command. bos@559: bos@584: accesslog: bos@559: Path. The name of a file into which to write an access bos@559: log. By default, the hg bos@559: serve command writes this information to bos@559: standard output, not to a file. Log entries are written bos@559: in the standard combined file format used bos@559: by almost all web servers. bos@559: bos@584: address: bos@559: String. The local address on which the server should bos@559: listen for incoming connections. By default, the server bos@559: listens on all addresses. bos@559: bos@584: errorlog: bos@559: Path. The name of a file into which to write an error bos@559: log. By default, the hg bos@559: serve command writes this information to bos@559: standard error, not to a file. bos@559: bos@584: ipv6: bos@559: Boolean. Whether to use the IPv6 protocol. By default, bos@559: IPv6 is not used. bos@559: bos@584: port: bos@559: Integer. The TCP port number on which the server should bos@559: listen. The default port number used is 8000. bos@559: bos@559: bos@675: bos@559: bos@580: Choosing the right <filename bos@580: role="special">~/.hgrc</filename> file to add <literal bos@559: role="rc-web">web</literal> items to bos@559: bos@584: It is important to remember that a web server like bos@559: Apache or lighttpd will run under a user bos@559: ID that is different to yours. CGI scripts run by your bos@559: server, such as hgweb.cgi, will usually also run bos@559: under that user ID. bos@559: bos@584: If you add web items to bos@580: your own personal ~/.hgrc file, CGI scripts won't read that bos@580: ~/.hgrc file. Those bos@672: settings will thus only affect the behavior of the hg serve command when you run it. bos@559: To cause CGI scripts to see your settings, either create a bos@580: ~/.hgrc file in the bos@559: home directory of the user ID that runs your web server, or bos@559: add those settings to a system-wide hgrc file. bos@559: bos@559: bos@559: bos@675: bos@675: bos@675: System-wide configuration bos@675: bos@676: On Unix-like systems shared by multiple users (such as a bos@675: server to which people publish changes), it often makes sense to bos@675: set up some global default behaviors, such as what theme to use bos@675: in web interfaces. bos@675: bos@676: If a file named /etc/mercurial/hgrc bos@675: exists, Mercurial will read it at startup time and apply any bos@675: configuration settings it finds in that file. It will also look bos@675: for files ending in a .rc extension in a bos@675: directory named /etc/mercurial/hgrc.d, and bos@675: apply any configuration settings it finds in each of those bos@675: files. bos@675: bos@675: bos@675: Making Mercurial more trusting bos@675: bos@676: One situation in which a global hgrc bos@675: can be useful is if users are pulling changes owned by other bos@675: users. By default, Mercurial will not trust most of the bos@675: configuration items in a .hg/hgrc file bos@675: inside a repository that is owned by a different user. If we bos@675: clone or pull changes from such a repository, Mercurial will bos@675: print a warning stating that it does not trust their bos@675: .hg/hgrc. bos@675: bos@676: If everyone in a particular Unix group is on the same team bos@675: and should trust each other's bos@675: configuration settings, or we want to trust particular users, bos@675: we can override Mercurial's skeptical defaults by creating a bos@675: system-wide hgrc file such as the bos@675: following: bos@675: bos@675: # Save this as e.g. /etc/mercurial/hgrc.d/trust.rc bos@675: [trusted] bos@675: # Trust all entries in any hgrc file owned by the "editors" or bos@675: # "www-data" groups. bos@675: groups = editors, www-data bos@675: bos@675: # Trust entries in hgrc files owned by the following users. bos@675: users = apache, bobo bos@675: bos@675: bos@675: bos@559:
youshe@1009: bos@559: