Existe-t-il un système de contrôle de version qui peut afficher les modifications d'une méthode ou d'une fonction spécifique? [fermé]

11

Parfois, ce serait bien de pouvoir dire quelque chose comme:

(git|svn|hg|etc) diff Foo.c:main
(git|svn|hg|etc) log log Foo.c:main

pour voir les modifications apportées à une fonction spécifique dans un fichier source depuis le dernier commit, ou l'historique complet des modifications. Ma question est double:

  1. Existe-t-il quelque chose qui fait cela?
  2. Un tel outil serait-il pratique? Il faudrait faire une simple analyse du code à chaque révision afin de comparer différentes versions de la fonction; les frais généraux seraient-ils trop élevés pour être efficaces?
jches
la source
7
La nécessité de cela semble être le symptôme d'un problème sous-jacent, comme des méthodes trop grandes ou des classes mal organisées, car tout VCS digne de ce nom vous donnera un diff de la classe, et il est assez facile de faire défiler vers le bas pour (ou rechercher) la méthode en question si la classe n'est pas trop grande, et vous pouvez voir le code dans la méthode dans le contexte de la classe entière. En bref, je pense que la résolution de la méthode est trop spécifique.
Robert Harvey
@Robert, c'est un bon point, et je pense que ma motivation à me demander est en partie due au moins à un peu de ballonnement de code. J'ai tracé un bogue à une méthode spécifique et je veux pouvoir voir un journal des modifications apportées à cette méthode uniquement pour voir où elle s'est cassée, et les différences complètes peuvent être légèrement gênantes à rechercher si vous êtes pressé :)
jches
4
Dans le cas très rare où cela est utile, la fonction Blame de TortoiseXXX est assez puissante. Vous pouvez voir quand les dernières modifications ont été apportées à toutes les lignes de la méthode et, en utilisant la marge de droite, continuer à revenir en arrière à travers ces modifications.
pdr

Réponses:

14
  1. Pour autant que je sache, ce n'est pas le cas. On pourrait, mais je ne m'attendrais pas à ce que ce soit la qualité de la production si c'était le cas.
  2. Je ne pense pas que ce soit pratique, mais pas pour la raison que vous avez énumérée. Ce n'est pas pratique car le VCS devrait être sensible au langage pour prendre en charge ce type de fonctionnalité. Essentiellement, vous devez intégrer quelque chose pour analyser le texte de la langue (l'une des grandes étapes d'un compilateur). Cela ajoute beaucoup de poids supplémentaire à votre VCS, qui fait déjà un travail assez complexe.
    Mais plus important encore, vous devrez faire la même chose pour chaque langue que vous souhaitez prendre en charge. Un VCS qui ne vend que du code C ne va pas obtenir beaucoup de traction. Même si vous ignorez toutes les langues obscures, ce serait une entreprise énorme de prendre en charge même les 10 premières langues.

Et comme l'a souligné Robert, être capable de passer immédiatement à une méthode n'est pas un énorme gain par rapport au fait de devoir passer manuellement à la méthode dans l'outil diff.

unholysampler
la source
4
J'appuie le point de dépendance linguistique et d'avoir beaucoup de code redondant
Chander Shivdasani
1
Le même argument pourrait être avancé contre le code mettant en évidence les éditeurs; ils doivent être conscients de la langue et existent bel et bien. Peut-être que le gain est un peu plus élevé (écrans colorés de codez!). Je suis d'accord que l'analyse serait probablement la partie la plus difficile. Il ne serait pas si difficile de prendre en charge les langues les plus courantes, d'autant plus que vous n'avez pas besoin d'analyser complètement le programme.
2011
8

svn fait en fait quelque chose de proche de ce que vous voulez.

Vous pouvez utiliser la commande:

svn diff -x -p program.c 

Le -x -p nom de la fonction «C» s'affiche en haut de l'ensemble de modifications. qui ressemble à ceci.

@@ -97,6 +102,8 @@ int function1(int *x)

Il ne filtre pas mais vous pouvez grep / search pour servir votre objectif de près.

Je suppose que ce n'est que pour «C» (ou C / C ++). Cependant, je suppose que s'il y a une demande, svn le rendrait également disponible pour d'autres langues.

Je ne souscris pas tout à fait à l'argument selon lequel VCS ne devrait PAS faire cela. Après tout, nous voulons que tous les IDE ou éditeurs (comme VIM, EMACS) effectuent une coloration syntaxique spécifique à chaque langue et en prennent en charge plusieurs simultanément. VCS étant un outil de développement, il devrait également prendre en charge de telles fonctionnalités.

Bien sûr, grâce à votre question que je l'ai découverte. Je ne l'avais jamais utilisé auparavant.

Dipan Mehta
la source
1

Sans entrer dans les détails, ... mais vous pouvez consulter le site Semantic Designs et leur gamme de produits. Ils offrent certains outils qui sont sensibles à la langue , pour ainsi dire, faute d'un meilleur terme.

Tour
la source
-1

Pour montrer quelle révision et quel auteur ont modifié en dernier chaque ligne d'un fichier:

git blame filename
Ghita
la source
1
Certes, mais le Q demande un moyen de rechercher les modifications d'une méthode particulière dans un fichier. Imaginez qu'il existe 100 révisions d'un fichier donné, et parmi celles-ci, vous devez trouver celles qui incluent des modifications d'une fonction particulière.
Caleb
Le contrôle de version ne connaît pas les détails de la syntaxe et ne se soucie pas non plus des types de fichiers.
Ghita
-1

ENVY et StORE le font tous les deux. Il est intéressant de noter que, comme avec Monicello que Logan Capaldo a mentionné ci-dessus, ceux-ci sont également destinés à Smalltalk.

stevek_mcc
la source