Sous-dépôts
(Cette page est une traduction de l'original en anglais : subrepos)
Cette fonctionnalité est considérée comme expérimentale pour Mercurial 1.3 est est sujette à subir des changements
Les sous-dépôts sont une fonctionnalité qui vous permet de traiter avec une collection de dépôts comme un groupe. Ceci vous permettra de cloner, committer, faire des push ou des pull sur des projets et leurs librairies associées comme un groupe.
Contents
Usage basique
Commencement
Pour débuter avec l'utilisation des sous-dépôts, vous avez besoin de deux dépôts, un dépôt principal (main) et un dépôt imbriqué (nested) :
$ hg init main $ cd main $ hg init nested $ echo test > nested/foo $ hg -R nested add nested/foo
Maintenant, nous allons marquer "nested" comme étant un sous-dépôt en créant une entrée pour lui dans le fichier spécial .hgsub. Le premier 'nested' est le chemin d'accès dans notre répertoire de travail, et le second est une URL ou un chemin d'où faire les pull. Ici, nous allons simplement faire des pull depuis 'nested' en utilisant un chemin relatif à notre répertoire main. Ceci signifie que 'n'importe qui pouvant accéder à notre dépôt main peut accéder à notre dépôt nested en suivant nested sur ce chemin'.
$ echo nested = nested > .hgsub $ hg add .hgsub
Committer
Lorsque nous commitons, Mercurial va tenter de commiter récursivement dans tous les sous dépôts-préalablement définis, puis d'enregistrer leur état résultant dans un fichier spécial .hgsubstate :
$ hg ci -mtest committing subrepository nested $ cat .hgsubstate 3f68b2f93426b6966b604536037b5d325ba00741 nested
Structure du répertoire
A ce point de notre exemple, nous avons la structure de répertoires suivante :
main/ .hg/ .hgsub .hgsubstate nested/ .hg/ foo
Avec .hgsub contenant
nested = nested
et .hgsubstate contenant
3f68b2f93426b6966b604536037b5d325ba00741 nested
Mise à jour
Chaque fois qu'une nouvelle version de Mercurial rencontre ce fichier .hgsubstate en mettant à jour votre répertoire de travail, il va tenter de faire un pull des sous-dépôts spécifiés et les mettre à jour à l'état approprié :
$ cd .. $ hg clone main main2 updating working directory pulling subrepo nested requesting all changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cat main2/nested/foo test
Les sous-dépôts peuvent aussi contenir leurs propres sous-dépôts et Mercurial opérera de façon récursive autant que nécessaire.
Mise en garde
Comme il s'agit d'une nouvelle fonctionnalité complexe, il y a plusieurs points épineux. Considérez ce code comme expérimental et attendez vous à ce que certains comportements changent.
La plupart des commandes comme diff et status sont pour le moment complètement ignorantes des sous-dépôts. Pour le moment, seulement update, commit et push supportent les sous-dépôts.
De plus, il y a plusieurs comportements qui sont pour le moment très mal définis ou implémentés :
- Update/merge ne peuvent pas pour le moment supprimer totalement les sous dépôts du fait que cela perdrait les changements locaux
- Il n'y a pas de support pour merger à travers des sous dépôts mouvants (renommés/déplacés)
- Les collisions entre fichiers normaux et sous dépôts ne sont pas traités
- Les pulls sur les sous-dépôts sont toujours fait après un délais requis par un update
Faire un update utilise toujours l'URL de .hgsub (ou toute URL par défaut que vous auriez spécifiée dans le .hgrc du sous dépôt), plutôt que le dernier que vous auriez spécifié dans votre dernier pull. Pull -r ne filtrera pas les révisions qui auraient subies un pull dans les sous-dépôts.
- push ignore de même les filtres sur les URL et révisions
- commit ne propage pas certains flags comme -A aux sous dépôts
En interne
Le format de .hgsub utilise le modèle de configuration de hgrc. Ceci réserve un préfixe source de [ pour d'autres extensions (cf. plus bas). De futures extensions devraient aussi utiliser des sections nommées dans ce fichier.
Le format de .hgsubstate est similaire au format des tags, dans la forme <révision><espace><chemin>. Ce fichier n'est pas supposé être édité à la main mais accepte tout format d'identifiant que Mercurial accepte. Il est aussi automatiquement fusionné lorsque nécessaire. Il est séparé de .hgsub pour éviter que les mises à jour automatiques n'embrouillent ce fichier et pour garder l'historique de .hgsub lisible. L'état combiné peut être visualisé avec hg debugsub.
En interne, l'état des sous dépôts est représenté comme un hash du chemin vers la paire (source,révision) qui combine les éléments des deux fichiers ci-dessus. Il existe aussi un nouveau type d'objet subrepo qui expose un ensemble limité d'opérations sur un sous-dépôt. Les sous-dépôts peuvent être traversés ainsi :
# vérifie si les sous-dépôts sont souillés c = repo['tip'] for s in c.substate: subrepo = c.sub[s] print s, subrepo.dirty()
TODO
- Ajouter un support en ligne de commande
- Traiter complètement la suppression de sous dépôts
- Réduire les faux messages de sorties tels que « nothing changed »
- Il devrait être assez facile d'étendre cette fonctionnalité pour permettre des sous-dépôts non natifs, depuis d'autres systèmes tels que Git ou Subversion.