2009-07-23 3 views
1

Nous avons un certain nombre de projets hérités qui ont été récemment ajoutés au contrôle de version TFS. Maintenant le problème que nous avons est que chacun de nos projets contient des copies de code commun qui a été modifié et maintenu séparément les uns des autres.Comment faire pour comparer le code source à travers les projets TFS

Existe-t-il un moyen de comparer la source d'une solution dans TFS à la source dans une autre solution sur le même serveur TFS? - Je peux spécifier quels dossiers et fichiers comparer.

Restructurer le dépôt ou effectuer un refactoring majeur de la solution n'est pas une option pour le moment en raison de la taille et de la nature des solutions.

Je suis également intéressé par toutes les API qui existent pour potentiellement automatiser ce processus.

Merci!

Répondre

3

c: \ temp> tf dossierdiff /?

TF - Team Foundation Version Control Tool 
Copyright (c) Microsoft Corporation. All rights reserved. 

Displays a visual representation of the differences between files in two server 
folders, in a server folder and a local folder, or in two local folders. 

tf folderdiff [sourcePath] targetPath [/recursive] [/noprompt] 
       [/server:serverName:port] [/filter:filter] 
       [/filterLocalPathsOnly] 
       [/view:same,different,sourceOnly,targetOnly] 

C: \ temp> tf folderdiff 1 2/noprompt

=========================================================================== 
Items That Exist Only in C:\temp\1 
=========================================================================== 

C:\temp\1\baz 

=========================================================================== 
Items That Exist Only in C:\temp\2 
=========================================================================== 

C:\temp\2\bar 

=========================================================================== 
Show Items That Have Different Contents 
=========================================================================== 

C:\temp\1\quux - 
    C:\temp\2\quux 

=========================================================================== 
Summary: 1 folders, 4 files, 1 source, 1 target, 1 different, 0 with errors 
=========================================================================== 

Edit: si ce n'était pas évident, la vue par défaut est sourceOnly + targetOnly + différent. J'ai eu un fichier nommé "foo" avec le même contenu dans les deux dossiers.

Je réalise qu'un outil de ligne de commande n'est pas une API en soi, mais malheureusement c'est la meilleure option ici. Sinon, vous devez explorer l'arborescence vous-même: il n'y a pas de diff dans l'API de contrôle de version. Tout ce que vous obtenez est un plus de 15 méthodes déroutantes qui fonctionnent sur des éléments individuels. Du côté positif, si tous les fichiers que vous voulez comparer vont être archivés, cela signifie que vous pouvez faire le calcul sans aucune E/S disque coûteuse. (TFS stocke un hachage du contenu de chaque fichier). Exemple rapide Powershell:

function Compare-TfsDir([string] $dir1, [string] $dir2, [switch] $includeEqual) 
{ 
    $dir1 = $dir1.ToLower() 
    $dir2 = $dir2.ToLower()  
    filter Decorate($dir) 
    { 
     $_ | add-member noteproperty RelativePath $_.ServerItem.ToLower().Replace($dir, "") -passthru | 
      add-member noteproperty HashString ($_.HashValue | %{ "{0:X2}" -f $_ } | join-string) -passthru 
    } 

    $items1 = $tfs.vcs.GetItems($dir1, $tfs.VCS_RecursionType::Full).Items | Decorate $dir1 
    $items2 = $tfs.vcs.GetItems($dir2, $tfs.VCS_RecursionType::Full).Items | Decorate $dir2 

    $dirComp = compare -IncludeEqual -Property RelativePath $items1 $items2  
    "---Tree Comparison---" 
    $dirComp | ? { $_.SideIndicator -ne "==" } | ft -auto RelativePath, SideIndicator 

    $both = $dirComp | ? { $_.SideIndicator -eq "==" } | % { $_.RelativePath } | Linq-ToSet  
    filter InBoth { if ($both.Contains($_.RelativePath)) {$_} } 
    $contentComp = compare -inc:$includeEqual -Property HashString, RelativePath ` 
          ($items1 | InBoth) ($items2 | InBoth) 

    "---Content Comparison---" 
    $contentComp | ? { $_.SideIndicator -ne "<=" } | ft -auto RelativePath, SideIndicator 
}  

Malheureusement, faire quelque chose comme cela prendrait 5X autant de lignes de code si vous avez besoin pour soutenir diffs locale vs serveur.

+0

Votre code ne fonctionne pas. Par exemple: linq-ToSet n'est pas une cmdlet. – pabrams