Подтвердить что ты не робот

Используя API TFS, как я могу найти комментарии, которые были сделаны в обзоре кода?

Я пытаюсь найти способ найти информацию о элементе запроса/ответа кода в TFS2012.

Я могу запросить все элементы запроса/ответа на проверку кода следующим образом:

const string TfsUri = "http://mytfsserver:8080/tfs/Default ProjectCollection";

var tfs = new TfsTeamProjectCollection(new Uri(TfsUri));
var store = tfs.GetService<WorkItemStore>();

var versionStore = tfs.GetService<Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer>();

var queryText = "SELECT [System.Id], 
                 FROM WorkItems 
                 WHERE [System.WorkItemType] = 'Code Review Request' 
                 or [System.WorkItemType] = 'Code Review Response'";
var query = new Query(store, queryText);

var result = query.RunQuery().OfType<WorkItem>();

Это дает мне список типов WorkItem. Когда я перебираю свойство result.FirstOrDefault().Fields, он дает мне полезную информацию о ShelveSet, которая связана с Code Review, "Associated Context". Используя эту информацию, я могу запросить для ShelveSet:

var versionStore = tfs.GetService<VersionControlServer>();
var shelveset = versionStore.QueryShelvesets("someCodeReviewId_xxxx","someUserName");

это дает мне элемент ShelveSet, но тот, где я застреваю.

Я просмотрел пространство имен Microsoft.TeamFoundation.CodeReview, предоставленное библиотеками Microsoft.TeamFoundation.CodeReview.Components и Microsoft.TeamFoundation.CodeReview.Controls, но это также не помогает мне.

Мой вопрос: как я могу найти фактические комментарии, сделанные на ShelveSet во время обзора кода (как общие комментарии, так и комментарии к файлам) через API TFS?

4b9b3361

Ответ 1

У меня нет примеров кода, но в соответствии с это обсуждение, вы должны иметь возможность получить комментарии к обзору кода с функциональностью в Microsoft.TeamFoundation.Discussion.Client пространство имен.

В частности, комментарии доступны через класс DiscussionThread. И вы должны иметь возможность запрашивать обсуждения, используя IDiscussionManager.

Ответ 2

У нас есть новое требование, чтобы вывести комментарии к обзору кода из TFS, и вот краткий пример того, что мы реализовали. Функция workItemId должна запрашиваться с помощью другого метода. Вы даже можете посмотреть его в Visual Studio или через TFS-запрос в пользовательском интерфейсе. Это небольшое подмножество того, что доступно и что мы используем. Я нашел эту ссылку, чтобы быть полезной после перекодировки через MSDN.

 public List<CodeReviewComment> GetCodeReviewComments(int workItemId)
 {
        List<CodeReviewComment> comments = new List<CodeReviewComment>();

        Uri uri = new Uri(URL_TO_TFS_COLLECTION);
        TeamFoundationDiscussionService service = new TeamFoundationDiscussionService();
        service.Initialize(new Microsoft.TeamFoundation.Client.TfsTeamProjectCollection(uri));
        IDiscussionManager discussionManager = service.CreateDiscussionManager();

        IAsyncResult result = discussionManager.BeginQueryByCodeReviewRequest(workItemId, QueryStoreOptions.ServerAndLocal, new AsyncCallback(CallCompletedCallback), null);
        var output = discussionManager.EndQueryByCodeReviewRequest(result);

        foreach (DiscussionThread thread in output)
        {
            if (thread.RootComment != null)
            {
                CodeReviewComment comment = new CodeReviewComment();
                comment.Author = thread.RootComment.Author.DisplayName;
                comment.Comment = thread.RootComment.Content;
                comment.PublishDate = thread.RootComment.PublishedDate.ToShortDateString();
                comment.ItemName = thread.ItemPath;
                comments.Add(comment);
            }
        }

        return comments;
    }

    static void CallCompletedCallback(IAsyncResult result)
    {
        // Handle error conditions here
    }

    public class CodeReviewComment
    {
        public string Author { get; set; }
        public string Comment { get; set; }
        public string PublishDate { get; set; }
        public string ItemName { get; set; }
    }