2010-07-14 2 views
2

J'essaye d'écrire une macro qui va générer une liste en texte brut des fichiers modifiés en fonction de la liste des fichiers dans le volet Modifications en attente mais je n'arrive pas à comprendre comment le faire. L'emplacement du serveur d'un fichier est la propriété qui est formaté comme ceci:Comment puis-je énumérer une liste de fichiers source avec des modifications en attente et obtenir leur emplacement de serveur?

Le plus proche que je peux obtenir ouvre les propriétés de l'élément sélectionné dans le volet, ce qui est très utile:

DTE.ExecuteCommand ("TeamFoundationContextMenus.SourceControlPendingChangesSourceFiles.TfsContextPendingCheckinsPendingCheckinsProperties") 

Edit: est ici tout le code pour la macro que je l'ai jusqu'à présent, les TODOs sont là où je besoin d'aide:

Public Class Pending 

    Public Shared Sub Pending() 
     OutputClear() 
     OutputWriteLine("Files Changed:") 

     Dim outInfo As String = "" 
     DTE.Windows.Item("{2456BD12-ECF7-4988-A4A6-67D49173F564}").Activate() 'Pending Changes - Source Files 

     'TODO: loop through each changed file 
     'TODO: get TFS server location of each file 
     outInfo &= "some file name" 

     OutputWriteLine(outInfo) 
    End Sub 

    ' snip: other supporting functions 

End Class 
+0

Donc, vous avez besoin de savoir comment la carte du chemin du serveur vers le chemin d'accès local pour l'espace de travail actuel? –

+0

Je ne pense pas, ce que je cherche est un moyen d'obtenir le chemin du serveur TFS pour chaque fichier modifié. Je ne suis pas sûr comment énumérer à travers eux pour obtenir cette propriété. – travis

+0

J'ai mis à jour le titre de la question afin qu'il soit plus clair. – travis

Répondre

2

Eh bien, je ne l'ai pas été en mesure de figure sur la façon de le faire avec une macro encore, mais grâce à Bob Hardister on twitter, je peux utiliser cette commande pour obtenir ce que je cherche:

"C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\tf.exe" status $/ProjectName/SubDir/ /recursive 

... mais ce qui fonctionne encore mieux est une ligne de commande application qui utilise ce code:

const string TFSSERVER = "http://TfsServer:8080"; 
static void Main(string[] args) 
{ 
    //http://blogs.msdn.com/b/buckh/archive/2006/03/15/552288.aspx 
    //http://blogs.msdn.com/b/jmanning/archive/2005/12/01/499033.aspx 
    string projectName = args[0]; 
    TeamFoundationServer tfs = new TeamFoundationServer(TFSSERVER); 
    VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 
    PendingSet[] sets = versionControl.GetPendingSets(new String[] { "$/Projects/" + projectName }, RecursionType.Full); 
    Console.WriteLine(versionControl.AuthenticatedUser + " pending changes for " + projectName + ":"); 

    foreach (PendingSet set in sets) 
    { 
     if (set.Type == PendingSetType.Workspace && set.OwnerName == versionControl.AuthenticatedUser) 
     { 
      foreach (PendingChange pc in set.PendingChanges) 
      { 
       Console.WriteLine(pc.ServerItem); 
      } 
     } 
    } 
} 

Je vient d'être ajouté à l'appel EXE compilé dans le menu Outils externes et l'utiliser dans VS là.

Bonus Edit: Voici la version VSS (pas aussi beau):

const string SSDIR = @"\\VssServer\VssShare"; 
static void Main(string[] args) 
{ 
    string projectName = args[0]; 
    string userName = "user"; 

    VSSDatabaseClass vss = new VSSDatabaseClass(); 
    vss.Open(SSDIR + @"\srcsafe.ini", userName, userName); 
    VSSItem sourceItem = vss.get_VSSItem("$/Projects/" + projectName, false); 

    Console.WriteLine(userName + " pending checkins for " + projectName + ":"); 
    int total = GetItems(sourceItem); 
    Console.WriteLine(total.ToString() + " total changes."); 

} 

const int VSSFILE_CHECKEDOUT_ME = 2; 
const int VSSITEM_PROJECT = 0; 
const int VSSITEM_FILE = 1; 
public static int GetItems(IVSSItem originalItem) 
{ 
    int total = 0; 
    foreach (IVSSItem subItem in originalItem.get_Items(false)) 
    { 
     if (subItem.Type == VSSITEM_FILE && subItem.IsCheckedOut == VSSFILE_CHECKEDOUT_ME) 
     { 
      Console.WriteLine(subItem.Spec); 
      total++; 
     } 
     else if (subItem.Type == VSSITEM_PROJECT) 
     { 
      total += GetItems(subItem); 
     } 
    } 
    return total; 
} 
Questions connexes