Мы создаем приложение, которое собирает коммиты, сделанные определенными людьми за определенный месяц, и архивирует их.
Для этого используется клиент TFS из пространства имен TeamFoundation.SourceControl.WebApi
. Он работает довольно хорошо, когда нужно найти сделанные изменения (он находит изменения как TFS, так и GIT), но есть небольшая проблема с некоторыми деталями результата (в частности, с результатами GIT и классом GitUserDate
). Результаты, кажется, имеют локально заданные имена пользователей GIT. Поскольку они ненадежны, нам необходимо сопоставить их с реальными доменными именами для пользователей, которые сделали последние коммиты на сервер. В целом, для каждого коммита должен быть только один автор (вероятность того, что кто-то имел несколько авторов, работающих над локальным репозиторием до того, как будет сделан коммит на сервер, чрезвычайно мала).
Я знаю, что эта информация должна быть в TFS; в базе данных TFS SQL есть таблица IdentityMap
, в которой кажется для хранения искомой информации. Но мы бы предпочли получить эту информацию через API, поскольку прямой доступ к базе данных для этого кажется ... неправильным.
Есть ли способ получить эту информацию из TFS API?
PS. Для полноты картины: мы используем локальную TFS.
РЕДАКТИРОВАТЬ: Вот пример кода:
var criteria = new GitQueryCommitsCriteria();
criteria.FromDate = startDate.ToString();
criteria.ToDate = endDate.ToString();
var commits = gitClient.GetCommitsBatchAsync(criteria, repository.Id).Result;
var itemList = new List<GitFile>();
if (commits.Select(x => x.Committer.Name).Count(x => users.Contains(x)) > 0)
{
foreach (var commit in commits)
{
var changes = gitClient.GetChangesAsync(commit.CommitId, repository.Id).Result;
foreach (var change in changes.Changes)
{
if (change.Item.GitObjectType == GitObjectType.Blob)
{
var item = new GitFile //this is a custom model class to help processing
{
Committer = commit.Committer.Name, //commit.Committer.Email was also attempted
Date = commit.Committer.Date,
RepositoryId = repository.Id,
RepositoryName = repository.Name,
FileName = change.Item.Path,
Item = change.Item
};
itemList.Add(item);
}
}
}
if (itemList.Count > 0)
{
ProcessGitFiles(itemList, startDate, users); //users is a list of internal user domain names for whom files needed to be processed and saved
}
}
Некоторые примеры того, что не так: список users
содержит доменные имена с сервера, и на это мы можем положиться. Commiter.Name
(или Commiter.Email
) - это локальные значения, указанные чьим-либо git config
, и, по крайней мере, в одном случае имя содержало опечатку, в то время как в других случаях электронное письмо было псевдонимом (обычно это пользователь нашего Компания будет использовать формат jdoe@domain
, но письма также имеют псевдоним john.doe@domain
).