如何从指定工作区中特定日期修改的TFS获取文件列表?

时间:2011-01-24 22:49:18

标签: c# .net tfs

我必须创建一个在指定日期修改(签出或签入)的文件列表。

我有用户名和他们的工作区名称作为我的函数的参数。

有什么建议吗?

2 个答案:

答案 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);
                            }
                        }
                    }
                }
            }
        }
    }