TFS REST API 中每个提交中修改的代码行。我怎样才能得到?

问题描述 投票:0回答:2

在 TFS API 中仅允许获取修改的文件计数。但需要为其余调用中的每个提交获取每个文件修改的行数(添加/删除)。

azure-devops
2个回答
9
投票

没有正式发布的 REST API 可以做到这一点。但您可以参考这些步骤来实现您的要求。

  1. 获取提交列表以获取提交的commitId。
  2. 获取特定提交的commitId以获取父项值和存储库id(_links>Repository>href末尾的值)(如果您不知道,则使用_links>Changes>href的URL可以获取文件路径)
  3. 通过此 POST 请求获取文件差异
    https://[account].visualstudio.com/[team project name] /_api/_versioncontrol/fileDiff?__v=5&diffParameters=[data 1]&repositoryId=[repository id]

[data 1] 值应采用 JSON 格式并具有以下值(删除空格):

{
    "originalPath":"/index.html",
    "originalVersion":"GC[a parent value, step 2]",
    "modifiedPath":"/index.html(path: step 2)",
    "modifiedVersion":"GC[commit id]",
    "partialDiff":true,
    "includeCharDiffs":true
}

结果包含这个(需要计算

changeType
不等于0的项,2表示删除,1表示添加):

{
    "changeType": 2,
    "mLine": 9,
    "mLines": [],
    "mLinesCount": 0,
    "oLine": 9,
    "oLines": [
      "    <!-- Polyfill(s) for older browsers -->"
    ],
    "oLinesCount": 1
  },
{
    "changeType": 1,
    "mLine": 22,
    "mLines": [
      "      <div>2</div>"
    ],
    "mLinesCount": 1,
    "oLine": 23,
    "oLines": [],
    "oLinesCount": 0
}

您可以使用开发者工具网络捕获来捕获提交的请求 URL(历史记录 > 提交 > 选择提交)。


0
投票

我找到了解决这个问题的方法。

首先向该端点发送请求

$"{_credential.OrganizationName}/{projectId}/_apis/git/repositories/{repositoryId}/items?scopePath={filePath}&versionDescriptor.version={targetBranch}&api-version=7.0"

{filePath} 是更改文件的路径,例如

/后端/服务/src/UserService/Application/Queries/GetUserDetailsByAdvertNo/GetUserDetailsByAdvertNoQueryResult.cs

{targetBranch} 是您要查看文件内容的分支。

您将为此端点发送两个请求。 FilePath 将相同,但对于第一个请求 targetBranch 应该是您的目标分支(develop、master、main),对于第二个请求 targetBranch 应该是您的源分支(您打开哪个分支进行问题)。

现在,您的分支将拥有这两个文件内容。对于 C#,我使用 DiffPlex NuGet 包逐行比较字符串。

       var diffBuilder = new InlineDiffBuilder(new DiffPlex.Differ());
   var diff = diffBuilder.BuildDiffModel(targetCode, sourceCode);

   //string empty var ise contiue

   foreach (var line in diff.Lines)
   {
       if (line.Type == ChangeType.Inserted)
       {
           x.ChangedCode.Add(new ChangedCode
           {
               Code = $"{line.Position} + {line.Text}" //added code.
           });
       }
       else if (line.Type == ChangeType.Deleted)
       {
           x.ChangedCode.Add(new ChangedCode
           {
               Code = $"- {line.Text}" //removed code
           });
       }
   }

现在您将更改线路。

© www.soinside.com 2019 - 2024. All rights reserved.