如何在github上评论PR上的特定行号

如何在github上评论PR上的特定行号,github,github-api,eslint,Github,Github Api,Eslint,我正在尝试编写一个小脚本,可以使用eslint输出对github PRs进行注释 问题是eslint给出了每个错误的绝对行号。 但是GithubAPI需要相对于差异的行号 从github API文档: 要对文件中的特定行进行注释,首先需要 确定差异中的位置。GitHub提供 application/vnd.github.v3.diff介质类型,您可以在 查看请求差异的前一个请求。差异需要 被解释为从文件中的行转换到文件中的某个位置 差异。位置值是从下到下的行数 您要评论的文件中的第一个“@@”大

我正在尝试编写一个小脚本,可以使用eslint输出对github PRs进行注释

问题是eslint给出了每个错误的绝对行号。 但是GithubAPI需要相对于差异的行号

从github API文档:

要对文件中的特定行进行注释,首先需要 确定差异中的位置。GitHub提供 application/vnd.github.v3.diff介质类型,您可以在 查看请求差异的前一个请求。差异需要 被解释为从文件中的行转换到文件中的某个位置 差异。位置值是从下到下的行数 您要评论的文件中的第一个“@@”大块头

紧靠“@@”线下方的一行是位置1,下一行是 位置2,依此类推。文件差异中的位置将继续保持不变 通过空白行和额外的大块增加,直到新的 已到达文件。

因此,如果我想在上图中的新行5上添加注释,那么我需要将12传递给API

我的问题是如何轻松地将eslint在错误消息中给出的新行号映射到githubapi所需的相对行号

到目前为止我都试过了 我使用它将GithubAPI提供的diff转换为json对象

[{
  "chunks": [{
    "content": "@@ -,OLD_TOTAL_LINES +NEW_STARTING_LINE_NUMBER,NEW_TOTAL_LINES @@",
    "changes": [
    {
      "type": STRING("normal"|"add"|"del"),
      "normal": BOOLEAN,
      "add": BOOLEAN,
      "del": BOOLEAN,
      "ln1": OLD_LINE_NUMBER,
      "ln2": NEW_LINE_NUMBER,
      "content": STRING,
      "oldStart": NUMBER,
      "oldLines": NUMBER,
      "newStart": NUMBER,
      "newLines": NUMBER
    }
  }]
}]
我正在考虑下面的算法

  • 创建一个新行号数组,从
    new\u start\u line\u NUMBER
    NEW\u start\u LINE\u NUMBER+每个文件的NEW\u TOTAL\u LINE
  • 从每个数字中减去
    newStart
    ,使其成为另一个数组
    relativeLineNumbers
  • 遍历数组,并为每个删除的行(
    type===“del”
    )增加相应的剩余
    relativeLineNumbers
  • 对于另一个大块头(具有
    @
    的行),减少相应的剩余
    相对枚举数

    • 我找到了解决办法。我没有把它放在这里,因为它涉及简单的循环,没有什么特别的。但不管怎样,现在回答是为了帮助别人

      我打开了一个pull请求来创建类似的情况,如问题中所示

      使用GithubAPI可以获得差异数据

      diff --git a/test.js b/test.js
      index 2aa9a08..066fc99 100644
      --- a/test.js
      +++ b/test.js
      @@ -2,14 +2,7 @@
      
       var hello = require('./hello.js');
      
      -var names = [
      -  'harry',
      -  'barry',
      -  'garry',
      -  'harry',
      -  'barry',
      -  'marry',
      -];
      +var names = ['harry', 'barry', 'garry', 'harry', 'barry', 'marry'];
      
       var names2 = [
         'harry',
      @@ -23,9 +16,7 @@ var names2 = [
       // after this line new chunk will be created
       var names3 = [
         'harry',
      -  'barry',
      -  'garry',
         'harry',
         'barry',
      -  'marry',
      +  'marry', 'garry',
       ];
      
      现在只需将此数据传递到
      diff parse
      模块并进行计算

      var parsedFiles=parseDiff(数据);//差分输出
      parsedFiles.forEach(
      函数(文件){
      var相对线=0;
      file.chunks.forEach(
      函数(块、索引){
      if(index!==0)//每个块的相对行号应该增加
      relativeLine++;//第一行除外(参见图中的rel第16行)
      chunk.changes.forEach(
      职能(变更){
      相对线++;
      console.log(
      改变类型,
      change.ln1?change.ln1:'-',
      change.ln2?change.ln2:'-',
      change.ln?change.ln:'-',
      相对线
      );
      }
      );
      }
      );
      }
      );
      
      这会打印出来

      type    (ln1) old line   (ln2) new line   (ln) added/deleted line    relative line
      normal     2                  2                 -                       1
      normal     3                  3                 -                       2
      normal     4                  4                 -                       3
      del        -                  -                 5                       4
      del        -                  -                 6                       5
      del        -                  -                 7                       6
      del        -                  -                 8                       7
      del        -                  -                 9                       8
      del        -                  -                 10                      9
      del        -                  -                 11                      10
      del        -                  -                 12                      11
      add        -                  -                 5                       12
      normal     13                 6                 -                       13
      normal     14                 7                 -                       14
      normal     15                 8                 -                       15
      normal     23                 16                -                       17
      normal     24                 17                -                       18
      normal     25                 18                -                       19
      del        -                   -                26                      20
      del        -                   -                27                      21
      normal     28                 19                -                       22
      normal     29                 20                -                       23
      del        -                  -                 30                      24
      add        -                  -                 21                      25
      normal     31                 22                -                       26
      
      现在,您可以使用相对行号使用GithubAPI发布注释

      出于我的目的,我只需要新添加的行的相对行号,但是使用上面的表也可以获得删除行的相对行号


      这是我在其中使用的linting项目的链接

      你找到解决办法了吗?@Wärting是的,补充了一个详细的答案。如果您在这方面需要帮助,请告诉我:)