TFS2010 - Отслеживание слияний - PullRequest
5 голосов
/ 01 марта 2012

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

Например:

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

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

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

Ответы [ 2 ]

9 голосов
/ 01 марта 2012

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

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

Редактировать:

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

1 голос
/ 27 марта 2015

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

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

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)
...