我必须创建一个在指定日期修改(签出或签入)的文件列表。
我有用户名和他们的工作区名称作为我的函数的参数。
有什么建议吗?
答案 0 :(得分:2)
我认为您希望组合使用VersionControlServer.QueryHistory来确定特定日期和VersionControlServer.QueryWorkspaces之间的文件更改,以获取工作区以提取您的工作文件夹映射我想查询递归历史记录。
我很确定你无法确定特定变更集来自哪个工作区,但没有使用自定义签入策略做一些时髦的事情,以便首先将这些信息放入变更集中。也就是说,我不知道一种方法可以告诉两个变化,而不是同一个开发人员碰巧在两个不同的工作空间上更改它们。那么可能更容易的是找出是否可以删除工作空间要求,只需使用一次调用QueryHistory就可以在特定日期返回特定用户的文件更改?
答案 1 :(得分:2)
这就是我最终做的事情(我只留下了与问题相关的代码):
感谢Martin的指示!
void GetPastTFSChangesByDate()
{
using (TfsTeamProjectCollection tfsServer = new TfsTeamProjectCollection(_tfsServerUri))
{
tfsServer.Authenticate();
if (tfsServer != null)
{
VersionControlServer vcServer = tfsServer.GetService(typeof (VersionControlServer)) as VersionControlServer;
if (vcServer != null)
{
var usersWorkspaces = vcServer.QueryWorkspaces(null, vcServer.AuthorizedUser, Environment.MachineName).ToList();
List<ChangedTFSItem> foundPastChanges = null;
if (_isSearchForPastChangesOn)
{
var allPastChangesets = vcServer.QueryHistory(@"C:\TFS",
VersionSpec.Latest,
0,
RecursionType.Full,
Environment.UserName,
null,
null,
3000,
true,
false).Cast<Changeset>()
.Where(x => x.Committer.Contains(Environment.UserName));
_foundPastChanges = allPastChangesets
.SelectMany(x => x.Changes)
.Where(x => x.Item.CheckinDate.Date == _searchDate.Date) // Check-in date filter.
.DistinctBy(x => x.Item.ServerItem, x => x.Item.ServerItem.GetHashCode())
.Select(x => new ChangedTFSItem()
{
FileName = "Uknown",
LocalItem = "Uknown",
ServerItem = x.Item.ServerItem,
ChangeTypeName = "",
ChangeDate = x.Item.CheckinDate.ToString(),
Workspace = "Uknown"
}).ToList();
//Matching those foundPastChanges to the workspace corresponding file locations.
if (usersWorkspaces.Any())
{
foreach (var item in foundPastChanges)
{
usersWorkspaces.ForEach(ws =>
{
item.LocalItem = ws.GetLocalItemForServerItem(item.ServerItem);
item.Workspace = ws.Name;
});
item.FileName = Path.GetFileName(item.ServerItem);
}
}
}
}
}
}
}