2012-03-01 11 views
5

dado un conjunto de cambios c y dado que c contiene fusionar operaciones, me gustaría obtener una lista de todos los conjuntos de cambios que se han combinado y dio lugar a c.TFS2010 - Pista Merges

Por ejemplo:

  • Changeset 1 contiene algunas modificaciones para algunos archivos.
  • Changeset 2 contiene algunas ediciones para algunos otros archivos.
  • Changeset 3 es una combinación de conjuntos de cambios 1 + 2 a una rama padre.

Ahora me gustaría obtener los conjuntos de cambios 1 + 2 de preguntar el conjunto de cambios 3 cuyo conjunto de cambios lo combina.

Quiero hacer esto usando la API TFS. Me encontré con el método versionControlServer.TrackMerges, sin embargo, no entiendo qué ItemIdentifiers espera que sea el método. Lamentablemente, no puedo encontrar un ejemplo de cómo usar este método. Además, no estoy seguro de si esa es realmente la correcta.

Respuesta

9

De acuerdo, me tomó mucho tiempo, pero creo que descubrí cómo hacer esto. Este es el código que se encuentra todos los conjuntos de cambios "padre":

/// <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; 
} 

Editar:

me he dado cuenta de que hay un pequeño "error" en el código anterior, que utiliza para escribir " VersionSpec.Latest "en la consulta, sin embargo:" sería mejor el nuevo ChangesetVersionSpec (changeset.ChangesetId) ", ya que los conjuntos de cambios también se rastrearían una vez que se haya eliminado la rama de origen.

0

creo que esta página por un Ben Clark-Robinson responde a la pregunta original, cómo utilizar los TrackMerges() de la API:

He aquí un ejemplo verificadas:

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

El enlace de arriba está muerto. –

Cuestiones relacionadas