Заметки консультанта

Шамрай Александр Владимирович

Archive for Август 2019

Azure DevOps Rest Api. 23. Создание, удаление и восстановление репозиториев GIT

Posted by Shamrai Alexander на 26 августа, 2019

Для взаимодействия с объектами версионного контроля GIT используется клиент GitHttpClient. В рамках данной статьи мы рассмотрим методы:

  • Создание репозитория.
  • Просмотр свойств репозитория
  • Удаление и восстановление репозитория.

Создание репозитория

Создание нового пустого репозитория выполняется довольно просто через метод CreateRepositoryAsync, в который можно передать всего лишь два параметра: объект GitRepository, в котором указать только имя нового репозитория, и название командного проекта. Пример выполнения:

newRepo = new GitRepository();
newRepo.Name = GitNewRepoName;

newRepo = GitClient.CreateRepositoryAsync(newRepo, TeamProjectName).Result;

Также можно создать ответвленный репозиторий через тот же метод. Для этого необходимо свойства родительского репозитория определить через объект GitRepositoryCreateOptions, который мы будем использовать вместо GitRepository. В этом объекте необходимо указать идентификатор родительского репозитория и ссылку на родительский проект. Далее необходимо вызвать метод CreateRepositoryAsync с дополнительным параметром – ссылку на ветвь для ответвления. Пример использования:

GitRepositoryCreateOptions newGitRepository = new GitRepositoryCreateOptions();
newGitRepository.Name = GitNewRepoName;

GitRepository parent = GitClient.GetRepositoryAsync(TeamProjectName, ParentRepo).Result;

newGitRepository.ParentRepository = new GitRepositoryRef();

newGitRepository.ParentRepository.Id = parent.Id;

newGitRepository.ParentRepository.ProjectReference = parent.ProjectReference;

newRepo = GitClient.CreateRepositoryAsync(newGitRepository, TeamProjectName, «refs/heads/master»).Result;

Просмотр свойств репозитория

Получить репозитории можно несколькими методами:

  1. Методом GetRepositoriesAsync, который возвращает список объектов GitRepository. При этом достаточно передать только имя командного проекта в качестве параметра.
  2. Методом GetRepositoryAsync, который возвращает объект GitRepository необходимого репозитория. Здесь можно передать два параметра: имя командного проекта и имя репозитория.

Пример получения репозитория:

GitRepository GitRepo = GitClient.GetRepositoryAsync(TeamProjectName, RepoName).Result; gitThread.Status = Status;
Console.WriteLine(«—————————————————————«);

Console.WriteLine(» GIT REPO: « + GitRepo.Name);

Console.WriteLine(«—————————————————————«);

Console.WriteLine(«Remote url : « + GitRepo.RemoteUrl);

Console.WriteLine(«Size : « + GitRepo.Size);

Объект GitRepository содержит следующие полезные свойства:

  • Id – идентификатор репозитория
  • Name – имя репозитория
  • RemoteUrl – ссылка на репозиторий
  • Size – размер репозитория
  • И другие.

Удаление и восстановление репозитория

Удаление репозитория выполняется с помощью метода DeleteRepositoryAsync, который принимает один параметр: идентификатор репозитория.

Пример удаление репозитория:

GitRepository gitRepo = GitClient.GetRepositoryAsync(TeamProjectName, RepoName).Result;
GitClient.DeleteRepositoryAsync(gitRepo.Id).Wait();

При этом репозиторий переносится в корзину, которая не доступна из обычной панели управления настройками проекта. Чтоб восстановить удаленный репозиторий необходимо:

  1. Получить содержимое корзины командного проекта через функцию GetRecycleBinRepositoriesAsync.
  2. Восстановить репозиторий через функцию RestoreRepositoryFromRecycleBinAsync, которая принимает следующие параметры: объект GitRecycleBinRepositoryDetails с единственным свойством Deleted, имя командного проекта, идентификатор репозитория.

Пример восстановления репозитория

List<GitDeletedRepository> repos = GitClient.GetRecycleBinRepositoriesAsync(TeamProjectName).Result;
if (repos.Count == 0) return;

var repotorestore = repos.FirstOrDefault(x => x.Name == GitRepoName);

if (repotorestore != null)

{

GitClient.RestoreRepositoryFromRecycleBinAsync(new GitRecycleBinRepositoryDetails { Deleted = false }, TeamProjectName, repotorestore.Id).Wait();

Console.WriteLine(«Restored repo: « + GitRepoName);

}

Полностью удалить репозиторий из корзины можно через функцию DeleteRepositoryFromRecycleBinAsync, которая использует в качестве параметров имя командного проекта и идентификатор репозитория.

Пример очистки корзины проекта:

List<GitDeletedRepository> repos = GitClient.GetRecycleBinRepositoriesAsync(TeamProjectName).Result;
foreach (var repo in repos)

GitClient.DeleteRepositoryFromRecycleBinAsync(TeamProjectName, repo.Id).Wait();

Пример тестового приложения можно посмотреть здесь:

https://github.com/ashamrai/TFRestApi/tree/master/23.TFRestApiAppManageGitRepo

Posted in azure, devops, Microsoft | Отмечено: , , | Leave a Comment »

Azure DevOps Rest Api. 22. Завершение запросов на включение кода

Posted by Shamrai Alexander на 7 августа, 2019

Для взаимодействия с объектами версионного контроля GIT используется клиент GitHttpClient. В рамках данной статьи мы рассмотрим методы:

  • Добавление ревьювера при создании запроса на включение кода.
  • Добавление комментария к запросу на изменение
  • Отклонение запроса на включение кода.
  • Завершение запроса на включение кода и закрытые комментариев.

Добавление ревьювера при создании запроса на включение кода

Создание запроса на включение кода рассматривалось здесь: Создание и просмотр запросов на включение кода. В данном случае, мы создадим новый запрос на включение кода с ревьером. Для того, чтобы добавить ревьюера, необходимо получить его идентификатор через TeamHttpClient. Получение состава команды проекта рассматривалось здесь: Управление командами проекта. Ниже приведен пример получение идентификатора пользователя из главной команды проекта:

List<TeamMember> teamMembers = TeamClient.GetTeamMembersWithExtendedPropertiesAsync(TeamProjectName, TeamProjectName + » Team»).Result;
var users = from x in teamMembers where x.Identity.DisplayName == UserDisplayName select x.Identity.Id;

if (users.Count() == 1) return users.First();

Набор ревьюверов находится в свойстве Reviewers класса GitPullRequest в виде массива объектов IdentityRefWithVote. Пример создания запроса на включение кода с один ревьювером:

GitPullRequest pr = new GitPullRequest();
pr.Title = pr.Description = String.Format(«PR from {0} into {1} «, SourceRef, TargetRef);

pr.SourceRefName = SourceRef;

pr.TargetRefName = TargetRef;

if (ReviewerId != «»)

{

IdentityRefWithVote[] identityRefWithVotes = { new IdentityRefWithVote { Id = ReviewerId } };

pr.Reviewers = identityRefWithVotes;

}

var newPr = GitClient.CreatePullRequestAsync(pr, TeamProjectName, RepoName).Result;

Добавление комментария к запросу на включение кода

Создание потока комментариев выполнятся через класс GitPullRequestCommentThread, который содержит следующие основные свойства:

  • Id – идентификатор потока комментариев
  • Status – состояние потока комментариев
  • Comments – список комментариев. Первый комментарий – это тема потока комментариев, а каждый следующий является ответом по данной теме.

Добавление потока комментариев выполняется через метод CreateThreadAsync, который принимает следующие параметры:

  • commentThread – экземпляр класса GitPullRequestCommentThread, который описывает новый поток комментариев.
  • project – наименование проекта.
  • repositoryId – наименование репозитория GIT.
  • pullRequestId – идентификатор запроса на включение кода.

Пример создания потока комментариев для существующего запроса на включение кода:

GitPullRequest pr = GitClient.GetPullRequestAsync(TeamProjectName, RepoName, PrId).Result;
GitPullRequestCommentThread gitThread = new GitPullRequestCommentThread();

gitThread.Status = Status;

List<Microsoft.TeamFoundation.SourceControl.WebApi.Comment> comments = new List<Microsoft.TeamFoundation.SourceControl.WebApi.Comment>();

comments.Add(new Microsoft.TeamFoundation.SourceControl.WebApi.Comment{ Content = Title });

gitThread.Comments = comments;

var thread = GitClient.CreateThreadAsync(gitThread, TeamProjectName, RepoName, PrId).Result;

Отклонение запроса на включение кода

Для отклонения запроса на включение кода, необходимо обновить его состояние в Abandoned. Состояние запроса на включение кода описывается свойством Status класса GitPullRequest. Набор состояний можно увидеть в перечислении PullRequestStatus. При этом нужно создать новый объект класса GitPullRequest, в котором нужно указать обновляемые свойства. Далее вызывается метод UpdatePullRequestAsync, который принимает следующие параметры:

  • gitPullRequestToUpdate – обновления для существующего запроса на включение кода в виде объекта класса GitPullRequest.
  • project – наименование командного проекта.
  • repositoryId – наименование репозитория GIT.
  • pullRequestId – идентификатор существующего запроса на включение кода.

Пример отклонения запроса на включение кода:

CreateNewCommentThread(TeamProjectName, RepoName, PrId, «Reject this PR»);
GitPullRequest prUdated = new GitPullRequest();

prUdated.Status = PullRequestStatus.Abandoned;

prUdated = GitClient.UpdatePullRequestAsync(prUdated, TeamProjectName, RepoName, PrId).Result;

Завершение запроса на включение кода и закрытые комментариев

Для завершения запроса на включение кода, необходимо обновить состояние его состояние в Succeeded. Выполняется это также, как и при отклонении запроса на включение кода. При этом при завершении запроса на включение кода желательно закрыть активные комментарии, т.к. этого могут требовать политики ветви. Для этого необходимо установить статус Fixed для потока комментариев через метод UpdateThreadAsync. Который принимает следующие параметры:

  • updatedThread – обновления для существующего потока комментариев. При этом в свойство Comments можно добавить дополнительные комментарии.
  • project – наименование командного проекта.
  • repositoryId – наименование репозитория GIT.
  • pullRequestId – идентификатор существующего запроса на включение кода.
  • pullRequesThreadtId – идентификатор существующего потока комментариев.

Пример разрешения потока комментариев и добавление нового комментария в поток:

GitPullRequest pr = GitClient.GetPullRequestAsync(TeamProjectName, RepoName, PrId).Result;
List<GitPullRequestCommentThread> threads = GitClient.GetThreadsAsync(TeamProjectName, RepoName, PrId).Result;

foreach (var thread in threads)

{


if (thread.Status == CommentThreadStatus.Active)

{

GitPullRequestCommentThread updatedThread = new GitPullRequestCommentThread();

updatedThread.Status = CommentThreadStatus.Fixed;

Microsoft.TeamFoundation.SourceControl.WebApi.Comment[] comments = { new Microsoft.TeamFoundation.SourceControl.WebApi.Comment { Content = «Task is completed.» } };

updatedThread.Comments = comments;

updatedThread = GitClient.UpdateThreadAsync(updatedThread, TeamProjectName, RepoName, PrId, thread.Id).Result;

}

}

Для завершения запроса на включение кода также необходимо указать LastMergeSourceCommit, который можно получить из исходного запроса на включение кода:

GitPullRequest pr = GitClient.GetPullRequestAsync(TeamProjectName, RepoName, PrId).Result;
GitPullRequest prUdated = new GitPullRequest();

prUdated.Status = PullRequestStatus.Completed;

prUdated.LastMergeSourceCommit = pr.LastMergeSourceCommit;

prUdated = GitClient.UpdatePullRequestAsync(prUdated, TeamProjectName, RepoName, PrId).Result;

Пример тестового приложения можно посмотреть здесь:

https://github.com/ashamrai/TFRestApi/tree/master/22.TFRestApiAppCompletePullRequests

Posted in azure, devops, Microsoft | Отмечено: , , | Leave a Comment »

 
%d такие блоггеры, как: