Differences between revisions 2 and 3
Revision 2 as of 2009-11-17 19:11:22
Size: 6116
Editor: ÉricAraujo
Comment: Some typo and style fixes
Revision 3 as of 2009-11-17 19:14:05
Size: 6113
Editor: ÉricAraujo
Comment: Forgot one
Deletions are marked like this. Additions are marked like this.
Line 159: Line 159:
 * Ceci pourrait être assez facile d'étendre cette fonctionnalité pour supporter les sous dépôts non natifs, depuis d'autres systèmes tels que Git ou Subversion.  * 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.

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.

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.


CategoryFrench

Frenchsubrepos (last edited 2009-11-17 19:14:05 by ÉricAraujo)