Existe um sistema de controle de versão que possa mostrar alterações em um método ou função específica? [fechadas]

11

Às vezes, seria bom poder dizer algo como:

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

para ver as alterações feitas em uma função específica em um arquivo de origem desde a última confirmação ou o histórico completo das alterações. Minha pergunta é dupla:

  1. Existe algo que faz isso?
  2. Essa ferramenta seria prática? Teria que fazer uma análise simples do código em cada revisão para comparar diferentes versões da função; a sobrecarga seria demais para ser eficiente?
jches
fonte
7
A necessidade disso parece ser um sintoma de um problema subjacente, como métodos muito grandes ou classes não organizadas adequadamente, pois qualquer VCS que se preze lhe dará um diferencial da classe e é fácil o suficiente para rolar para baixo para (ou procurar) o método em questão se a classe não for muito grande e você poderá ver o código no método dentro do contexto de toda a classe. Em suma, acho que a resolução do método é muito específica.
Robert Harvey
@ Robert, esse é um bom argumento, e acho que minha motivação para pensar é em parte devido a pelo menos um pequeno inchaço no código. Eu rastreei um bug para um método específico e quero poder ver um log de alterações nesse método para ver onde ele quebrou, e as diferenças completas podem ser um pouco inconvenientes para pesquisar se você estiver com pressa :)
jches
4
Para o caso muito raro em que isso é útil, o recurso de culpa do TortoiseXXX é bastante poderoso. Você pode ver quando as últimas alterações foram feitas em todas as linhas no método e, usando a margem certa, continue voltando atrás nessas alterações.
Pd

Respostas:

14
  1. Tanto quanto eu sei, isso não acontece. Pode-se, mas eu não esperaria que fosse qualidade de produção, se tivesse.
  2. Não acho que seja prático, mas não pelo motivo que você listou. Não é prático porque o VCS precisaria ter conhecimento de idioma para suportar esse tipo de funcionalidade. Essencialmente, você precisaria incorporar algo para analisar o texto do idioma (uma das grandes etapas de um compilador). Isso adiciona muito peso extra ao seu VCS, que já está fazendo um trabalho bastante complexo.
    Mais importante, porém, você precisaria fazer o mesmo para todos os idiomas que deseja oferecer suporte. Um VCS cujo ponto de venda funciona apenas no código C não terá muita tração. Mesmo se você ignorar todos os idiomas obscuros, seria uma tarefa enorme oferecer suporte até aos 10 principais idiomas.

E, como Robert apontou, ser capaz de pular imediatamente para um método não é um grande ganho em ter que pular manualmente para o método na ferramenta diff.

unholysampler
fonte
4
I segundo o ponto de dependência linguagem e ter um monte de código redundante
Chander Shivdasani
1
O mesmo argumento pode ser feito contra o código que destaca os editores; eles devem estar cientes da linguagem e realmente existem. Talvez a recompensa seja um pouco maior (telas coloridas de codez!). Concordo que a análise provavelmente seria a parte mais difícil. Porém, não seria tão difícil oferecer suporte aos idiomas mais comuns, especialmente porque você não precisa analisar completamente o programa.
jches
8

svn realmente faz algo parecido com o que você quer.

Você pode usar o comando:

svn diff -x -p program.c 

O -x -p nome da função fornece 'C' na parte superior do conjunto de alterações. que se parece com isso.

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

Ele não filtra, mas você pode grep / search para servir de perto o seu propósito.

Eu acho que isso é apenas para 'C' (ou C / C ++). No entanto, eu acho que, se houver uma demanda, o svn também estará disponível para outros idiomas.

Não concordo com o argumento de que o VCS NÃO deve fazer isso. Afinal, queremos que todos os IDEs ou editores (como VIM, EMACS) realcem a sintaxe, que é específica para cada idioma e suporta muitos simultaneamente. Portanto, o VCS, sendo uma ferramenta de desenvolvedor, também deve suportar essa funcionalidade.

Claro, graças à sua pergunta que eu a descobri. Eu nunca tinha usado antes.

Dipan Mehta
fonte
1

Sem entrar em detalhes, ... mas você pode conferir o site Semantic Designs e sua gama de produtos. Eles oferecem algumas ferramentas sensíveis à linguagem , por assim dizer, na falta de um termo melhor.

Torre
fonte
-1

Para mostrar qual revisão e autor modificaram pela última vez cada linha de um arquivo:

git blame filename
Ghita
fonte
1
Verdade, mas o Q pede uma maneira de procurar alterações em um método específico dentro de um arquivo. Imagine que há 100 revisões em um determinado arquivo e, dentre essas, você precisa encontrar as que incluem alterações em uma função específica.
Caleb
O controle de versão não conhece detalhes de sintaxe e também não se importa com os tipos de arquivos.
Ghita
-1

ENVY e armazenar tanto fazer isso. É interessante que, assim como Monicello, que Logan Capaldo mencionou acima, também é para Smalltalk.

stevek_mcc
fonte