2012-03-01 14 views
5

dato un insieme di modifiche c e dato che c contiene le operazioni di unione, vorrei ottenere un elenco di tutti i gruppi di modifiche che sono state fuse e portato a c.TFS2010 - Track Unisce

Ad esempio:

  • Changeset 1 contiene alcuni modifiche per alcuni file.
  • Il changeset 2 contiene alcune modifiche per alcuni altri file.
  • Il changeset 3 è un'unione di changeset 1 + 2 in un ramo padre.

Ora desidero ottenere i changeset 1 + 2 dal chiedere al changeset 3 che changeset lo unisce.

Voglio farlo utilizzando l'API TFS. Mi sono imbattuto nel metodo versionControlServer.TrackMerges, tuttavia non capisco cosa dovrebbero essere gli ItemIdentifiers che il metodo si aspetta. Sfortunatamente, non riesco a trovare un esempio di come utilizzare questo metodo. Inoltre non sono sicuro che sia davvero quello corretto.

risposta

9

Okay, mi ci è voluto molto tempo, ma penso di aver scoperto come farlo. Questo è il codice che troveranno tutte le "madre" di modifiche:

/// <summary> 
/// Gets the changesets which have resulted in the given changeset due 
/// to a merge operation. 
/// </summary> 
/// <param name="changeset">The changeset.</param> 
/// <param name="versionControlServer">The version control server.</param> 
/// <returns> 
/// A list of all changesets that have resulted into the given changeset. 
/// </returns> 
public static List<Changeset> GetMergedChangesets(Changeset changeset, VersionControlServer versionControlServer) 
{ 
    // remember the already covered changeset id's 
    Dictionary<int, bool> alreadyCoveredChangesets = new Dictionary<int, bool>(); 

    // initialize list of parent changesets 
    List<Changeset> parentChangesets = new List<Changeset>(); 

    // go through each change inside the changeset 
    foreach(Change change in changeset.Changes) 
    { 
     // query for the items' history 
     var queryResults = versionControlServer.QueryMergesExtended(
           new ItemSpec(change.Item.ServerItem, RecursionType.Full), 
           new ChangesetVersionSpec(changeset.ChangesetId), 
           null, 
           null); 

     // go through each changeset in the history 
     foreach (var result in queryResults) 
     { 
      // only if the target-change is the given changeset, we have a hit 
      if (result.TargetChangeset.ChangesetId == changeset.ChangesetId) 
      { 
       // if that hit has already been processed elsewhere, then just skip it 
       if (!alreadyCoveredChangesets.ContainsKey(result.SourceChangeset.ChangesetId)) 
       { 
        // otherwise add it 
        alreadyCoveredChangesets.Add(result.SourceChangeset.ChangesetId, true); 
        parentChangesets.Add(versionControlServer.GetChangeset(result.SourceChangeset.ChangesetId)); 
       } 
      } 
     } 
    } 

    return parentChangesets; 
} 

Edit:

ho capito che c'è un piccolo "bug" nel codice di cui sopra, ho usato per scrivere " VersionSpec.Latest "nella query, tuttavia:" new ChangesetVersionSpec (changeset.ChangesetId) "sarebbe meglio, perché quindi i changeset sarebbero tracciati anche una volta che il ramo di origine è stato cancellato.

0

Penso questa pagina da un Ben Clark-Robinson risponde alla domanda iniziale come utilizzare le TrackMerges() API:

Ecco un esempio verificati:

using tfvcc = Microsoft.TeamFoundation.VersionControl.Client; 

var sourcePath = "$/projectName/branchObjectName1"; 
var targetPath = "$/projectName/branchObjectName2"; 

versionCtl.TrackMerges(
    sourceChangesetIds: new[] { 1000 }, 
    sourceItem: new tfvcc.ItemIdentifier(sourcePath), 
    targetItems: new[] { new tfvcc.ItemIdentifier(targetPath) }, 
    pathFilter: null) 
+0

Il link qui sopra è morto. –