GitHub API v3无法获取diff,无法创建代码行注释
解决GitHub API获取PR Diff并创建行注释的问题
你遇到的问题是因为调用了错误的API端点——/pulls/:number/files接口即使带上application/vnd.github.v3.diff的Accept头,返回的是每个文件的patch片段列表,而不是完整的diff内容。要获取能准确定位行号的diff信息,你需要调用拉取请求的主详情端点。
步骤1:正确获取PR的完整Diff
使用/repos/{owner}/{repo}/pulls/{pull_number}端点,并在请求头中指定Accept: application/vnd.github.v3.diff,这样会返回完整的diff文本,包含所有文件的变更块。
示例curl命令:
curl -X GET \ 'https://api.github.com/repos/johnsnow/demo/pulls/20?access_token=some_token' \ -H 'Accept: application/vnd.github.v3.diff'
返回的diff内容会类似这样(以你的README.md为例):
diff --git a/README.md b/README.md index abc123..def456 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Application model for Java 8 -We provide a basic model for JDK 1.8 / Spark based web applications. +AWe provide a basic model for JDK 1.8 / Spark based web applications.
步骤2:从Diff中提取行号信息
diff块中的@@ -1,6 +1,6 @@是定位行号的关键:
-1,6:表示原文件(---标记的文件)的起始行是第1行,共包含6行+1,6:表示新文件(+++标记的文件)的起始行是第1行,共包含6行
你要注释的行在diff中对应的+或-行,就是新文件或原文件的对应行号。比如你示例中的变更行,在新文件里是第3行(前面有标题行和空行)。
步骤3:创建特定行的PR注释
调用/repos/{owner}/{repo}/pulls/{pull_number}/comments端点,根据你要注释的是原文件还是新文件,传入对应的参数:
示例:注释新文件的指定行
curl -X POST \ 'https://api.github.com/repos/johnsnow/demo/pulls/20/comments' \ -H 'Authorization: token some_token' \ -H 'Content-Type: application/json' \ -d '{ "body": "这里是你的注释内容", "commit_id": "7ed12345678911cd0d8c6bf34fa547aaa6eab5b6", "path": "README.md", "line": 3 }'
关键参数说明:
body:你的注释文本commit_id:PR中对应的提交SHA(可以从之前的/files接口返回的sha字段获取)path:目标文件的路径line:新文件中要注释的行号(如果要注释原文件的行,改用original_line参数,并指定original_path)
额外提示
如果你不想处理完整的diff文本,其实从/pulls/:number/files返回的每个文件的patch字段里,也能提取到行号信息(就是那个@@ -x,y +x,y @@的部分),直接用这个patch片段里的行范围来计算目标行号也是可行的,不需要一定要获取完整diff。
内容的提问来源于stack exchange,提问作者elcharrua
相关产品推荐
相关产品推荐

