2012-03-01 27 views
5

Cho một changeset c và cho rằng c chứa sáp nhập hoạt động, tôi muốn để có được một danh sách của tất cả các changesets đã được sáp nhập và kết quả là c.TFS2010 - Theo dõi Hợp nhất nội

Ví dụ:

  • changeset 1 chứa một số chỉnh sửa đối với một số tập tin.
  • Thay đổi 2 chứa một số chỉnh sửa cho một số tệp khác.
  • Thay đổi 3 là kết hợp các thay đổi 1 + 2 thành chi nhánh chính.

Bây giờ tôi muốn nhận được các thay đổi 1 + 2 từ yêu cầu changeset 3 mà changeset hợp nhất nó chứa.

Tôi muốn thực hiện việc này bằng API TFS. Tôi đã xem qua phương thức versionControlServer.TrackMerges, tuy nhiên tôi không hiểu ItemIdentifiers mà phương thức mong đợi sẽ là gì. Thật không may, tôi không thể tìm thấy một ví dụ về cách sử dụng phương pháp này. Ngoài ra tôi không chắc chắn nếu đó thực sự là một trong những chính xác.

Trả lời

9

Được rồi, tôi mất rất nhiều thời gian, nhưng tôi nghĩ tôi đã tìm ra cách để làm điều này. Đây là Bộ luật đó sẽ tìm thấy tất cả các "mẹ" changesets:

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

Tôi chỉ nhận ra rằng có một "lỗi" nhỏ trong đoạn mã trên, tôi sử dụng để viết " VersionSpec.Latest "trong truy vấn, tuy nhiên:" changesetVersionSpec mới (changeset.ChangesetId) "sẽ tốt hơn, bởi vì sau đó các changesets cũng sẽ được theo dõi khi nhánh nguồn đã bị xóa.

0

Tôi nghĩ rằng trang này bằng một Ben Clark-Robinson trả lời cho câu hỏi ban đầu làm thế nào để sử dụng TrackMerges() API:

Dưới đây là một ví dụ xác minh:

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

Liên kết ở trên là đã chết. –

Các vấn đề liên quan