0

我要做的是找到在特定时间范围内推入我的测试 TFS 团队项目的所有 .sql 脚本,然后获取查看文件的链接或下载我的工作区外的副本。所以我不需要最新的。这将让应用程序查看在特定时间范围内执行的所有特定的 .sql 更改,然后我会将这些文件与分支环境进行比较,以确定复制并针对数据库运行的 .sql。

我一直在获取查看文件或下载文件的链接。我预见到的下载文件的问题是我将下载数百个文件,而我最终会做的是查看每个文件以确定我是否可以针对测试之外的不同环境重新运行 .sql 脚本。

 public void GetChangesets(DataTable files,
                           bool excludeManualDatabaseFiles,
                           bool containsExcludedDerictoriesAndFiles)
    {
        // this gets collection-lvl services, in contrast to TfsConfigurationServer (server-lvl)
        Uri serverUri = new Uri("<insert serverUri>");
        var tpc = new TfsTeamProjectCollection(serverUri);
        var vcs = tpc.GetService<VersionControlServer>();

        DateTime testDate;
        DateTime.TryParse("2017-07-01", out testDate);

        VersionSpec fromDateVersion = new DateVersionSpec(testDate);
        VersionSpec toDateVersion = new DateVersionSpec(DateTime.Now);

        vcs.QueryRootBranchObjects(RecursionType.Full);

        string teamProjectName = "<insert team project name>";
        TeamProject[] tps = new TeamProject[]
        {
            vcs.GetTeamProject(teamProjectName)
        };

        DataTable returnedChangesetDetail = new DataTable();
        // Step 1: THIS WORKS
        returnedChangesetDetail.Columns.Add("FileName");
        // Step 2: THIS DOES NOT WORK, this is currently empty !!!!!!
        returnedChangesetDetail.Columns.Add("Uri");


        foreach(TeamProject tp in tps)
        {
            IEnumerable changesets = vcs.QueryHistory(string.Concat("$/", tp.Name, "/Test/SQL"), 
                VersionSpec.Latest,
                deletionId: 0,
                recursion: RecursionType.Full,
                user: null,
                versionFrom: fromDateVersion,
                versionTo: toDateVersion,
                maxCount: int.MaxValue,
                includeChanges: true,
                slotMode: true);



            foreach(Changeset changeset in changesets)
            {

                foreach(Change change in changeset.Changes)
                {
                    string fileName = change.Item.ServerItem;
                    // I think this would be it but its not an accessible link, do I add/remove
                    // something to make this a Uri?
                    //var artifactUrui = change.Item.ArtifactUri; 

                    // Step 1: WORKING
                    lstbxFileNames.Items.Add(fileName);

                 }
            }

        }

    }

我希望评论能解释我在寻找什么。这将是一个非开发但技术用户能够查看其环境中所需更改的应用程序。他们将需要审查大约 100 个文件,我认为 Uri 将是他们查看更改的一种简单方法,然后选择他们需要的文件,同时忽略步骤 1 中发现但确定不需要的更改。

4

1 回答 1

0

没有文件的下载地址。

如果您的 TFS 版本是 TFS 2015 或更高版本,您可以使用版本控制 Items REST API链接(确保当前用户有权访问目标文件)

否则,您可以提供带有路径和版本(日期)参数的按钮/超链接,然后使用DownloadFile方法下载文件(临时文件)并将内容流(逐流读取内容)发送到客户端,让用户保存到本地机器在按钮/超链接点击事件中

于 2017-07-11T02:39:17.643 回答