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 degit 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
(pardarcs record --unified
) ; - La commande
darcs test
permet de lancer les tests définis pourdarcs record
; - La commande
darcs rollback
permet maintenant d'annuler des changements anciens sans enregistrer directement de nouveau patch, pardarcs rollback --no-record
; - Prise en charge de GHC 7.4.
Aller plus loin
- Site officiel (517 clics)
- Annonce de la version 2.8 (24 clics)
# Petite question
Posté par JoeltheLion (site web personnel) . Évalué à 4.
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 galbolle . É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 JoeltheLion (site web personnel) . Évalué à 4.
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 galbolle . É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 utiliserdarcs replace
.[^] # Re: Petite question
Posté par JoeltheLion (site web personnel) . Évalué à 4. Dernière modification le 27 avril 2012 à 12:53.
Merci pour tous ces éclaircissements!
[^] # Re: Petite question
Posté par Jean-Baptiste Mayer . É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 galbolle . É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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.