对于任何拉取请求,GitHub 提供三种类型的评论视图:针对整个拉取请求的评论、针对拉取请求中特定行的评论 以及 针对拉取请求中特定提交的评论。
这些类型的评论都通过不同的 GitHub API 部分进行处理。在本指南中,我们将探讨如何访问和操作每种类型的评论。对于每个示例,我们将使用 在 "octocat" 存储库中创建的这个示例拉取请求。与往常一样,示例可以在 我们的平台示例存储库 中找到。
拉取请求评论
要访问拉取请求上的评论,您将使用 管理问题的端点。这乍一看可能令人费解。但一旦您理解拉取请求只是带有代码的问题,使用这些端点在拉取请求上创建评论就变得有意义了。
我们将通过使用 Octokit.rb 创建一个 Ruby 脚本,来演示如何获取拉取请求评论。您还需要创建一个 个人访问令牌。
以下代码将帮助您开始使用 Octokit.rb 访问拉取请求中的评论。
require 'octokit'
# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below
client = Octokit::Client.new :access_token => ENV['MY_PERSONAL_TOKEN']
client.issue_comments("octocat/Spoon-Knife", 1176).each do |comment|
username = comment[:user][:login]
post_date = comment[:created_at]
content = comment[:body]
puts "#{username} made a comment on #{post_date}. It says:\n'#{content}'\n"
end
在这里,我们专门调用 API 来获取评论(issue_comments
),并提供仓库名称(octocat/Spoon-Knife
)和我们感兴趣的拉取请求 ID(1176
)。之后,只需遍历评论以获取有关每个评论的信息。
拉取请求中的行级评论
在差异视图中,您可以针对拉取请求中单个更改的特定方面开始讨论。这些评论出现在更改文件中各个行上。此讨论的端点 URL 来自 管理拉取请求审查的端点。
以下代码获取了针对所有文件做出的拉取请求评论,给定一个拉取请求编号。
require 'octokit'
# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below
client = Octokit::Client.new :access_token => ENV['MY_PERSONAL_TOKEN']
client.pull_request_comments("octocat/Spoon-Knife", 1176).each do |comment|
username = comment[:user][:login]
post_date = comment[:created_at]
content = comment[:body]
path = comment[:path]
position = comment[:position]
puts "#{username} made a comment on #{post_date} for the file called #{path}, on line #{position}. It says:\n'#{content}'\n"
end
您会注意到它与上面的示例非常相似。此视图与拉取请求评论之间的区别在于对话的重点。针对拉取请求做出的评论应保留用于讨论或关于代码整体方向的想法。作为拉取请求审查的一部分做出的评论应专门处理在文件中实现特定更改的方式。
提交评论
最后一种类型的评论专门针对单个提交。为此,它们使用 管理提交评论的端点。
要检索提交上的评论,您需要使用提交的 SHA1。换句话说,您不会使用与拉取请求相关的任何标识符。以下是一个示例。
require 'octokit'
# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below
client = Octokit::Client.new :access_token => ENV['MY_PERSONAL_TOKEN']
client.commit_comments("octocat/Spoon-Knife", "cbc28e7c8caee26febc8c013b0adfb97a4edd96e").each do |comment|
username = comment[:user][:login]
post_date = comment[:created_at]
content = comment[:body]
puts "#{username} made a comment on #{post_date}. It says:\n'#{content}'\n"
end
请注意,此 API 调用将检索单行评论以及针对整个提交做出的评论。