Sortie de darcs 2.8

Posté par . Édité par geh, Nils Ratusznik, Nÿco, Xavier Claude et tuiu pol. Modéré par tuiu pol. Licence CC by-sa
Tags : aucun
27
27
avr.
2012
Gestion de versions

La dernière version de darcs, système de gestion de version intelligent et simple d'utilisation, est disponible depuis le 23 avril dernier. Il s'agit de la tant attendue version 2.8. Par rapport à git ou mercurial, darcs est plus simple d'utilisation, mais sur de gros dépôts, il peut souffrir de problèmes de performances. C'est grâce à sa théorie des patches, une vision différente des concepts de la gestion de version, qu'il peut proposer un mode de travail plus libre, et une interface plus simple.

Concrètement, les différences avec les gestionnaires de versions décentralisés « classiques » comme git, mercurial ou bazaar sont les suivantes :

  • Une représentation sémantique et non chronologique des changements ;
  • Une gestion intégrée du picorage (cherry-picking) des changements ;
  • Une interface interactive par défaut uniforme pour toutes les commandes.

Les nouveautés de la version 2.8 sont principalement :

  • Optimisation de la commande annotate et simplification de son format de sortie (annotate est l'équivalent de git blame et permet, pour chaque ligne, d'afficher le commit qui l'a modifié) ;
  • La commande obliterate -O permet de supprimer un patch du dépôt tout en le stockant dans un fichier ;
  • L'interface de revert permet d'éditer chaque bloc de texte à défaire (permettant par exemple de défaire, parmi deux lignes contiguës, seulement l'une d'elles).

En détail, on trouve aussi les changements suivants :

  • La possibilité d'enlever des changements d'un patch enregistré mais non diffusé (amend-record --unrecord) ;
  • La possibilité d'enregistrer un patch malgré des tests qui échouent ;
  • La possibilité de créer des dépôts sans répertoire de travail (pour un dépôt miroir ou consacré à la diffusion de changements) ;
  • Les commandes record, unrecord, revert et unrevert affichent les changements comme diff --unified (par darcs record --unified) ;
  • La commande darcs test permet de lancer les tests définis pour darcs record ;
  • La commande darcs rollback permet maintenant d'annuler des changements anciens sans enregistrer directement de nouveau patch, par darcs rollback --no-record ;
  • Prise en charge de GHC 7.4.
  • # Petite question

    Posté par (page perso) . Évalué à 4.

    Une représentation sémantique et non chronologique des changements

    Je lis avec intérêt les news sur Darcs, et on parle toujours de cette fameuse théorie des patchs et du caractère sémantique des changements. Ma question est la suivante: comment Darcs peut-il interpréter les changements sans connaître le langage de programmation utilisé?

    • [^] # Re: Petite question

      Posté par . Évalué à 10.

      Il n'interprète pas les changements, dont le contenu reste purement syntaxique. En revanche, les changements sont manipulés comme des entités à part entière. Cela permet par exemple d'avoir un type de changement "replace" qui remplace un token par un autre. Lors d'un merge, si on a introduit dans une branche de nouvelles occurrences du token que l'on a remplacé dans l'autre branche, les nouvelles occurrences seront remplacées. La représentation du changement est sémantique: on n'utilise pas diff3 ou autres pour faire les merge, on a défini que le patch de remplacement remplacerait toujours toutes les occurences de 'coin' par 'pan'. C'est en ce sens que les changements sont sémantiques: chacun d'eux à un comportement bien défini dans tout contexte où il est légal de l'appliquer, et les contextes en question sont bien définis.

      • [^] # Re: Petite question

        Posté par (page perso) . Évalué à 4.

        on a défini que le patch de remplacement remplacerait toujours toutes les occurences de 'coin' par 'pan'.

        Mais comment est-ce que tu fais ça? Ca veut dire que tu dois utiliser Darcs au lieu de sed pour faire tes changements? Ou Darcs est "assez intelligent" pour le deviner tout seul? Ou tu le déclares au moment du commit?

        • [^] # Re: Petite question

          Posté par . Évalué à 4.

          En effet, il faut faire le remplacement par darcs replace au lieu de sed. darcs replace ne commite (record dans le jargon darcs) pas le changement immédiatement, il fait juste le remplacement dans le répertoire de travail, et modifie un fichier qui va bien pour qu'au prochain record, darcs sache qu'il s'agit d'un remplacement, et pas d'une édition normale. On pourrait imaginer détecter ça automatiquement, mais à l'usage, c'est pas gênant de devoir utiliser darcs replace.

    • [^] # Re: Petite question

      Posté par . Évalué à 4.

      La représentation sémantique revient à se demander "Puis-je appliquer ces 2 patches dans n'importe quel ordre et obtenir le même résultat?". Si oui, les deux patches commutent et sont donc indépendants.
      Sinon, les patches ne commutent pas, il faut alors les appliquer dans l'ordre prévu, et donc le patch 2 dépend du patch 1.

      Au moment de récupérer (ou envoyer) des changements, on peut choisir les patches disponibles individuellement, et récupérer/envoyer automatiquement les patches prérequis.

      Au cours d'un merge, les deux jeux de (nouveaux) patches sont comparés, s'ils commutent pas de problème, sinon il y a conflit.

      Au final la représentation sémantique sert juste à supporter le picorage tout en assurant la cohérence des changements.

  • # Comparaison avec git/hg

    Posté par . Évalué à 5.

    Cette page du wiki darcs résume les différences avec git, hg ou bzr, qui ont une vision chronologique des changements.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.