2012-03-01 4 views
5

Учитывая набор изменений с и учитывая, что с содержит операции слияния, я хотел бы получить список всех ревизий, которые были объединены и привели к с.TFS2010 - Track Слияние

Например:

  • 1 содержит набор изменений некоторые изменения для некоторых файлов.
  • Изменения 2 содержат некоторые изменения для некоторых других файлов.
  • Изменения 3 - это слияние наборов изменений 1 + 2 с родительской ветвью.

Теперь я хотел был бы получить изменения 1 + 2 от ask changeset 3, который сменяет его.

Я хочу сделать это с помощью TFS API. Я наткнулся на метод versionControlServer.TrackMerges, но я не понимаю, что должен знать ItemIdentifiers, который должен ожидать этот метод. К сожалению, я не могу найти пример того, как использовать этот метод. Также я не уверен, действительно ли это правильно.

ответ

9

Хорошо, мне потребовалось очень много времени, но я думаю, что узнал, как это сделать. Это код, который будет найти все «родительские» ревизии:

/// <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:

Я просто понял, что есть небольшая «ошибка» в приведенном выше коде, я использовал, чтобы написать " VersionSpec.Latest "в запросе:" new ChangesetVersionSpec (changeset.ChangesetId) "было бы лучше, потому что тогда изменения также будут отслеживаться после того, как ветвь источника будет удалена.

0

Я думаю, что эта страница на Ben Clark-Robinson отвечает на оригинальный вопрос, как использовать TrackMerges (API):

Вот проверенное пример:

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

выше ссылка мертва. –